2017-07-30 32 views
1

我想在我的C创建一个VkBool32 ++代码:它允许使用VkBool32作为推常量吗?

VkBool32 myBool = VK_FALSE; 

,并推动它通过推常量GLSL:

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

这是由一个统一的存储类中的布尔收到:

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

第一次测试似乎工作,并有预期的行为。但Vulkan Spec允许这么做吗?

+0

VkBool32只是一个uint32_t所以你只是传递了一个32位uint,这绝对是可能的。我不记得它是如何从着色器一侧看起来的,并且最好查看一下bool变量在SPIR-V代码内如何转换。也许它也只是一个32位uint。我会仔细看看的。 – Ekzuzy

回答

2

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

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

因此,如果你eg会传递一个包含多个布尔值的结构,在传递为push常量之前,您必须在CPU端正确对齐(pad)。

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

相关问题