Разрешено ли использовать 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?

2

Решение

Использование 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 и как они отличаются.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]