允许使用VkBool32作为推送常量吗?

时间:2017-07-30 13:15:22

标签: c++ glsl vulkan spir-v

我正在尝试在我的C ++代码中创建一个VkBool32:

VkBool32 myBool = VK_FALSE;

并通过推送常量将其推送到GLSL:

vkCmdPushConstants(..., sizeof(myBool), &myBool);

由统一存储类中的bool接收:

layout(push_constant) uniform PushConstants
{
    bool myBool;
} pushConts;

首次测试似乎有效且具有预期的行为。但这是否允许使用Vulkan Spec?

1 个答案:

答案 0 :(得分:3)

使用bool推送常量很好。规范中没有任何内容禁止这一点,我也在一些例子中使用它。

如果您看一下人类可读的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)

所以,如果你是会传递包含多个布尔值的结构,你必须在CPU侧正确对齐(填充),然后才能作为推送常量传递。

至于SPIR-V方面,official spec始终是一个很好的起点,并且还包含有关如何处理推式常量以及它们如何不同的详细信息。