HLSL: Track binding numbers to struct instances; fixes issue #496.

This commit is contained in:
John Kessenich 2016-09-05 12:19:18 -06:00
parent 58d2843c6a
commit b804de605c
3 changed files with 22 additions and 18 deletions

View File

@ -23,19 +23,19 @@ gl_FragCoord origin is upper left
0:27 Constant: 0:27 Constant:
0:27 0 (const uint) 0:27 0 (const uint)
0:27 v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float) 0:27 v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
0:27 'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3}) 0:27 'anon@2' (layout(binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
0:27 Constant: 0:27 Constant:
0:27 0 (const uint) 0:27 0 (const uint)
0:27 v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float) 0:27 v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
0:27 'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7}) 0:27 'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
0:27 Constant: 0:27 Constant:
0:27 0 (const uint) 0:27 0 (const uint)
0:27 Branch: Return 0:27 Branch: Return
0:? Linker Objects 0:? Linker Objects
0:? 'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1}) 0:? 'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
0:? 'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2}) 0:? 'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
0:? 'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3}) 0:? 'anon@2' (layout(binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
0:? 'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7}) 0:? 'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
Linked fragment stage: Linked fragment stage:
@ -65,19 +65,19 @@ gl_FragCoord origin is upper left
0:27 Constant: 0:27 Constant:
0:27 0 (const uint) 0:27 0 (const uint)
0:27 v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float) 0:27 v3: direct index for structure (layout(column_major std140 ) uniform 4-component vector of float)
0:27 'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3}) 0:27 'anon@2' (layout(binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
0:27 Constant: 0:27 Constant:
0:27 0 (const uint) 0:27 0 (const uint)
0:27 v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float) 0:27 v4: direct index for structure (layout(column_major std430 offset=16 ) buffer 4-component vector of float)
0:27 'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7}) 0:27 'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
0:27 Constant: 0:27 Constant:
0:27 0 (const uint) 0:27 0 (const uint)
0:27 Branch: Return 0:27 Branch: Return
0:? Linker Objects 0:? Linker Objects
0:? 'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1}) 0:? 'anon@0' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v1})
0:? 'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2}) 0:? 'anon@1' (layout(column_major std430 ) buffer block{layout(column_major std430 ) buffer 4-component vector of float v2})
0:? 'anon@2' (layout(column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3}) 0:? 'anon@2' (layout(binding=2 column_major std140 ) uniform block{layout(column_major std140 ) uniform 4-component vector of float v3, layout(column_major std140 offset=20 ) uniform int i3})
0:? 'anon@3' (layout(column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7}) 0:? 'anon@3' (layout(binding=8 column_major std430 ) buffer block{layout(column_major std430 offset=16 ) buffer 4-component vector of float v4, layout(column_major std430 offset=48 ) buffer int i4, layout(column_major std430 offset=60 ) buffer float f1, layout(column_major std430 offset=64 ) buffer float f3, layout(column_major std430 offset=68 ) buffer float f4, layout(column_major std430 offset=72 ) buffer float f5, layout(column_major std430 ) buffer float f6, layout(column_major std430 ) buffer float f7})
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80001 // Generated by (magic number): 80001
@ -123,6 +123,7 @@ gl_FragCoord origin is upper left
MemberDecorate 28 1 Offset 20 MemberDecorate 28 1 Offset 20
Decorate 28 Block Decorate 28 Block
Decorate 30 DescriptorSet 0 Decorate 30 DescriptorSet 0
Decorate 30 Binding 2
MemberDecorate 34 0 Offset 16 MemberDecorate 34 0 Offset 16
MemberDecorate 34 1 Offset 48 MemberDecorate 34 1 Offset 48
MemberDecorate 34 2 Offset 60 MemberDecorate 34 2 Offset 60
@ -133,6 +134,7 @@ gl_FragCoord origin is upper left
MemberDecorate 34 7 Offset 80 MemberDecorate 34 7 Offset 80
Decorate 34 BufferBlock Decorate 34 BufferBlock
Decorate 36 DescriptorSet 0 Decorate 36 DescriptorSet 0
Decorate 36 Binding 8
2: TypeVoid 2: TypeVoid
3: TypeFunction 2 3: TypeFunction 2
6: TypeFloat 32 6: TypeFloat 32

View File

@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits. // For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run). // For the date, it uses the current date (when then script is run).
#define GLSLANG_REVISION "Overload400-PrecQual.1465" #define GLSLANG_REVISION "Overload400-PrecQual.1468"
#define GLSLANG_DATE "02-Sep-2016" #define GLSLANG_DATE "05-Sep-2016"

View File

@ -1292,17 +1292,16 @@ bool HlslGrammar::acceptType(TType& type)
// //
bool HlslGrammar::acceptStruct(TType& type) bool HlslGrammar::acceptStruct(TType& type)
{ {
// This qualifier.storage will tell us whether it's an AST block or // This storage qualifier will tell us whether it's an AST
// just a struct. // block type or just a generic structure type.
TQualifier qualifier; TStorageQualifier storageQualifier = EvqTemporary;
qualifier.clear();
// CBUFFER // CBUFFER
if (acceptTokenClass(EHTokCBuffer)) if (acceptTokenClass(EHTokCBuffer))
qualifier.storage = EvqUniform; storageQualifier = EvqUniform;
// TBUFFER // TBUFFER
else if (acceptTokenClass(EHTokTBuffer)) else if (acceptTokenClass(EHTokTBuffer))
qualifier.storage = EvqBuffer; storageQualifier = EvqBuffer;
// STRUCT // STRUCT
else if (! acceptTokenClass(EHTokStruct)) else if (! acceptTokenClass(EHTokStruct))
return false; return false;
@ -1337,10 +1336,13 @@ bool HlslGrammar::acceptStruct(TType& type)
} }
// create the user-defined type // create the user-defined type
if (qualifier.storage == EvqTemporary) if (storageQualifier == EvqTemporary)
new(&type) TType(typeList, structName); new(&type) TType(typeList, structName);
else else {
TQualifier qualifier = type.getQualifier();
qualifier.storage = storageQualifier;
new(&type) TType(typeList, structName, qualifier); // sets EbtBlock new(&type) TType(typeList, structName, qualifier); // sets EbtBlock
}
// If it was named, which means the type can be reused later, add // If it was named, which means the type can be reused later, add
// it to the symbol table. (Unless it's a block, in which // it to the symbol table. (Unless it's a block, in which