Преобразование дополненной структуры # [repr (align (...))] в & [u8] без вызова UB - PullRequest
0 голосов
/ 09 июля 2020

В GLSL требуется, чтобы vec3 был выровнен по 16-байтовой границе при использовании в однородном блоке. Чтобы представить это требование, у меня есть тип Rust, определенный следующим образом:

#[repr(C, align(16))]
struct UniformVec3([f32; 3]);

Это упрощает создание однородных данных на стороне ЦП без необходимости вручную указывать отступы. Однако, чтобы загрузить данные в графический процессор, структура должна быть преобразована в &[u8], например:

let v = UniformVec3([1.0, 0.0, 0.0]);

unsafe {
    let as_bytes = std::slice::from_raw_parts(
        (&v as *const UniformVec3) as *const u8,
        std::size_of::<UniformVec3>(),
    );

    // do stuff with as_bytes...
}

В существующем виде это поведение undefined, поскольку битовый шаблон четыре байта заполнения не определены. У меня вопрос: есть ли способ инициализировать эту структуру (с ее текущим определением!) Без вызова UB при преобразовании ее в &[u8]? Или мне нужно вставить явное заполнение в структуру, которая будет определена при инициализации?

...