From 2fcdd64e50e117cd7ccb173c6eb3b983c101a2cf Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Mon, 19 Jun 2017 15:41:11 -0600 Subject: [PATCH] HLSL: Remove support for named tbuffer/cbuffer. Fixes #939. --- Test/baseResults/hlsl.buffer.frag.out | 387 ++++++++++++---------- Test/baseResults/hlsl.reflection.vert.out | 32 +- Test/hlsl.buffer.frag | 15 +- Test/hlsl.reflection.vert | 45 +-- hlsl/hlslGrammar.cpp | 25 +- 5 files changed, 251 insertions(+), 253 deletions(-) diff --git a/Test/baseResults/hlsl.buffer.frag.out b/Test/baseResults/hlsl.buffer.frag.out index 6ef44e49d..c0d251c84 100755 --- a/Test/baseResults/hlsl.buffer.frag.out +++ b/Test/baseResults/hlsl.buffer.frag.out @@ -2,41 +2,49 @@ hlsl.buffer.frag Shader version: 500 gl_FragCoord origin is upper left 0:? Sequence -0:30 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float) +0:30 Function Definition: foo( ( temp float) 0:30 Function Parameters: -0:30 'input' ( in 4-component vector of float) 0:? Sequence 0:31 Branch: Return with expression -0:31 add ( temp 4-component vector of float) -0:31 add ( temp 4-component vector of float) -0:31 add ( temp 4-component vector of float) -0:31 add ( temp 4-component vector of float) -0:31 'input' ( in 4-component vector of float) -0:31 v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float) -0:31 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) -0:31 Constant: -0:31 0 (const uint) -0:31 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) -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 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 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) -0:30 Function Parameters: +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:? Sequence -0:30 move second child to first child ( temp 4-component vector of float) +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:? Sequence +0:35 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:30 move second child to first child ( temp 4-component vector of float) +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:30 Function Call: @PixelShaderFunction(vf4; ( temp 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:? Linker Objects 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) @@ -53,41 +61,49 @@ Linked fragment stage: Shader version: 500 gl_FragCoord origin is upper left 0:? Sequence -0:30 Function Definition: @PixelShaderFunction(vf4; ( temp 4-component vector of float) +0:30 Function Definition: foo( ( temp float) 0:30 Function Parameters: -0:30 'input' ( in 4-component vector of float) 0:? Sequence 0:31 Branch: Return with expression -0:31 add ( temp 4-component vector of float) -0:31 add ( temp 4-component vector of float) -0:31 add ( temp 4-component vector of float) -0:31 add ( temp 4-component vector of float) -0:31 'input' ( in 4-component vector of float) -0:31 v1: direct index for structure (layout( row_major std140) uniform 4-component vector of float) -0:31 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) -0:31 Constant: -0:31 0 (const uint) -0:31 v2: direct index for structure (layout( row_major std430) buffer 4-component vector of float) -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 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 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) -0:30 Function Parameters: +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:? Sequence -0:30 move second child to first child ( temp 4-component vector of float) +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:? Sequence +0:35 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:30 move second child to first child ( temp 4-component vector of float) +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:30 Function Call: @PixelShaderFunction(vf4; ( temp 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:? Linker Objects 0:? 'anon@0' (layout( row_major std140) uniform block{layout( row_major std140) uniform 4-component vector of float v1}) @@ -99,146 +115,155 @@ gl_FragCoord origin is upper left // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 53 +// Id's are bound by 61 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "PixelShaderFunction" 46 49 + EntryPoint Fragment 4 "PixelShaderFunction" 54 57 ExecutionMode 4 OriginUpperLeft Source HLSL 500 Name 4 "PixelShaderFunction" - Name 11 "@PixelShaderFunction(vf4;" - Name 10 "input" - Name 14 "buf1" - MemberName 14(buf1) 0 "v1" - Name 16 "" - Name 23 "buf2" - MemberName 23(buf2) 0 "v2" - Name 25 "" - Name 29 "cbufName" - MemberName 29(cbufName) 0 "v3" - MemberName 29(cbufName) 1 "i3" + 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 36 "tbufName" - MemberName 36(tbufName) 0 "v4" - MemberName 36(tbufName) 1 "i4" - MemberName 36(tbufName) 2 "f1" - MemberName 36(tbufName) 3 "f3" - MemberName 36(tbufName) 4 "f4" - MemberName 36(tbufName) 5 "f5" - MemberName 36(tbufName) 6 "f6" - MemberName 36(tbufName) 7 "f7" - MemberName 36(tbufName) 8 "m1" - MemberName 36(tbufName) 9 "m2" - MemberName 36(tbufName) 10 "m3" - MemberName 36(tbufName) 11 "m4" - Name 38 "" - Name 44 "input" - Name 46 "input" - Name 49 "@entryPointOutput" - Name 50 "param" - MemberDecorate 14(buf1) 0 Offset 0 - Decorate 14(buf1) Block - Decorate 16 DescriptorSet 0 - 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 + 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 36(tbufName) 0 NonWritable - MemberDecorate 36(tbufName) 0 Offset 16 - MemberDecorate 36(tbufName) 1 NonWritable - MemberDecorate 36(tbufName) 1 Offset 48 - MemberDecorate 36(tbufName) 2 NonWritable - MemberDecorate 36(tbufName) 2 Offset 60 - MemberDecorate 36(tbufName) 3 NonWritable - MemberDecorate 36(tbufName) 3 Offset 64 - MemberDecorate 36(tbufName) 4 NonWritable - MemberDecorate 36(tbufName) 4 Offset 68 - MemberDecorate 36(tbufName) 5 NonWritable - MemberDecorate 36(tbufName) 5 Offset 72 - MemberDecorate 36(tbufName) 6 NonWritable - MemberDecorate 36(tbufName) 6 Offset 76 - MemberDecorate 36(tbufName) 7 NonWritable - MemberDecorate 36(tbufName) 7 Offset 128 - MemberDecorate 36(tbufName) 8 RowMajor - MemberDecorate 36(tbufName) 8 NonWritable - 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 176 - MemberDecorate 36(tbufName) 9 MatrixStride 16 - MemberDecorate 36(tbufName) 10 RowMajor - MemberDecorate 36(tbufName) 10 NonWritable - 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 304 - MemberDecorate 36(tbufName) 11 MatrixStride 16 - Decorate 36(tbufName) BufferBlock - Decorate 38 DescriptorSet 0 - Decorate 38 Binding 8 - Decorate 46(input) BuiltIn FragCoord - Decorate 49(@entryPointOutput) Location 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 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 - 7: TypeVector 6(float) 4 - 8: TypePointer Function 7(fvec4) - 9: TypeFunction 7(fvec4) 8(ptr) - 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(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) + 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: TypeMatrix 7(fvec4) 3 - 36(tbufName): TypeStruct 7(fvec4) 17(int) 6(float) 6(float) 6(float) 6(float) 6(float) 6(float) 35 35 35 35 - 37: TypePointer Uniform 36(tbufName) - 38: 37(ptr) Variable Uniform - 45: TypePointer Input 7(fvec4) - 46(input): 45(ptr) Variable Input - 48: TypePointer Output 7(fvec4) -49(@entryPointOutput): 48(ptr) Variable Output + 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 4(PixelShaderFunction): 2 Function None 3 5: Label - 44(input): 8(ptr) Variable Function - 50(param): 8(ptr) Variable Function - 47: 7(fvec4) Load 46(input) - Store 44(input) 47 - 51: 7(fvec4) Load 44(input) - Store 50(param) 51 - 52: 7(fvec4) FunctionCall 11(@PixelShaderFunction(vf4;) 50(param) - Store 49(@entryPointOutput) 52 + 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 Return FunctionEnd -11(@PixelShaderFunction(vf4;): 7(fvec4) Function None 9 - 10(input): 8(ptr) FunctionParameter - 12: Label - 13: 7(fvec4) Load 10(input) - 20: 19(ptr) AccessChain 16 18 - 21: 7(fvec4) Load 20 - 22: 7(fvec4) FAdd 13 21 - 26: 19(ptr) AccessChain 25 18 - 27: 7(fvec4) Load 26 - 28: 7(fvec4) FAdd 22 27 - 32: 19(ptr) AccessChain 31 18 - 33: 7(fvec4) Load 32 - 34: 7(fvec4) FAdd 28 33 - 39: 19(ptr) AccessChain 38 18 - 40: 7(fvec4) Load 39 - 41: 7(fvec4) FAdd 34 40 - ReturnValue 41 + 8(foo(): 6(float) Function None 7 + 9: Label + ReturnValue 16 + 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 FunctionEnd diff --git a/Test/baseResults/hlsl.reflection.vert.out b/Test/baseResults/hlsl.reflection.vert.out index 8ecfde616..5f7a03396 100644 --- a/Test/baseResults/hlsl.reflection.vert.out +++ b/Test/baseResults/hlsl.reflection.vert.out @@ -2,26 +2,19 @@ hlsl.reflection.vert Uniform reflection: anonMember3: offset 80, type 8b52, size 1, index 0, binding -1 s.a: offset 0, type 1404, size 1, index 1, binding -1 -ablock.scalar: offset 12, type 1404, size 1, index 2, binding -1 m23: offset 16, type 8b67, size 1, index 0, binding -1 scalarAfterm23: offset 48, type 1404, size 1, index 0, binding -1 -c_m23: offset 16, type 8b67, size 1, index 3, binding -1 -c_scalarAfterm23: offset 48, type 1404, size 1, index 3, binding -1 +c_m23: offset 16, type 8b67, size 1, index 2, binding -1 +c_scalarAfterm23: offset 48, type 1404, size 1, index 2, binding -1 scalarBeforeArray: offset 96, type 1404, size 1, index 0, binding -1 floatArray: offset 112, type 1406, size 5, index 0, binding -1 scalarAfterArray: offset 192, type 1404, size 1, index 0, binding -1 -ablock.memfloat2: offset 48, type 8b50, size 1, index 2, binding -1 -ablock.memf1: offset 56, type 1406, size 1, index 2, binding -1 -ablock.memf2: offset 60, type 8b56, size 1, index 2, binding -1 -ablock.memf3: offset 64, type 1404, size 1, index 2, binding -1 -ablock.memfloat2a: offset 72, type 8b50, size 1, index 2, binding -1 -ablock.m22: offset 80, type 8b5a, size 7, index 2, binding -1 +m22: offset 208, type 8b5a, size 9, index 0, binding -1 dm22: offset 32, type 8b5a, size 4, index 1, binding -1 -m22: offset 208, type 8b5a, size 3, index 0, binding -1 -nest.foo.n1.a: offset 0, type 1406, size 1, index 4, binding -1 -nest.foo.n2.b: offset 16, type 1406, size 1, index 4, binding -1 -nest.foo.n2.c: offset 20, type 1406, size 1, index 4, binding -1 -nest.foo.n2.d: offset 24, type 1406, size 1, index 4, binding -1 +foo.n1.a: offset 0, type 1406, size 1, index 3, binding -1 +foo.n2.b: offset 16, type 1406, size 1, index 3, binding -1 +foo.n2.c: offset 20, type 1406, size 1, index 3, binding -1 +foo.n2.d: offset 24, type 1406, size 1, index 3, binding -1 deepA.d2.d1[2].va: offset 376, type 8b50, size 2, index 1, binding -1 deepB.d2.d1.va: offset 984, type 8b50, size 2, index 1, binding -1 deepB.d2.d1[0].va: offset 984, type 8b50, size 2, index 1, binding -1 @@ -61,19 +54,18 @@ deepD[1].d2.d1[2].b: offset 2480, type 8b56, size 1, index 1, binding -1 deepD[1].d2.d1[3].va: offset 2480, type 8b50, size 3, index 1, binding -1 deepD[1].d2.d1[3].b: offset 2480, type 8b56, size 1, index 1, binding -1 deepD[1].v3: offset 2480, type 8b54, size 1, index 1, binding -1 -arrBl.foo: offset 0, type 1406, size 1, index 5, binding -1 -arrBl2.foo: offset 0, type 1406, size 1, index 6, binding -1 +foo1: offset 0, type 1406, size 1, index 4, binding -1 +foo2: offset 0, type 1406, size 1, index 5, binding -1 anonMember1: offset 0, type 8b51, size 1, index 0, binding -1 uf1: offset 16, type 1406, size 1, index 1, binding -1 Uniform block reflection: nameless: offset -1, type ffffffff, size 496, index -1, binding -1 $Global: offset -1, type ffffffff, size 3088, index -1, binding -1 -ablock: offset -1, type ffffffff, size 304, index -1, binding -1 c_nameless: offset -1, type ffffffff, size 96, index -1, binding -1 -nest: offset -1, type ffffffff, size 32, index -1, binding -1 -arrBl: offset -1, type ffffffff, size 4, index -1, binding -1 -arrBl2: offset -1, type ffffffff, size 4, index -1, binding -1 +nested: offset -1, type ffffffff, size 32, index -1, binding -1 +abl: offset -1, type ffffffff, size 4, index -1, binding -1 +abl2: offset -1, type ffffffff, size 4, index -1, binding -1 Vertex attribute reflection: attributeFloat: offset 0, type 1406, size 0, index 0, binding -1 diff --git a/Test/hlsl.buffer.frag b/Test/hlsl.buffer.frag index 1c112cf50..520de09e8 100644 --- a/Test/hlsl.buffer.frag +++ b/Test/hlsl.buffer.frag @@ -1,15 +1,15 @@ cbuffer buf1 { float4 v1; -}; +}; // extraneous ; tbuffer buf2 { float4 v2; -}; +}; // extraneous ; cbuffer cbufName { float4 v3 : packoffset(c0); int i3 : packoffset(c1.y); -} // no semicolon is okay +} tbuffer tbufName : register(t8) { float4 v4 : packoffset(c1); @@ -24,9 +24,14 @@ tbuffer tbufName : register(t8) { row_major float3x4 m2 : packoffset(c11); column_major float3x4 m3 : packoffset(c15); float3x4 m4 : packoffset(c19); -} // no semicolon is okay +} + +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; + return (input + v1 + v2 + v3 + v4) * foo(); } diff --git a/Test/hlsl.reflection.vert b/Test/hlsl.reflection.vert index 21cc81092..06207c74f 100644 --- a/Test/hlsl.reflection.vert +++ b/Test/hlsl.reflection.vert @@ -19,27 +19,10 @@ cbuffer c_nameless { float4 c_anonMember3; }; -cbuffer named { - float3 deadMember1; - int scalar; - float4 member2; - float4 member3; - float2 memfloat2; - float memf1; - bool memf2; - int memf3; - float2 memfloat2a; - float2x2 m22[7]; -} ablock; - cbuffer namelessdead { int a; }; -cbuffer namedDead { - int b; -} bblock; - struct N1 { float a; }; @@ -57,7 +40,7 @@ struct N3 { cbuffer nested { N3 foo; -} nest; +} struct TS { int a; @@ -89,16 +72,12 @@ struct deep3 { int3 v3; }; - - - uniform deep3 deepA[2], deepB[2], deepC[3], deepD[2]; const bool control = true; void deadFunction() { - float3 v3 = ablock.deadMember1; float4 v = anonDeadMember2; float f = ufDead4; } @@ -110,12 +89,12 @@ void liveFunction2() } tbuffer abl { - float foo; -} arrBl; + float foo1; +} tbuffer abl2 { - float foo; -} arrBl2; + float foo2; +} void flizv(in float attributeFloat, in float2 attributeFloat2, in float3 attributeFloat3, in float4 attributeFloat4, in float4x4 attributeMat4) { @@ -130,22 +109,16 @@ void flizv(in float attributeFloat, in float2 attributeFloat2, in float3 attribu liveFunction2(); f = anonMember3.z; f = s.a; - f = ablock.scalar; f = m23[1].y + scalarAfterm23; f = c_m23[1].y + c_scalarAfterm23; f += scalarBeforeArray; f += floatArray[2]; f += floatArray[4]; f += scalarAfterArray; - f += ablock.memfloat2.x; - f += ablock.memf1; - f += float(ablock.memf2); - f += ablock.memf3; - f += ablock.memfloat2a.y; - f += ablock.m22[i][1][0]; + f += m22[i][1][0]; f += dm22[3][0][1]; f += m22[2][1].y; - f += nest.foo.n1.a + nest.foo.n2.b + nest.foo.n2.c + nest.foo.n2.d; + f += foo.n1.a + foo.n2.b + foo.n2.c + foo.n2.d; f += deepA[i].d2.d1[2].va[1].x; f += deepB[1].d2.d1[i].va[1].x; f += deepB[i].d2.d1[i].va[1].x; @@ -154,8 +127,8 @@ void flizv(in float attributeFloat, in float2 attributeFloat2, in float3 attribu } else f = ufDead3; - f += arrBl.foo + arrBl.foo; - f += arrBl2.foo; + f += foo1 + foo2; + f += foo2; f += attributeFloat; f += attributeFloat2.x; diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index fd590f850..d8675f258 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -371,10 +371,16 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList) // if (acceptSamplerDeclarationDX9(declaredType)) // return true; + bool forbidDeclarators = (peekTokenClass(EHTokCBuffer) || peekTokenClass(EHTokTBuffer)); // fully_specified_type if (! acceptFullySpecifiedType(declaredType, nodeList)) return false; + // cbuffer and tbuffer end with the closing '}'. + // No semicolon is included. + if (forbidDeclarators) + return true; + // declarator_list // : declarator // : identifier @@ -489,7 +495,7 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList) // COMMA if (acceptTokenClass(EHTokComma)) declarator_list = true; - } + } // The top-level initializer node is a sequence. if (initializers != nullptr) @@ -501,18 +507,15 @@ bool HlslGrammar::acceptDeclaration(TIntermNode*& nodeList) else nodeList = initializers; - // SEMICOLON(optional for cbuffer/tbuffer) + // SEMICOLON if (! acceptTokenClass(EHTokSemicolon)) { + // This may have been a false detection of what appeared to be a declaration, but + // was actually an assignment such as "float = 4", where "float" is an identifier. + // We put the token back to let further parsing happen for cases where that may + // happen. This errors on the side of caution, and mostly triggers the error. if (peek() == EHTokAssign || peek() == EHTokLeftBracket || peek() == EHTokDot || peek() == EHTokComma) { - // This may have been a false detection of what appeared to be a declaration, but - // was actually an assignment such as "float = 4", where "float" is an identifier. - // We put the token back to let further parsing happen for cases where that may - // happen. This errors on the side of caution, and mostly triggers the error. recedeToken(); return false; - } else if (declaredType.getBasicType() == EbtBlock) { - // cbuffer, et. al. (but not struct) don't have an ending semicolon - return true; } else { expected(";"); return false; @@ -1904,10 +1907,10 @@ bool HlslGrammar::acceptStruct(TType& type, TIntermNode*& nodeList) bool readonly = false; if (acceptTokenClass(EHTokCBuffer)) { - // CBUFFER + // CBUFFER storageQualifier = EvqUniform; } else if (acceptTokenClass(EHTokTBuffer)) { - // TBUFFER + // TBUFFER storageQualifier = EvqBuffer; readonly = true; } else if (! acceptTokenClass(EHTokClass) && ! acceptTokenClass(EHTokStruct)) {