2017-07-30 11 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

プッシュ定数に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は常に良い出発点であり、プッシュ定数の取り扱い方法とその違いについての詳細も含まれています。

関連する問題