HLSL: Fix #1106. Support shader setting of binding/set for $Global.
authorJohn Kessenich <cepheus@frii.com>
Thu, 19 Oct 2017 22:54:25 +0000 (16:54 -0600)
committerJohn Kessenich <cepheus@frii.com>
Thu, 19 Oct 2017 22:54:25 +0000 (16:54 -0600)
Test/baseResults/hlsl.attributeGlobalBuffer.frag.out [new file with mode: 0755]
Test/hlsl.attributeGlobalBuffer.frag [new file with mode: 0644]
glslang/MachineIndependent/ParseContextBase.cpp
glslang/MachineIndependent/ParseHelper.h
gtests/Hlsl.FromFile.cpp
hlsl/hlslAttributes.cpp
hlsl/hlslAttributes.h
hlsl/hlslParseHelper.cpp
hlsl/hlslParseHelper.h

diff --git a/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out b/Test/baseResults/hlsl.attributeGlobalBuffer.frag.out
new file mode 100755 (executable)
index 0000000..e00ae52
--- /dev/null
@@ -0,0 +1,109 @@
+hlsl.attributeGlobalBuffer.frag
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main( ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp 4-component vector of float)
+0:7          u1: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          u2: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              1 (const uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+
+Linked fragment stage:
+
+
+Shader version: 500
+gl_FragCoord origin is upper left
+0:? Sequence
+0:6  Function Definition: @main( ( temp 4-component vector of float)
+0:6    Function Parameters: 
+0:?     Sequence
+0:7      Branch: Return with expression
+0:7        add ( temp 4-component vector of float)
+0:7          u1: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              0 (const uint)
+0:7          u2: direct index for structure ( uniform 4-component vector of float)
+0:7            'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:7            Constant:
+0:7              1 (const uint)
+0:6  Function Definition: main( ( temp void)
+0:6    Function Parameters: 
+0:?     Sequence
+0:6      move second child to first child ( temp 4-component vector of float)
+0:?         '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+0:6        Function Call: @main( ( temp 4-component vector of float)
+0:?   Linker Objects
+0:?     'anon@0' (layout( set=2 binding=5 row_major std140) uniform block{ uniform 4-component vector of float u1,  uniform 4-component vector of float u2})
+0:?     '@entryPointOutput' (layout( location=0) out 4-component vector of float)
+
+// Module Version 10000
+// Generated by (magic number): 80002
+// Id's are bound by 28
+
+                              Capability Shader
+               1:             ExtInstImport  "GLSL.std.450"
+                              MemoryModel Logical GLSL450
+                              EntryPoint Fragment 4  "main" 26
+                              ExecutionMode 4 OriginUpperLeft
+                              Source HLSL 500
+                              Name 4  "main"
+                              Name 9  "@main("
+                              Name 11  "$Global"
+                              MemberName 11($Global) 0  "u1"
+                              MemberName 11($Global) 1  "u2"
+                              Name 13  ""
+                              Name 26  "@entryPointOutput"
+                              MemberDecorate 11($Global) 0 Offset 0
+                              MemberDecorate 11($Global) 1 Offset 16
+                              Decorate 11($Global) Block
+                              Decorate 13 DescriptorSet 2
+                              Decorate 13 Binding 5
+                              Decorate 26(@entryPointOutput) Location 0
+               2:             TypeVoid
+               3:             TypeFunction 2
+               6:             TypeFloat 32
+               7:             TypeVector 6(float) 4
+               8:             TypeFunction 7(fvec4)
+     11($Global):             TypeStruct 7(fvec4) 7(fvec4)
+              12:             TypePointer Uniform 11($Global)
+              13:     12(ptr) Variable Uniform
+              14:             TypeInt 32 1
+              15:     14(int) Constant 0
+              16:             TypePointer Uniform 7(fvec4)
+              19:     14(int) Constant 1
+              25:             TypePointer Output 7(fvec4)
+26(@entryPointOutput):     25(ptr) Variable Output
+         4(main):           2 Function None 3
+               5:             Label
+              27:    7(fvec4) FunctionCall 9(@main()
+                              Store 26(@entryPointOutput) 27
+                              Return
+                              FunctionEnd
+       9(@main():    7(fvec4) Function None 8
+              10:             Label
+              17:     16(ptr) AccessChain 13 15
+              18:    7(fvec4) Load 17
+              20:     16(ptr) AccessChain 13 19
+              21:    7(fvec4) Load 20
+              22:    7(fvec4) FAdd 18 21
+                              ReturnValue 22
+                              FunctionEnd
diff --git a/Test/hlsl.attributeGlobalBuffer.frag b/Test/hlsl.attributeGlobalBuffer.frag
new file mode 100644 (file)
index 0000000..a1177da
--- /dev/null
@@ -0,0 +1,8 @@
+[[vk::global_cbuffer_binding(5, 2)]]\r
+float4 u1;\r
+float4 u2;\r
+\r
+float4 main() : SV_Target0\r
+{\r
+    return u1 + u2;\r
+}
\ No newline at end of file
index 447c038..bbc3cac 100644 (file)
@@ -569,6 +569,10 @@ void TParseContextBase::growGlobalUniformBlock(const TSourceLoc& loc, TType& mem
         firstNewMember = 0;
     }
 
+    // Update with binding and set
+    globalUniformBlock->getWritableType().getQualifier().layoutBinding = globalUniformBinding;
+    globalUniformBlock->getWritableType().getQualifier().layoutSet = globalUniformSet;
+
     // Add the requested member as a member to the global block.
     TType* type = new TType;
     type->shallowCopy(memberType);
index 2a054c1..62b1e8e 100644 (file)
@@ -84,7 +84,9 @@ public:
             contextPragma(true, false),
             parsingBuiltins(parsingBuiltins), scanContext(nullptr), ppContext(nullptr),
             limits(resources.limits),
-            globalUniformBlock(nullptr)
+            globalUniformBlock(nullptr),
+            globalUniformBinding(TQualifier::layoutBindingEnd),
+            globalUniformSet(TQualifier::layoutSetEnd)
     {
         if (entryPoint != nullptr)
             sourceEntryPointName = *entryPoint;
@@ -209,6 +211,8 @@ protected:
 
     // Manage the global uniform block (default uniforms in GLSL, $Global in HLSL)
     TVariable* globalUniformBlock;   // the actual block, inserted into the symbol table
+    unsigned int globalUniformBinding;
+    unsigned int globalUniformSet;
     int firstNewMember;              // the index of the first member not yet inserted into the symbol table
     // override this to set the language-specific name
     virtual const char* getGlobalUniformBlockName() const { return ""; }
index ca5fb3b..9d97fdf 100644 (file)
@@ -100,6 +100,7 @@ INSTANTIATE_TEST_CASE_P(
         {"hlsl.attribute.frag", "PixelShaderFunction"},
         {"hlsl.attribute.expression.comp", "main"},
         {"hlsl.attributeC11.frag", "main"},
+        {"hlsl.attributeGlobalBuffer.frag", "main"},
         {"hlsl.basic.comp", "main"},
         {"hlsl.basic.geom", "main"},
         {"hlsl.boolConv.vert", "main"},
index 2a8e370..fccf6c1 100644 (file)
@@ -58,6 +58,8 @@ namespace glslang {
                 return EatLocation;
             else if (lowername == "binding")
                 return EatBinding;
+            else if (lowername == "global_cbuffer_binding")
+                return EatGlobalBinding;
         } else if (lowernameSpace.size() > 0)
             return EatNone;
 
index 2d7b6c7..1fdb4ba 100644 (file)
@@ -64,6 +64,7 @@ namespace glslang {
         EatUnroll,
         EatLoop,
         EatBinding,
+        EatGlobalBinding,
         EatLocation,
         EatInputAttachment
     };
index 3352276..b3fc116 100755 (executable)
@@ -1869,6 +1869,14 @@ void HlslParseContext::transferTypeAttributes(const TAttributeMap& attributes, T
     if (attributes.getInt(EatBinding, value, 1))
         type.getQualifier().layoutSet = value;
 
+    // global cbuffer binding
+    if (attributes.getInt(EatGlobalBinding, value))
+        globalUniformBinding = value;
+
+    // global cbuffer binding
+    if (attributes.getInt(EatGlobalBinding, value, 1))
+        globalUniformSet = value;
+
     // input attachment
     if (attributes.getInt(EatInputAttachment, value))
         type.getQualifier().layoutAttachment = value;
index 669c1ec..c1752f1 100755 (executable)
@@ -187,7 +187,8 @@ public:
     void pushSwitchSequence(TIntermSequence* sequence) { switchSequenceStack.push_back(sequence); }
     void popSwitchSequence() { switchSequenceStack.pop_back(); }
 
-    virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName, TTypeList* typeList = nullptr) override;
+    virtual void growGlobalUniformBlock(const TSourceLoc&, TType&, const TString& memberName,
+        TTypeList* typeList = nullptr) override;
 
     // Apply L-value conversions.  E.g, turning a write to a RWTexture into an ImageStore.
     TIntermTyped* handleLvalue(const TSourceLoc&, const char* op, TIntermTyped*& node);