Разрешено ли использовать VkBool32 в качестве константы push?
Я пытаюсь создать VkBool32 в моем коде C++:
VkBool32 myBool = VK_FALSE;
и передать его в GLSL через константу push:
vkCmdPushConstants(..., sizeof(myBool), &myBool);
который получен bool в едином классе хранения:
layout(push_constant) uniform PushConstants
{
bool myBool;
} pushConts;
Первые тесты, кажется, работают и имеют намеченное поведение. Но разрешено ли это Vulkan Spec?
1 ответ
Использование bools для push-констант нормально. Ничто в спецификации не запрещает это, и я использовал это в нескольких примерах.
Если вы посмотрите на читаемый человеком вывод SPIR-V, вы увидите, что они преобразованы в 32-битные целые и, следовательно, выровнены по 32-битным:
GLSL
layout (push_constant) uniform PushConsts {
bool calculateNormals;
} pushConsts;
SPIR-V
430(PushConsts): TypeStruct 40(int)
431: TypePointer PushConstant 430(PushConsts)
432(pushConsts): 431(ptr) Variable PushConstant
433: TypePointer PushConstant 40(int)
Таким образом, если вы, например, передадите структуру, содержащую несколько логических значений, вам придется правильно выровнять (pad) на стороне процессора, прежде чем передавать как константу push.
Что касается стороны SPIR-V, официальная спецификация всегда является хорошей отправной точкой и также содержит подробности о том, как обрабатываются push-константы и как они отличаются.