From 132cf537373f52e39f149adfbc94f92e89b9e693 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Tue, 2 Jan 2018 11:27:54 -0700 Subject: [PATCH] HLSL: Fix #1203: Declare anonymous members for cbuffer with no ';' The grammar for no semicolon and no object name for cbuffer/tbuffer was correct, but the production still skipped the anonymous declarations if an identifier followed. --- Test/baseResults/hlsl.buffer.frag.out | 454 ++++++++++++++------------ Test/hlsl.buffer.frag | 16 +- hlsl/hlslGrammar.cpp | 6 +- hlsl/hlslGrammar.h | 2 +- 4 files changed, 271 insertions(+), 207 deletions(-) diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out index 0245843e..40ad65a8 100755 --- a/Test/baseResults/hlsl.buffer.frag.out +++ b/Test/baseResults/hlsl.buffer.frag.out @@ -8,50 +8,66 @@ gl_FragCoord origin is upper left 0:31 Branch: Return with expression 0:31 Constant: 0:31 1.000000 -0:35 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float) -0:35 Function Parameters: -0:35 'input' ( in 4-component vector of float) +0:43 Function Definition: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a}) +0:43 Function Parameters: +0:43 'input' ( in 4-component vector of float) 0:? Sequence -0:36 Branch: Return with expression -0:36 vector-scale ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 'input' ( in 4-component vector of float) -0:36 v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float) -0:36 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) -0:36 Constant: -0:36 0 (const uint) -0:36 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) -0:36 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) -0:36 Constant: -0:36 0 (const uint) -0:36 v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float) -0:36 '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:36 Constant: -0:36 0 (const uint) -0:36 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:36 '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:36 Constant: -0:36 0 (const uint) -0:36 Function Call: foo( ( temp float) -0:35 Function Definition: PixelShaderFunction( ( temp void) -0:35 Function Parameters: +0:45 move second child to first child ( temp 4-component vector of float) +0:45 a: direct index for structure ( temp 4-component vector of float) +0:45 'ret' ( temp structure{ temp 4-component vector of float a}) +0:45 Constant: +0:45 0 (const int) +0:45 add ( temp 4-component vector of float) +0:45 v24: direct index for structure (layout( row_major std140) uniform 4-component vector of float) +0:45 'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24}) +0:45 Constant: +0:45 0 (const uint) +0:45 vector-scale ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 'input' ( in 4-component vector of float) +0:45 v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float) +0:45 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) +0:45 Constant: +0:45 0 (const uint) +0:45 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) +0:45 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) +0:45 Constant: +0:45 0 (const uint) +0:45 v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float) +0:45 '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:45 Constant: +0:45 0 (const uint) +0:45 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) +0:45 '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:45 Constant: +0:45 0 (const uint) +0:45 Function Call: foo( ( temp float) +0:46 Branch: Return with expression +0:46 'ret' ( temp structure{ temp 4-component vector of float a}) +0:43 Function Definition: PixelShaderFunction( ( temp void) +0:43 Function Parameters: 0:? Sequence -0:35 move second child to first child ( temp 4-component vector of float) +0:43 move second child to first child ( temp 4-component vector of float) 0:? 'input' ( temp 4-component vector of float) 0:? 'input' ( in 4-component vector of float FragCoord) -0:35 move second child to first child ( temp 4-component vector of float) -0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) -0:35 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float) -0:? 'input' ( temp 4-component vector of float) +0:43 Sequence +0:43 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput.a' (layout( location=0) out 4-component vector of float) +0:43 a: direct index for structure ( temp 4-component vector of float) +0:43 Function Call: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a}) +0:? 'input' ( temp 4-component vector of float) +0:43 Constant: +0:43 0 (const int) 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( 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:? 'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24}) +0:? '@entryPointOutput.a' (layout( location=0) out 4-component vector of float) 0:? 'input' ( in 4-component vector of float FragCoord) @@ -67,203 +83,241 @@ gl_FragCoord origin is upper left 0:31 Branch: Return with expression 0:31 Constant: 0:31 1.000000 -0:35 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float) -0:35 Function Parameters: -0:35 'input' ( in 4-component vector of float) +0:43 Function Definition: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a}) +0:43 Function Parameters: +0:43 'input' ( in 4-component vector of float) 0:? Sequence -0:36 Branch: Return with expression -0:36 vector-scale ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 add ( temp 4-component vector of float) -0:36 'input' ( in 4-component vector of float) -0:36 v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float) -0:36 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) -0:36 Constant: -0:36 0 (const uint) -0:36 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) -0:36 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) -0:36 Constant: -0:36 0 (const uint) -0:36 v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float) -0:36 '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:36 Constant: -0:36 0 (const uint) -0:36 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) -0:36 '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:36 Constant: -0:36 0 (const uint) -0:36 Function Call: foo( ( temp float) -0:35 Function Definition: PixelShaderFunction( ( temp void) -0:35 Function Parameters: +0:45 move second child to first child ( temp 4-component vector of float) +0:45 a: direct index for structure ( temp 4-component vector of float) +0:45 'ret' ( temp structure{ temp 4-component vector of float a}) +0:45 Constant: +0:45 0 (const int) +0:45 add ( temp 4-component vector of float) +0:45 v24: direct index for structure (layout( row_major std140) uniform 4-component vector of float) +0:45 'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24}) +0:45 Constant: +0:45 0 (const uint) +0:45 vector-scale ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 add ( temp 4-component vector of float) +0:45 'input' ( in 4-component vector of float) +0:45 v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float) +0:45 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) +0:45 Constant: +0:45 0 (const uint) +0:45 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) +0:45 'anon@1' (layout( row_major std430) readonly buffer block{layout( row_major std430) buffer 4-component vector of float v2}) +0:45 Constant: +0:45 0 (const uint) +0:45 v3: direct index for structure (layout( row_major std140 offset=0) uniform 4-component vector of float) +0:45 '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:45 Constant: +0:45 0 (const uint) +0:45 v4: direct index for structure (layout( row_major std430 offset=16) buffer 4-component vector of float) +0:45 '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:45 Constant: +0:45 0 (const uint) +0:45 Function Call: foo( ( temp float) +0:46 Branch: Return with expression +0:46 'ret' ( temp structure{ temp 4-component vector of float a}) +0:43 Function Definition: PixelShaderFunction( ( temp void) +0:43 Function Parameters: 0:? Sequence -0:35 move second child to first child ( temp 4-component vector of float) +0:43 move second child to first child ( temp 4-component vector of float) 0:? 'input' ( temp 4-component vector of float) 0:? 'input' ( in 4-component vector of float FragCoord) -0:35 move second child to first child ( temp 4-component vector of float) -0:? '@entryPointOutput' (layout( location=0) out 4-component vector of float) -0:35 Function Call: @PixelShaderFunction(vf4; ( temp 4-component vector of float) -0:? 'input' ( temp 4-component vector of float) +0:43 Sequence +0:43 move second child to first child ( temp 4-component vector of float) +0:? '@entryPointOutput.a' (layout( location=0) out 4-component vector of float) +0:43 a: direct index for structure ( temp 4-component vector of float) +0:43 Function Call: @PixelShaderFunction(vf4; ( temp structure{ temp 4-component vector of float a}) +0:? 'input' ( temp 4-component vector of float) +0:43 Constant: +0:43 0 (const int) 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( 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:? 'anon@4' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v24}) +0:? '@entryPointOutput.a' (layout( location=0) out 4-component vector of float) 0:? 'input' ( in 4-component vector of float FragCoord) // Module Version 10000 // Generated by (magic number): 80003 -// Id's are bound by 61 +// Id's are bound by 73 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "PixelShaderFunction" 54 57 + EntryPoint Fragment 4 "PixelShaderFunction" 65 68 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "PixelShaderFunction" Name 8 "foo(" - Name 14 "@PixelShaderFunction(vf4;" - Name 13 "input" - Name 20 "buf1" - MemberName 20(buf1) 0 "v1" - Name 22 "" - Name 29 "buf2" - MemberName 29(buf2) 0 "v2" - Name 31 "" - Name 35 "cbufName" - MemberName 35(cbufName) 0 "v3" - MemberName 35(cbufName) 1 "i3" - Name 37 "" - Name 42 "tbufName" - MemberName 42(tbufName) 0 "v4" - MemberName 42(tbufName) 1 "i4" - MemberName 42(tbufName) 2 "f1" - MemberName 42(tbufName) 3 "f3" - MemberName 42(tbufName) 4 "f4" - MemberName 42(tbufName) 5 "f5" - MemberName 42(tbufName) 6 "f6" - MemberName 42(tbufName) 7 "f7" - MemberName 42(tbufName) 8 "m1" - MemberName 42(tbufName) 9 "m2" - MemberName 42(tbufName) 10 "m3" - MemberName 42(tbufName) 11 "m4" - Name 44 "" - Name 52 "input" - Name 54 "input" - Name 57 "@entryPointOutput" - Name 58 "param" - MemberDecorate 20(buf1) 0 Offset 0 - Decorate 20(buf1) Block - Decorate 22 DescriptorSet 0 - MemberDecorate 29(buf2) 0 NonWritable - MemberDecorate 29(buf2) 0 Offset 0 - Decorate 29(buf2) BufferBlock - Decorate 31 DescriptorSet 0 - MemberDecorate 35(cbufName) 0 Offset 0 - MemberDecorate 35(cbufName) 1 Offset 20 - Decorate 35(cbufName) Block - Decorate 37 DescriptorSet 0 - MemberDecorate 42(tbufName) 0 NonWritable - MemberDecorate 42(tbufName) 0 Offset 16 - MemberDecorate 42(tbufName) 1 NonWritable - MemberDecorate 42(tbufName) 1 Offset 48 - MemberDecorate 42(tbufName) 2 NonWritable - MemberDecorate 42(tbufName) 2 Offset 60 - MemberDecorate 42(tbufName) 3 NonWritable - MemberDecorate 42(tbufName) 3 Offset 64 - MemberDecorate 42(tbufName) 4 NonWritable - MemberDecorate 42(tbufName) 4 Offset 68 - MemberDecorate 42(tbufName) 5 NonWritable - MemberDecorate 42(tbufName) 5 Offset 72 - MemberDecorate 42(tbufName) 6 NonWritable - MemberDecorate 42(tbufName) 6 Offset 76 - MemberDecorate 42(tbufName) 7 NonWritable - MemberDecorate 42(tbufName) 7 Offset 128 - MemberDecorate 42(tbufName) 8 RowMajor - MemberDecorate 42(tbufName) 8 NonWritable - MemberDecorate 42(tbufName) 8 Offset 112 - MemberDecorate 42(tbufName) 8 MatrixStride 16 - MemberDecorate 42(tbufName) 9 ColMajor - MemberDecorate 42(tbufName) 9 NonWritable - MemberDecorate 42(tbufName) 9 Offset 176 - MemberDecorate 42(tbufName) 9 MatrixStride 16 - MemberDecorate 42(tbufName) 10 RowMajor - MemberDecorate 42(tbufName) 10 NonWritable - MemberDecorate 42(tbufName) 10 Offset 240 - MemberDecorate 42(tbufName) 10 MatrixStride 16 - MemberDecorate 42(tbufName) 11 RowMajor - MemberDecorate 42(tbufName) 11 NonWritable - MemberDecorate 42(tbufName) 11 Offset 304 - MemberDecorate 42(tbufName) 11 MatrixStride 16 - Decorate 42(tbufName) BufferBlock - Decorate 44 DescriptorSet 0 - Decorate 44 Binding 8 - Decorate 54(input) BuiltIn FragCoord - Decorate 57(@entryPointOutput) Location 0 + Name 12 "id" + MemberName 12(id) 0 "a" + Name 15 "@PixelShaderFunction(vf4;" + Name 14 "input" + Name 21 "ret" + Name 24 "cbufName2" + MemberName 24(cbufName2) 0 "v24" + Name 26 "" + Name 31 "buf1" + MemberName 31(buf1) 0 "v1" + Name 33 "" + Name 37 "buf2" + MemberName 37(buf2) 0 "v2" + Name 39 "" + Name 43 "cbufName" + MemberName 43(cbufName) 0 "v3" + MemberName 43(cbufName) 1 "i3" + Name 45 "" + Name 50 "tbufName" + MemberName 50(tbufName) 0 "v4" + MemberName 50(tbufName) 1 "i4" + MemberName 50(tbufName) 2 "f1" + MemberName 50(tbufName) 3 "f3" + MemberName 50(tbufName) 4 "f4" + MemberName 50(tbufName) 5 "f5" + MemberName 50(tbufName) 6 "f6" + MemberName 50(tbufName) 7 "f7" + MemberName 50(tbufName) 8 "m1" + MemberName 50(tbufName) 9 "m2" + MemberName 50(tbufName) 10 "m3" + MemberName 50(tbufName) 11 "m4" + Name 52 "" + Name 63 "input" + Name 65 "input" + Name 68 "@entryPointOutput.a" + Name 69 "param" + MemberDecorate 24(cbufName2) 0 Offset 0 + Decorate 24(cbufName2) Block + Decorate 26 DescriptorSet 0 + MemberDecorate 31(buf1) 0 Offset 0 + Decorate 31(buf1) Block + Decorate 33 DescriptorSet 0 + MemberDecorate 37(buf2) 0 NonWritable + MemberDecorate 37(buf2) 0 Offset 0 + Decorate 37(buf2) BufferBlock + Decorate 39 DescriptorSet 0 + MemberDecorate 43(cbufName) 0 Offset 0 + MemberDecorate 43(cbufName) 1 Offset 20 + Decorate 43(cbufName) Block + Decorate 45 DescriptorSet 0 + MemberDecorate 50(tbufName) 0 NonWritable + MemberDecorate 50(tbufName) 0 Offset 16 + MemberDecorate 50(tbufName) 1 NonWritable + MemberDecorate 50(tbufName) 1 Offset 48 + MemberDecorate 50(tbufName) 2 NonWritable + MemberDecorate 50(tbufName) 2 Offset 60 + MemberDecorate 50(tbufName) 3 NonWritable + MemberDecorate 50(tbufName) 3 Offset 64 + MemberDecorate 50(tbufName) 4 NonWritable + MemberDecorate 50(tbufName) 4 Offset 68 + MemberDecorate 50(tbufName) 5 NonWritable + MemberDecorate 50(tbufName) 5 Offset 72 + MemberDecorate 50(tbufName) 6 NonWritable + MemberDecorate 50(tbufName) 6 Offset 76 + MemberDecorate 50(tbufName) 7 NonWritable + MemberDecorate 50(tbufName) 7 Offset 128 + MemberDecorate 50(tbufName) 8 RowMajor + MemberDecorate 50(tbufName) 8 NonWritable + MemberDecorate 50(tbufName) 8 Offset 112 + MemberDecorate 50(tbufName) 8 MatrixStride 16 + MemberDecorate 50(tbufName) 9 ColMajor + MemberDecorate 50(tbufName) 9 NonWritable + MemberDecorate 50(tbufName) 9 Offset 176 + MemberDecorate 50(tbufName) 9 MatrixStride 16 + MemberDecorate 50(tbufName) 10 RowMajor + MemberDecorate 50(tbufName) 10 NonWritable + MemberDecorate 50(tbufName) 10 Offset 240 + MemberDecorate 50(tbufName) 10 MatrixStride 16 + MemberDecorate 50(tbufName) 11 RowMajor + MemberDecorate 50(tbufName) 11 NonWritable + MemberDecorate 50(tbufName) 11 Offset 304 + MemberDecorate 50(tbufName) 11 MatrixStride 16 + Decorate 50(tbufName) BufferBlock + Decorate 52 DescriptorSet 0 + Decorate 52 Binding 8 + Decorate 65(input) BuiltIn FragCoord + Decorate 68(@entryPointOutput.a) Location 0 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 7: TypeFunction 6(float) 10: TypeVector 6(float) 4 11: TypePointer Function 10(fvec4) - 12: TypeFunction 10(fvec4) 11(ptr) - 16: 6(float) Constant 1065353216 - 20(buf1): TypeStruct 10(fvec4) - 21: TypePointer Uniform 20(buf1) - 22: 21(ptr) Variable Uniform - 23: TypeInt 32 1 - 24: 23(int) Constant 0 - 25: TypePointer Uniform 10(fvec4) - 29(buf2): TypeStruct 10(fvec4) - 30: TypePointer Uniform 29(buf2) - 31: 30(ptr) Variable Uniform - 35(cbufName): TypeStruct 10(fvec4) 23(int) - 36: TypePointer Uniform 35(cbufName) - 37: 36(ptr) Variable Uniform - 41: TypeMatrix 10(fvec4) 3 - 42(tbufName): TypeStruct 10(fvec4) 23(int) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 41 41 41 41 - 43: TypePointer Uniform 42(tbufName) - 44: 43(ptr) Variable Uniform - 53: TypePointer Input 10(fvec4) - 54(input): 53(ptr) Variable Input - 56: TypePointer Output 10(fvec4) -57(@entryPointOutput): 56(ptr) Variable Output + 12(id): TypeStruct 10(fvec4) + 13: TypeFunction 12(id) 11(ptr) + 17: 6(float) Constant 1065353216 + 20: TypePointer Function 12(id) + 22: TypeInt 32 1 + 23: 22(int) Constant 0 + 24(cbufName2): TypeStruct 10(fvec4) + 25: TypePointer Uniform 24(cbufName2) + 26: 25(ptr) Variable Uniform + 27: TypePointer Uniform 10(fvec4) + 31(buf1): TypeStruct 10(fvec4) + 32: TypePointer Uniform 31(buf1) + 33: 32(ptr) Variable Uniform + 37(buf2): TypeStruct 10(fvec4) + 38: TypePointer Uniform 37(buf2) + 39: 38(ptr) Variable Uniform + 43(cbufName): TypeStruct 10(fvec4) 22(int) + 44: TypePointer Uniform 43(cbufName) + 45: 44(ptr) Variable Uniform + 49: TypeMatrix 10(fvec4) 3 + 50(tbufName): TypeStruct 10(fvec4) 22(int) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 49 49 49 49 + 51: TypePointer Uniform 50(tbufName) + 52: 51(ptr) Variable Uniform + 64: TypePointer Input 10(fvec4) + 65(input): 64(ptr) Variable Input + 67: TypePointer Output 10(fvec4) +68(@entryPointOutput.a): 67(ptr) Variable Output 4(PixelShaderFunction): 2 Function None 3 5: Label - 52(input): 11(ptr) Variable Function - 58(param): 11(ptr) Variable Function - 55: 10(fvec4) Load 54(input) - Store 52(input) 55 - 59: 10(fvec4) Load 52(input) - Store 58(param) 59 - 60: 10(fvec4) FunctionCall 14(@PixelShaderFunction(vf4;) 58(param) - Store 57(@entryPointOutput) 60 + 63(input): 11(ptr) Variable Function + 69(param): 11(ptr) Variable Function + 66: 10(fvec4) Load 65(input) + Store 63(input) 66 + 70: 10(fvec4) Load 63(input) + Store 69(param) 70 + 71: 12(id) FunctionCall 15(@PixelShaderFunction(vf4;) 69(param) + 72: 10(fvec4) CompositeExtract 71 0 + Store 68(@entryPointOutput.a) 72 Return FunctionEnd 8(foo(): 6(float) Function None 7 9: Label - ReturnValue 16 + ReturnValue 17 FunctionEnd -14(@PixelShaderFunction(vf4;): 10(fvec4) Function None 12 - 13(input): 11(ptr) FunctionParameter - 15: Label - 19: 10(fvec4) Load 13(input) - 26: 25(ptr) AccessChain 22 24 - 27: 10(fvec4) Load 26 - 28: 10(fvec4) FAdd 19 27 - 32: 25(ptr) AccessChain 31 24 - 33: 10(fvec4) Load 32 - 34: 10(fvec4) FAdd 28 33 - 38: 25(ptr) AccessChain 37 24 - 39: 10(fvec4) Load 38 - 40: 10(fvec4) FAdd 34 39 - 45: 25(ptr) AccessChain 44 24 - 46: 10(fvec4) Load 45 - 47: 10(fvec4) FAdd 40 46 - 48: 6(float) FunctionCall 8(foo() - 49: 10(fvec4) VectorTimesScalar 47 48 - ReturnValue 49 +15(@PixelShaderFunction(vf4;): 12(id) Function None 13 + 14(input): 11(ptr) FunctionParameter + 16: Label + 21(ret): 20(ptr) Variable Function + 28: 27(ptr) AccessChain 26 23 + 29: 10(fvec4) Load 28 + 30: 10(fvec4) Load 14(input) + 34: 27(ptr) AccessChain 33 23 + 35: 10(fvec4) Load 34 + 36: 10(fvec4) FAdd 30 35 + 40: 27(ptr) AccessChain 39 23 + 41: 10(fvec4) Load 40 + 42: 10(fvec4) FAdd 36 41 + 46: 27(ptr) AccessChain 45 23 + 47: 10(fvec4) Load 46 + 48: 10(fvec4) FAdd 42 47 + 53: 27(ptr) AccessChain 52 23 + 54: 10(fvec4) Load 53 + 55: 10(fvec4) FAdd 48 54 + 56: 6(float) FunctionCall 8(foo() + 57: 10(fvec4) VectorTimesScalar 55 56 + 58: 10(fvec4) FAdd 29 57 + 59: 11(ptr) AccessChain 21(ret) 23 + Store 59 58 + 60: 12(id) Load 21(ret) + ReturnValue 60 FunctionEnd diff --git a/Test/hlsl.buffer.frag b/Test/hlsl.buffer.frag index 520de09e..73f42e8f 100644 --- a/Test/hlsl.buffer.frag +++ b/Test/hlsl.buffer.frag @@ -31,7 +31,17 @@ float foo() // float looks like identifier, but can't be part of tbuffer return 1.0; } -float4 PixelShaderFunction(float4 input : SV_POSITION) : SV_TARGET0 -{ - return (input + v1 + v2 + v3 + v4) * foo(); +struct id { + float4 a; +}; + +cbuffer cbufName2 { + float4 v24; +} + +id PixelShaderFunction(float4 input : SV_POSITION) : SV_TARGET0 // id looks like id for cbuffer name, but can't be +{ + id ret; + ret.a = v24 + (input + v1 + v2 + v3 + v4) * foo(); + return ret; } diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index 4cdca766..d485a110 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -376,7 +376,7 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList) bool forbidDeclarators = (peekTokenClass(EHTokCBuffer) || peekTokenClass(EHTokTBuffer)); // fully_specified_type - if (! acceptFullySpecifiedType(declaredType, nodeList, declarator.attributes)) + if (! acceptFullySpecifiedType(declaredType, nodeList, declarator.attributes, forbidDeclarators)) return false; // cbuffer and tbuffer end with the closing '}'. @@ -583,7 +583,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type, const TAttributeMap& att TIntermNode* nodeList = nullptr; return acceptFullySpecifiedType(type, nodeList, attributes); } -bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, const TAttributeMap& attributes) +bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, const TAttributeMap& attributes, bool forbidDeclarators) { // type_qualifier TQualifier qualifier; @@ -611,7 +611,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type, TIntermNode*& nodeList, parseContext.transferTypeAttributes(attributes, type); // further, it can create an anonymous instance of the block - if (peek() != EHTokIdentifier) + if (forbidDeclarators || peek() != EHTokIdentifier) parseContext.declareBlock(loc, type); } else { // Some qualifiers are set when parsing the type. Merge those with diff --git a/hlsl/hlslGrammar.h b/hlsl/hlslGrammar.h index f5613d90..9e58bfda 100755 --- a/hlsl/hlslGrammar.h +++ b/hlsl/hlslGrammar.h @@ -72,7 +72,7 @@ namespace glslang { bool acceptSamplerDeclarationDX9(TType&); bool acceptSamplerState(); bool acceptFullySpecifiedType(TType&, const TAttributeMap&); - bool acceptFullySpecifiedType(TType&, TIntermNode*& nodeList, const TAttributeMap&); + bool acceptFullySpecifiedType(TType&, TIntermNode*& nodeList, const TAttributeMap&, bool forbidDeclarators = false); bool acceptQualifier(TQualifier&); bool acceptLayoutQualifierList(TQualifier&); bool acceptType(TType&);