是否允许使用 VkBool32 作为推送常量?
Is it allowed to use a VkBool32 as a push constant?
我正在尝试在我的 C++ 代码中创建一个 VkBool32:
VkBool32 myBool = VK_FALSE;
并通过推送常量将其推送到 GLSL:
vkCmdPushConstants(..., sizeof(myBool), &myBool);
由统一存储中的 bool 接收 class:
layout(push_constant) uniform PushConstants
{
bool myBool;
} pushConts;
第一个测试似乎有效并且具有预期的行为。但 Vulkan 规范允许这样做吗?
使用布尔值作为推送常量是可以的。规范中没有任何内容禁止这样做,我也在一些示例中使用了它。
如果您查看人类可读的 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 始终是一个很好的起点,并且还包含有关如何处理推送常量以及它们有何不同的详细信息。
我正在尝试在我的 C++ 代码中创建一个 VkBool32:
VkBool32 myBool = VK_FALSE;
并通过推送常量将其推送到 GLSL:
vkCmdPushConstants(..., sizeof(myBool), &myBool);
由统一存储中的 bool 接收 class:
layout(push_constant) uniform PushConstants
{
bool myBool;
} pushConts;
第一个测试似乎有效并且具有预期的行为。但 Vulkan 规范允许这样做吗?
使用布尔值作为推送常量是可以的。规范中没有任何内容禁止这样做,我也在一些示例中使用了它。
如果您查看人类可读的 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 始终是一个很好的起点,并且还包含有关如何处理推送常量以及它们有何不同的详细信息。