diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out index faa2ad63ad3ffd557650f1c0b3447cb5f3d2269c..6ef44e49dc1c5fefb22f12add257cd3ae5b8dc7a 100755 --- a/Test/baseResults/hlsl.buffer.frag.out +++ b/Test/baseResults/hlsl.buffer.frag.out @@ -20,12 +20,12 @@ gl_FragCoord origin is upper left 0:31 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) 0:31 Constant: 0:31 0 (const uint) -0:31 v3: direct index for structure (layout( row_major std140) uniform 4-component vector of float) -0:31 'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) +0:31 v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float) +0:31 'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) 0:31 Constant: 0:31 0 (const uint) 0:31 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:31 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:31 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4}) 0:31 Constant: 0:31 0 (const uint) 0:30 Function Definition: PixelShaderFunction( ( temp void) @@ -33,7 +33,7 @@ gl_FragCoord origin is upper left 0:? Sequence 0:30 move second child to first child ( temp 4-component vector of float) 0:? 'input' ( temp 4-component vector of float) -0:? 'input' (layout( location=0) in 4-component vector of float) +0:? 'input' ( in 4-component vector of float FragCoord) 0:30 move second child to first child ( temp 4-component vector of float) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:30 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float) @@ -41,10 +41,10 @@ gl_FragCoord origin is upper left 0:? Linker Objects 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) 0:? 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) -0:? 'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) -0:? 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:? 'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) +0:? 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) -0:? 'input' (layout( location=0) in 4-component vector of float) +0:? 'input' ( in 4-component vector of float FragCoord) Linked fragment stage: @@ -71,12 +71,12 @@ gl_FragCoord origin is upper left 0:31 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) 0:31 Constant: 0:31 0 (const uint) -0:31 v3: direct index for structure (layout( row_major std140) uniform 4-component vector of float) -0:31 'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) +0:31 v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float) +0:31 'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) 0:31 Constant: 0:31 0 (const uint) 0:31 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:31 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:31 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4}) 0:31 Constant: 0:31 0 (const uint) 0:30 Function Definition: PixelShaderFunction( ( temp void) @@ -84,7 +84,7 @@ gl_FragCoord origin is upper left 0:? Sequence 0:30 move second child to first child ( temp 4-component vector of float) 0:? 'input' ( temp 4-component vector of float) -0:? 'input' (layout( location=0) in 4-component vector of float) +0:? 'input' ( in 4-component vector of float FragCoord) 0:30 move second child to first child ( temp 4-component vector of float) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) 0:30 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float) @@ -92,10 +92,10 @@ gl_FragCoord origin is upper left 0:? Linker Objects 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) 0:? 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) -0:? 'anon@2' (layout( set=10 binding=2 row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) -0:? 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430) buffer float f7, layout( row_major std430) buffer 3X4 matrix of float m1, layout( column_major std430) buffer 3X4 matrix of float m2, layout( row_major std430) buffer 3X4 matrix of float m3, layout( row_major std430) buffer 3X4 matrix of float m4}) +0:? 'anon@2' (layout( row_major std140) uniform block{layout( row_major std140 offset=0) uniform 4-component vector of float v3, layout( row_major std140 offset=20) uniform int i3}) +0:? 'anon@3' (layout( binding=8 row_major std430) readonly buffer block{layout( row_major std430 offset=16) buffer 4-component vector of float v4, layout( row_major std430 offset=48) buffer int i4, layout( row_major std430 offset=60) buffer float f1, layout( row_major std430 offset=64) buffer float f3, layout( row_major std430 offset=68) buffer float f4, layout( row_major std430 offset=72) buffer float f5, layout( row_major std430) buffer float f6, layout( row_major std430 offset=128) buffer float f7, layout( row_major std430 offset=112) buffer 3X4 matrix of float m1, layout( column_major std430 offset=176) buffer 3X4 matrix of float m2, layout( row_major std430 offset=240) buffer 3X4 matrix of float m3, layout( row_major std430 offset=304) buffer 3X4 matrix of float m4}) 0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) -0:? 'input' (layout( location=0) in 4-component vector of float) +0:? 'input' ( in 4-component vector of float FragCoord) // Module Version 10000 // Generated by (magic number): 80001 @@ -110,11 +110,11 @@ gl_FragCoord origin is upper left Name 4 "PixelShaderFunction" Name 11 "@PixelShaderFunction(vf4;" Name 10 "input" - Name 14 "" - MemberName 14 0 "v1" + Name 14 "buf1" + MemberName 14(buf1) 0 "v1" Name 16 "" - Name 23 "" - MemberName 23 0 "v2" + Name 23 "buf2" + MemberName 23(buf2) 0 "v2" Name 25 "" Name 29 "cbufName" MemberName 29(cbufName) 0 "v3" @@ -138,18 +138,17 @@ gl_FragCoord origin is upper left Name 46 "input" Name 49 "@entryPointOutput" Name 50 "param" - MemberDecorate 14 0 Offset 0 - Decorate 14 Block + MemberDecorate 14(buf1) 0 Offset 0 + Decorate 14(buf1) Block Decorate 16 DescriptorSet 0 - MemberDecorate 23 0 NonWritable - MemberDecorate 23 0 Offset 0 - Decorate 23 BufferBlock + MemberDecorate 23(buf2) 0 NonWritable + MemberDecorate 23(buf2) 0 Offset 0 + Decorate 23(buf2) BufferBlock Decorate 25 DescriptorSet 0 MemberDecorate 29(cbufName) 0 Offset 0 MemberDecorate 29(cbufName) 1 Offset 20 Decorate 29(cbufName) Block - Decorate 31 DescriptorSet 10 - Decorate 31 Binding 2 + Decorate 31 DescriptorSet 0 MemberDecorate 36(tbufName) 0 NonWritable MemberDecorate 36(tbufName) 0 Offset 16 MemberDecorate 36(tbufName) 1 NonWritable @@ -165,27 +164,27 @@ gl_FragCoord origin is upper left MemberDecorate 36(tbufName) 6 NonWritable MemberDecorate 36(tbufName) 6 Offset 76 MemberDecorate 36(tbufName) 7 NonWritable - MemberDecorate 36(tbufName) 7 Offset 80 + MemberDecorate 36(tbufName) 7 Offset 128 MemberDecorate 36(tbufName) 8 RowMajor MemberDecorate 36(tbufName) 8 NonWritable - MemberDecorate 36(tbufName) 8 Offset 96 + MemberDecorate 36(tbufName) 8 Offset 112 MemberDecorate 36(tbufName) 8 MatrixStride 16 MemberDecorate 36(tbufName) 9 ColMajor MemberDecorate 36(tbufName) 9 NonWritable - MemberDecorate 36(tbufName) 9 Offset 160 + MemberDecorate 36(tbufName) 9 Offset 176 MemberDecorate 36(tbufName) 9 MatrixStride 16 MemberDecorate 36(tbufName) 10 RowMajor MemberDecorate 36(tbufName) 10 NonWritable - MemberDecorate 36(tbufName) 10 Offset 208 + MemberDecorate 36(tbufName) 10 Offset 240 MemberDecorate 36(tbufName) 10 MatrixStride 16 MemberDecorate 36(tbufName) 11 RowMajor MemberDecorate 36(tbufName) 11 NonWritable - MemberDecorate 36(tbufName) 11 Offset 272 + MemberDecorate 36(tbufName) 11 Offset 304 MemberDecorate 36(tbufName) 11 MatrixStride 16 Decorate 36(tbufName) BufferBlock Decorate 38 DescriptorSet 0 Decorate 38 Binding 8 - Decorate 46(input) Location 0 + Decorate 46(input) BuiltIn FragCoord Decorate 49(@entryPointOutput) Location 0 2: TypeVoid 3: TypeFunction 2 @@ -193,14 +192,14 @@ gl_FragCoord origin is upper left 7: TypeVector 6(float) 4 8: TypePointer Function 7(fvec4) 9: TypeFunction 7(fvec4) 8(ptr) - 14: TypeStruct 7(fvec4) - 15: TypePointer Uniform 14(struct) + 14(buf1): TypeStruct 7(fvec4) + 15: TypePointer Uniform 14(buf1) 16: 15(ptr) Variable Uniform 17: TypeInt 32 1 18: 17(int) Constant 0 19: TypePointer Uniform 7(fvec4) - 23: TypeStruct 7(fvec4) - 24: TypePointer Uniform 23(struct) + 23(buf2): TypeStruct 7(fvec4) + 24: TypePointer Uniform 23(buf2) 25: 24(ptr) Variable Uniform 29(cbufName): TypeStruct 7(fvec4) 17(int) 30: TypePointer Uniform 29(cbufName) diff --git a/Test/hlsl.buffer.frag b/Test/hlsl.buffer.frag index 1604ea4eac54cea5d76360c3154c863d944967df..1c112cf5037bdd1c0a7064bfa96984a81aea9287 100644 --- a/Test/hlsl.buffer.frag +++ b/Test/hlsl.buffer.frag @@ -1,17 +1,17 @@ -cbuffer { +cbuffer buf1 { float4 v1; }; -tbuffer { +tbuffer buf2 { float4 v2; }; -cbuffer cbufName : register(b2, space10) { - float4 v3; - int i3 : packoffset(c1.y); +cbuffer cbufName { + float4 v3 : packoffset(c0); + int i3 : packoffset(c1.y); } // no semicolon is okay -tbuffer tbufName : register(b8) { +tbuffer tbufName : register(t8) { float4 v4 : packoffset(c1); int i4 : packoffset(c3); float f1 : packoffset(c3.w); @@ -19,14 +19,14 @@ tbuffer tbufName : register(b8) { float f4 : packoffset(c4.y); float f5 : packoffset(c4.z); float f6 : packoffset(c); - float f7; - float3x4 m1; - row_major float3x4 m2; - column_major float3x4 m3; - float3x4 m4; + float f7 : packoffset(c8); + float3x4 m1 : packoffset(c7); + row_major float3x4 m2 : packoffset(c11); + column_major float3x4 m3 : packoffset(c15); + float3x4 m4 : packoffset(c19); } // no semicolon is okay -float4 PixelShaderFunction(float4 input) : COLOR0 +float4 PixelShaderFunction(float4 input : SV_POSITION) : SV_TARGET0 { return input + v1 + v2 + v3 + v4; } diff --git a/glslang/MachineIndependent/reflection.cpp b/glslang/MachineIndependent/reflection.cpp index f0566c648f0afb101eb671b0790fa46d413b81d9..aa132e7325bbea10fb96c837c803836ab42142ec 100644 --- a/glslang/MachineIndependent/reflection.cpp +++ b/glslang/MachineIndependent/reflection.cpp @@ -725,7 +725,9 @@ void TReflection::buildCounterIndices() // Returns false if the input is too malformed to do this. bool TReflection::addStage(EShLanguage stage, const TIntermediate& intermediate) { - if (intermediate.getNumEntryPoints() != 1 || intermediate.isRecursive()) + if (intermediate.getTreeRoot() == nullptr || + intermediate.getNumEntryPoints() != 1 || + intermediate.isRecursive()) return false; buildAttributeReflection(stage, intermediate); diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index aab3cb141c7834a5756b43d025cad0a07fe194f6..fd590f850b89b5796e82637fb6220b3811a8c349 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -296,7 +296,8 @@ bool HlslGrammar::acceptSamplerDeclarationDX9(TType& /*type*/) // declaration // : sampler_declaration_dx9 post_decls SEMICOLON -// | fully_specified_type declarator_list SEMICOLON(optional for cbuffer/tbuffer) +// | fully_specified_type // for cbuffer/tbuffer +// | fully_specified_type declarator_list SEMICOLON // for non cbuffer/tbuffer // | fully_specified_type identifier function_parameters post_decls compound_statement // function definition // | fully_specified_type identifier sampler_state post_decls compound_statement // sampler definition // | typedef declaration @@ -374,7 +375,9 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList) if (! acceptFullySpecifiedType(declaredType, nodeList)) return false; - // identifier + // declarator_list + // : declarator + // : identifier HlslToken idToken; TIntermAggregate* initializers = nullptr; while (acceptIdentifier(idToken)) { @@ -483,11 +486,10 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList) } } - if (acceptTokenClass(EHTokComma)) { + // COMMA + if (acceptTokenClass(EHTokComma)) declarator_list = true; - continue; } - }; // The top-level initializer node is a sequence. if (initializers != nullptr) @@ -1901,18 +1903,19 @@ bool HlslGrammar::acceptStruct(TType& type, TIntermNode*& nodeList) TStorageQualifier storageQualifier = EvqTemporary; bool readonly = false; - // CBUFFER if (acceptTokenClass(EHTokCBuffer)) { + // CBUFFER storageQualifier = EvqUniform; - // TBUFFER } else if (acceptTokenClass(EHTokTBuffer)) { + // TBUFFER storageQualifier = EvqBuffer; readonly = true; - } - // CLASS - // STRUCT - else if (! acceptTokenClass(EHTokClass) && ! acceptTokenClass(EHTokStruct)) + } else if (! acceptTokenClass(EHTokClass) && ! acceptTokenClass(EHTokStruct)) { + // Neither CLASS nor STRUCT return false; + } + + // Now known to be one of CBUFFER, TBUFFER, CLASS, or STRUCT // IDENTIFIER TString structName = "";