2017-06-29 1 views
1
layout (set = 0, binding = 0) uniform sampler2D sampler; 
layout (set = 0, binding = 0) uniform Test{ 
    mat4 m; 
} test; 

Dies kompiliert mit glslang ohne Fehler. Ich dachte, dass Bindungen innerhalb eines Sets einzigartig sein müssen?Müssen `Bindings` innerhalb eines Sets für eine Uniform eindeutig sein?

Wenn dies tatsächlich erlaubt ist, wie würden Sie Daten an sampler und test senden?

typedef struct VkWriteDescriptorSet { 
    VkStructureType     sType; 
    const void*      pNext; 
    VkDescriptorSet     dstSet; 
    uint32_t       dstBinding; 
    uint32_t       dstArrayElement; 
    uint32_t       descriptorCount; 
    VkDescriptorType     descriptorType; 
    const VkDescriptorImageInfo*  pImageInfo; 
    const VkDescriptorBufferInfo* pBufferInfo; 
    const VkBufferView*    pTexelBufferView; 
} VkWriteDescriptorSet; 

Antwort

2

Neben der Forderung Nicol Bolas zitiert, es gibt ein paar andere relevante Teile:

Die Valid Usage for VkDescriptorSetLayoutCreateInfo sagt:

Die VkDescriptorSetLayoutBinding::binding Mitglieder der Elemente des pBindings Array jeweils unterschiedliche Werte haben müssen.

Das bedeutet, dass Sie kein Layout eines Deskriptorsets haben können, das mehr als eine Variable mit einem bestimmten (set, binding) verwendet. Sie können also auch keinen Deskriptorsatz oder eine Pipeline erstellen, die mehr als eine Variable mit derselben Bindung enthält. Selbst wenn GLSL und SPIR-V allein gültig sind, gibt es keine Möglichkeit, die Variablen zu verwenden oder zu disambiguieren, welche in Vulkan zu verwenden sind.

Abschnitt 13.2.2 Pipeline Layouts sagt:

Alle Ressourcenvariablen statisch in allen Shadern in einer Rohrleitung verwendet wird, muss mit einem deklariert werden (Satz, Binden, arrayElement), die in dem entsprechenden Deskriptorenmenge Layout vorhanden ist, und ist aus einem geeigneten Deskriptor-Typ und beinhaltet die Menge von Shader-Stufen, in der es in stageFlags verwendet wird.

Da diese bindet SPIR-V-Variablen in der Shadern Bindungen der Pipeline in einem Deskriptorenmenge Layout würde der SPIR-V unwirksam sein in einer Vulkan-Pipeline zu verwenden, da es keine Möglichkeit wäre, diese Anforderung zu erfüllen: Sie können es nur für eine der Variablen erfüllen, die das gleiche haben (setzen, binden).

1

Vulkan 1.0.58 verdeutlicht dies, den obigen Code erklärt ausdrücklich illegal sein:

Es ist für mehrere Shader-Variablen gilt die gleiche Deskriptorenmenge und verbindliche Werte zugewiesen werden, solange Alle diejenigen, die statisch von dem zu kompilierenden Einstiegspunkt verwendet werden, sind mit dem Deskriptor-Typ in der Deskriptorsatz-Layout-Bindung kompatibel.

Es ist so ziemlich keine Möglichkeit, dass Ihr Deskriptorsatz Layout-Typ mit sowohl einem VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER/_DYNAMIC und VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER kompatibel sein kann. Das würde also nicht funktionieren.

Verwandte Themen