From 34e7ee79bb8e9a7ef2f35ed30308fb4f1a297368 Mon Sep 17 00:00:00 2001 From: John Kessenich Date: Fri, 16 Sep 2016 17:10:39 -0600 Subject: [PATCH] HLSL: Improve setting and testing of interpolation qualifiers. Notably, use of 'linear' on a non-input could mark it as an input. --- Test/baseResults/hlsl.struct.frag.out | 158 +++++++------ Test/baseResults/hlsl.structin.vert.out | 293 +++++++++++++++--------- Test/hlsl.struct.frag | 8 +- Test/hlsl.structin.vert | 9 +- glslang/Include/revision.h | 2 +- hlsl/hlslGrammar.cpp | 3 +- hlsl/hlslParseHelper.cpp | 8 +- hlsl/hlslParseHelper.h | 2 +- 8 files changed, 299 insertions(+), 184 deletions(-) diff --git a/Test/baseResults/hlsl.struct.frag.out b/Test/baseResults/hlsl.struct.frag.out index 4a5548f7..d5ddc6d2 100755 --- a/Test/baseResults/hlsl.struct.frag.out +++ b/Test/baseResults/hlsl.struct.frag.out @@ -6,9 +6,10 @@ WARNING: 0:30: 'register' : ignoring shader_profile Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:34 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float) +0:34 Function Definition: PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (global 4-component vector of float) 0:34 Function Parameters: 0:34 'input' (layout(location=0 ) in 4-component vector of float) +0:34 's' (in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float ff4}) 0:? Sequence 0:39 Compare Equal (temp bool) 0:39 's3' (temp structure{temp 3-component vector of bool b3}) @@ -18,10 +19,7 @@ gl_FragCoord origin is upper left 0:40 's2' (global structure{temp 4-component vector of float i}) 0:40 Constant: 0:40 0 (const int) -0:40 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float) -0:40 's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float ff4}) -0:40 Constant: -0:40 7 (const int) +0:? 'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float) 0:42 Sequence 0:42 move second child to first child (temp 4-component vector of float) 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) @@ -30,11 +28,18 @@ gl_FragCoord origin is upper left 0:? Linker Objects 0:? 's1' (global structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d}) 0:? 's2' (global structure{temp 4-component vector of float i}) -0:? 's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float ff4}) 0:? 'ff5' (layout(binding=5 offset=20 ) global 3-component vector of float) 0:? 'ff6' (layout(binding=8 offset=36 ) global 3-component vector of float) 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) 0:? 'input' (layout(location=0 ) in 4-component vector of float) +0:? 'a' (layout(location=1 ) smooth in 4-component vector of float) +0:? 'b' (layout(location=2 ) flat in bool) +0:? 'c' (layout(location=3 ) centroid noperspective in 1-component vector of float) +0:? 'd' (layout(location=4 ) centroid sample in 2-component vector of float) +0:? 'ff1' (in bool Face) +0:? 'ff2' (layout(location=5 offset=4 ) in bool) +0:? 'ff3' (layout(location=6 binding=0 offset=4 ) in bool) +0:? 'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float) Linked fragment stage: @@ -43,9 +48,10 @@ Linked fragment stage: Shader version: 450 gl_FragCoord origin is upper left 0:? Sequence -0:34 Function Definition: PixelShaderFunction(vf4; (global 4-component vector of float) +0:34 Function Definition: PixelShaderFunction(vf4;struct-IN_S-vf4-b1-vf1-vf2-b1-b1-b1-vf41; (global 4-component vector of float) 0:34 Function Parameters: 0:34 'input' (layout(location=0 ) in 4-component vector of float) +0:34 's' (in structure{smooth temp 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float ff4}) 0:? Sequence 0:39 Compare Equal (temp bool) 0:39 's3' (temp structure{temp 3-component vector of bool b3}) @@ -55,10 +61,7 @@ gl_FragCoord origin is upper left 0:40 's2' (global structure{temp 4-component vector of float i}) 0:40 Constant: 0:40 0 (const int) -0:40 ff4: direct index for structure (layout(binding=0 offset=4 ) temp 4-component vector of float) -0:40 's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float ff4}) -0:40 Constant: -0:40 7 (const int) +0:? 'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float) 0:42 Sequence 0:42 move second child to first child (temp 4-component vector of float) 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) @@ -67,20 +70,27 @@ gl_FragCoord origin is upper left 0:? Linker Objects 0:? 's1' (global structure{temp bool b, temp bool c, temp 4-component vector of float a, temp 4-component vector of float d}) 0:? 's2' (global structure{temp 4-component vector of float i}) -0:? 's4' (global structure{smooth in 4-component vector of float a, flat temp bool b, centroid noperspective temp 1-component vector of float c, centroid sample temp 2-component vector of float d, temp bool Face ff1, layout(offset=4 ) temp bool ff2, layout(binding=0 offset=4 ) temp bool ff3, layout(binding=0 offset=4 ) temp 4-component vector of float ff4}) 0:? 'ff5' (layout(binding=5 offset=20 ) global 3-component vector of float) 0:? 'ff6' (layout(binding=8 offset=36 ) global 3-component vector of float) 0:? '@entryPointOutput' (layout(location=0 ) out 4-component vector of float) 0:? 'input' (layout(location=0 ) in 4-component vector of float) +0:? 'a' (layout(location=1 ) smooth in 4-component vector of float) +0:? 'b' (layout(location=2 ) flat in bool) +0:? 'c' (layout(location=3 ) centroid noperspective in 1-component vector of float) +0:? 'd' (layout(location=4 ) centroid sample in 2-component vector of float) +0:? 'ff1' (in bool Face) +0:? 'ff2' (layout(location=5 offset=4 ) in bool) +0:? 'ff3' (layout(location=6 binding=0 offset=4 ) in bool) +0:? 'ff4' (layout(location=7 binding=0 offset=4 ) in 4-component vector of float) // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 46 +// Id's are bound by 52 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 4 "PixelShaderFunction" 34 36 + EntryPoint Fragment 4 "PixelShaderFunction" 25 30 31 41 43 45 48 49 50 51 ExecutionMode 4 OriginUpperLeft Name 4 "PixelShaderFunction" Name 8 "FS" @@ -89,33 +99,47 @@ gl_FragCoord origin is upper left Name 19 "" MemberName 19 0 "i" Name 21 "s2" - Name 25 "" - MemberName 25 0 "a" - MemberName 25 1 "b" - MemberName 25 2 "c" - MemberName 25 3 "d" - MemberName 25 4 "ff1" - MemberName 25 5 "ff2" - MemberName 25 6 "ff3" - MemberName 25 7 "ff4" - Name 27 "s4" - Name 34 "@entryPointOutput" - Name 36 "input" - Name 39 "myS" - MemberName 39(myS) 0 "b" - MemberName 39(myS) 1 "c" - MemberName 39(myS) 2 "a" - MemberName 39(myS) 3 "d" - Name 41 "s1" - Name 44 "ff5" - Name 45 "ff6" - MemberDecorate 25 4 BuiltIn FrontFacing - Decorate 34(@entryPointOutput) Location 0 - Decorate 36(input) Location 0 - Decorate 44(ff5) Offset 20 - Decorate 44(ff5) Binding 5 - Decorate 45(ff6) Offset 36 - Decorate 45(ff6) Binding 8 + Name 25 "ff4" + Name 30 "@entryPointOutput" + Name 31 "input" + Name 34 "myS" + MemberName 34(myS) 0 "b" + MemberName 34(myS) 1 "c" + MemberName 34(myS) 2 "a" + MemberName 34(myS) 3 "d" + Name 36 "s1" + Name 39 "ff5" + Name 40 "ff6" + Name 41 "a" + Name 43 "b" + Name 45 "c" + Name 48 "d" + Name 49 "ff1" + Name 50 "ff2" + Name 51 "ff3" + Decorate 25(ff4) Offset 4 + Decorate 25(ff4) Location 7 + Decorate 25(ff4) Binding 0 + Decorate 30(@entryPointOutput) Location 0 + Decorate 31(input) Location 0 + Decorate 39(ff5) Offset 20 + Decorate 39(ff5) Binding 5 + Decorate 40(ff6) Offset 36 + Decorate 40(ff6) Binding 8 + Decorate 41(a) Location 1 + Decorate 43(b) Flat + Decorate 43(b) Location 2 + Decorate 45(c) NoPerspective + Decorate 45(c) Centroid + Decorate 45(c) Location 3 + Decorate 48(d) Centroid + Decorate 48(d) Location 4 + Decorate 49(ff1) BuiltIn FrontFacing + Decorate 50(ff2) Offset 4 + Decorate 50(ff2) Location 5 + Decorate 51(ff3) Offset 4 + Decorate 51(ff3) Location 6 + Decorate 51(ff3) Binding 0 2: TypeVoid 3: TypeFunction 2 6: TypeBool @@ -129,23 +153,30 @@ gl_FragCoord origin is upper left 21(s2): 20(ptr) Variable Private 22: TypeInt 32 1 23: 22(int) Constant 0 - 24: TypeVector 17(float) 2 - 25: TypeStruct 18(fvec4) 6(bool) 17(float) 24(fvec2) 6(bool) 6(bool) 6(bool) 18(fvec4) - 26: TypePointer Private 25(struct) - 27(s4): 26(ptr) Variable Private - 28: 22(int) Constant 7 - 29: TypePointer Private 18(fvec4) - 33: TypePointer Output 18(fvec4) -34(@entryPointOutput): 33(ptr) Variable Output - 35: TypePointer Input 18(fvec4) - 36(input): 35(ptr) Variable Input - 39(myS): TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4) - 40: TypePointer Private 39(myS) - 41(s1): 40(ptr) Variable Private - 42: TypeVector 17(float) 3 - 43: TypePointer Private 42(fvec3) - 44(ff5): 43(ptr) Variable Private - 45(ff6): 43(ptr) Variable Private + 24: TypePointer Input 18(fvec4) + 25(ff4): 24(ptr) Variable Input + 27: TypePointer Private 18(fvec4) + 29: TypePointer Output 18(fvec4) +30(@entryPointOutput): 29(ptr) Variable Output + 31(input): 24(ptr) Variable Input + 34(myS): TypeStruct 6(bool) 6(bool) 18(fvec4) 18(fvec4) + 35: TypePointer Private 34(myS) + 36(s1): 35(ptr) Variable Private + 37: TypeVector 17(float) 3 + 38: TypePointer Private 37(fvec3) + 39(ff5): 38(ptr) Variable Private + 40(ff6): 38(ptr) Variable Private + 41(a): 24(ptr) Variable Input + 42: TypePointer Input 6(bool) + 43(b): 42(ptr) Variable Input + 44: TypePointer Input 17(float) + 45(c): 44(ptr) Variable Input + 46: TypeVector 17(float) 2 + 47: TypePointer Input 46(fvec2) + 48(d): 47(ptr) Variable Input + 49(ff1): 42(ptr) Variable Input + 50(ff2): 42(ptr) Variable Input + 51(ff3): 42(ptr) Variable Input 4(PixelShaderFunction): 2 Function None 3 5: Label 10(s3): 9(ptr) Variable Function @@ -155,11 +186,10 @@ gl_FragCoord origin is upper left 14: 7(bvec3) CompositeExtract 12 0 15: 7(bvec3) LogicalEqual 13 14 16: 6(bool) All 15 - 30: 29(ptr) AccessChain 27(s4) 28 - 31: 18(fvec4) Load 30 - 32: 29(ptr) AccessChain 21(s2) 23 - Store 32 31 - 37: 18(fvec4) Load 36(input) - Store 34(@entryPointOutput) 37 + 26: 18(fvec4) Load 25(ff4) + 28: 27(ptr) AccessChain 21(s2) 23 + Store 28 26 + 32: 18(fvec4) Load 31(input) + Store 30(@entryPointOutput) 32 Return FunctionEnd diff --git a/Test/baseResults/hlsl.structin.vert.out b/Test/baseResults/hlsl.structin.vert.out index 48d9f29e..9452b4a4 100755 --- a/Test/baseResults/hlsl.structin.vert.out +++ b/Test/baseResults/hlsl.structin.vert.out @@ -1,42 +1,67 @@ hlsl.structin.vert Shader version: 450 0:? Sequence -0:7 Function Definition: main(vf4;struct-VI-vf4[2]-vu21;vf4; (global 4-component vector of float Position) -0:7 Function Parameters: -0:7 'd' (layout(location=0 ) in 4-component vector of float) -0:7 'vi' (in structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord}) -0:7 'e' (layout(location=4 ) in 4-component vector of float) +0:8 Function Definition: main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; (global structure Position{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:8 Function Parameters: +0:8 'd' (layout(location=0 ) in 4-component vector of float) +0:8 'vi' (in structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:8 'e' (layout(location=5 ) in 4-component vector of float) 0:? Sequence -0:8 Sequence -0:8 move second child to first child (temp 4-component vector of float) -0:? '@entryPointOutput' (out 4-component vector of float Position) -0:8 add (temp 4-component vector of float) -0:8 add (temp 4-component vector of float) -0:8 add (temp 4-component vector of float) -0:8 add (temp 4-component vector of float) -0:8 direct index (layout(location=1 ) temp 4-component vector of float) -0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) -0:8 Constant: -0:8 1 (const int) -0:8 direct index (layout(location=1 ) temp 4-component vector of float) -0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) -0:8 Constant: -0:8 0 (const int) -0:8 Construct vec4 (temp 4-component vector of float) -0:8 Convert uint to float (temp float) -0:8 direct index (temp uint) -0:? 'coord' (layout(location=3 ) in 2-component vector of uint) -0:8 Constant: -0:8 0 (const int) -0:8 'd' (layout(location=0 ) in 4-component vector of float) -0:8 'e' (layout(location=4 ) in 4-component vector of float) -0:8 Branch: Return +0:11 move second child to first child (temp 4-component vector of float) +0:11 b: direct index for structure (smooth temp 4-component vector of float) +0:11 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:11 Constant: +0:11 2 (const int) +0:11 add (temp 4-component vector of float) +0:11 add (temp 4-component vector of float) +0:11 add (temp 4-component vector of float) +0:11 add (temp 4-component vector of float) +0:11 direct index (layout(location=1 ) temp 4-component vector of float) +0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) +0:11 Constant: +0:11 1 (const int) +0:11 direct index (layout(location=1 ) temp 4-component vector of float) +0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) +0:11 Constant: +0:11 0 (const int) +0:11 Construct vec4 (temp 4-component vector of float) +0:11 Convert uint to float (temp float) +0:11 direct index (temp uint) +0:? 'coord' (layout(location=3 ) in 2-component vector of uint) +0:11 Constant: +0:11 0 (const int) +0:11 'd' (layout(location=0 ) in 4-component vector of float) +0:11 'e' (layout(location=5 ) in 4-component vector of float) +0:? Sequence +0:? Sequence +0:13 move second child to first child (temp 2-element array of 4-component vector of float) +0:? 'm' (layout(location=0 ) out 2-element array of 4-component vector of float) +0:13 m: direct index for structure (temp 2-element array of 4-component vector of float) +0:13 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:13 Constant: +0:13 0 (const int) +0:13 move second child to first child (temp 2-component vector of uint) +0:? 'coord' (layout(location=2 ) out 2-component vector of uint) +0:13 coord: direct index for structure (temp 2-component vector of uint) +0:13 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:13 Constant: +0:13 1 (const int) +0:13 move second child to first child (temp 4-component vector of float) +0:? 'b' (layout(location=3 ) smooth out 4-component vector of float) +0:13 b: direct index for structure (smooth temp 4-component vector of float) +0:13 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:13 Constant: +0:13 2 (const int) +0:13 Branch: Return 0:? Linker Objects -0:? '@entryPointOutput' (out 4-component vector of float Position) +0:? 'm' (layout(location=0 ) out 2-element array of 4-component vector of float) +0:? 'coord' (layout(location=2 ) out 2-component vector of uint) +0:? 'b' (layout(location=3 ) smooth out 4-component vector of float) 0:? 'd' (layout(location=0 ) in 4-component vector of float) 0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) 0:? 'coord' (layout(location=3 ) in 2-component vector of uint) -0:? 'e' (layout(location=4 ) in 4-component vector of float) +0:? 'b' (layout(location=4 ) smooth in 4-component vector of float) +0:? 'e' (layout(location=5 ) in 4-component vector of float) Linked vertex stage: @@ -44,100 +69,158 @@ Linked vertex stage: Shader version: 450 0:? Sequence -0:7 Function Definition: main(vf4;struct-VI-vf4[2]-vu21;vf4; (global 4-component vector of float Position) -0:7 Function Parameters: -0:7 'd' (layout(location=0 ) in 4-component vector of float) -0:7 'vi' (in structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord}) -0:7 'e' (layout(location=4 ) in 4-component vector of float) +0:8 Function Definition: main(vf4;struct-VI-vf4[2]-vu2-vf41;vf4; (global structure Position{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:8 Function Parameters: +0:8 'd' (layout(location=0 ) in 4-component vector of float) +0:8 'vi' (in structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:8 'e' (layout(location=5 ) in 4-component vector of float) 0:? Sequence -0:8 Sequence -0:8 move second child to first child (temp 4-component vector of float) -0:? '@entryPointOutput' (out 4-component vector of float Position) -0:8 add (temp 4-component vector of float) -0:8 add (temp 4-component vector of float) -0:8 add (temp 4-component vector of float) -0:8 add (temp 4-component vector of float) -0:8 direct index (layout(location=1 ) temp 4-component vector of float) -0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) -0:8 Constant: -0:8 1 (const int) -0:8 direct index (layout(location=1 ) temp 4-component vector of float) -0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) -0:8 Constant: -0:8 0 (const int) -0:8 Construct vec4 (temp 4-component vector of float) -0:8 Convert uint to float (temp float) -0:8 direct index (temp uint) -0:? 'coord' (layout(location=3 ) in 2-component vector of uint) -0:8 Constant: -0:8 0 (const int) -0:8 'd' (layout(location=0 ) in 4-component vector of float) -0:8 'e' (layout(location=4 ) in 4-component vector of float) -0:8 Branch: Return +0:11 move second child to first child (temp 4-component vector of float) +0:11 b: direct index for structure (smooth temp 4-component vector of float) +0:11 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:11 Constant: +0:11 2 (const int) +0:11 add (temp 4-component vector of float) +0:11 add (temp 4-component vector of float) +0:11 add (temp 4-component vector of float) +0:11 add (temp 4-component vector of float) +0:11 direct index (layout(location=1 ) temp 4-component vector of float) +0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) +0:11 Constant: +0:11 1 (const int) +0:11 direct index (layout(location=1 ) temp 4-component vector of float) +0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) +0:11 Constant: +0:11 0 (const int) +0:11 Construct vec4 (temp 4-component vector of float) +0:11 Convert uint to float (temp float) +0:11 direct index (temp uint) +0:? 'coord' (layout(location=3 ) in 2-component vector of uint) +0:11 Constant: +0:11 0 (const int) +0:11 'd' (layout(location=0 ) in 4-component vector of float) +0:11 'e' (layout(location=5 ) in 4-component vector of float) +0:? Sequence +0:? Sequence +0:13 move second child to first child (temp 2-element array of 4-component vector of float) +0:? 'm' (layout(location=0 ) out 2-element array of 4-component vector of float) +0:13 m: direct index for structure (temp 2-element array of 4-component vector of float) +0:13 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:13 Constant: +0:13 0 (const int) +0:13 move second child to first child (temp 2-component vector of uint) +0:? 'coord' (layout(location=2 ) out 2-component vector of uint) +0:13 coord: direct index for structure (temp 2-component vector of uint) +0:13 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:13 Constant: +0:13 1 (const int) +0:13 move second child to first child (temp 4-component vector of float) +0:? 'b' (layout(location=3 ) smooth out 4-component vector of float) +0:13 b: direct index for structure (smooth temp 4-component vector of float) +0:13 'local' (temp structure{temp 2-element array of 4-component vector of float m, temp 2-component vector of uint coord, smooth temp 4-component vector of float b}) +0:13 Constant: +0:13 2 (const int) +0:13 Branch: Return 0:? Linker Objects -0:? '@entryPointOutput' (out 4-component vector of float Position) +0:? 'm' (layout(location=0 ) out 2-element array of 4-component vector of float) +0:? 'coord' (layout(location=2 ) out 2-component vector of uint) +0:? 'b' (layout(location=3 ) smooth out 4-component vector of float) 0:? 'd' (layout(location=0 ) in 4-component vector of float) 0:? 'm' (layout(location=1 ) in 2-element array of 4-component vector of float) 0:? 'coord' (layout(location=3 ) in 2-component vector of uint) -0:? 'e' (layout(location=4 ) in 4-component vector of float) +0:? 'b' (layout(location=4 ) smooth in 4-component vector of float) +0:? 'e' (layout(location=5 ) in 4-component vector of float) // Module Version 10000 // Generated by (magic number): 80001 -// Id's are bound by 41 +// Id's are bound by 60 Capability Shader 1: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Vertex 4 "main" 9 14 26 34 37 + EntryPoint Vertex 4 "main" 18 28 36 39 45 50 55 59 Name 4 "main" - Name 9 "@entryPointOutput" - Name 14 "m" - Name 26 "coord" - Name 34 "d" - Name 37 "e" - Decorate 9(@entryPointOutput) BuiltIn Position - Decorate 14(m) Location 1 - Decorate 26(coord) Location 3 - Decorate 34(d) Location 0 - Decorate 37(e) Location 4 + Name 12 "VI" + MemberName 12(VI) 0 "m" + MemberName 12(VI) 1 "coord" + MemberName 12(VI) 2 "b" + Name 14 "local" + Name 18 "m" + Name 28 "coord" + Name 36 "d" + Name 39 "e" + Name 45 "m" + Name 50 "coord" + Name 55 "b" + Name 59 "b" + Decorate 18(m) Location 1 + Decorate 28(coord) Location 3 + Decorate 36(d) Location 0 + Decorate 39(e) Location 5 + Decorate 45(m) Location 0 + Decorate 50(coord) Location 2 + Decorate 55(b) Location 3 + Decorate 59(b) Location 4 2: TypeVoid 3: TypeFunction 2 6: TypeFloat 32 7: TypeVector 6(float) 4 - 8: TypePointer Output 7(fvec4) -9(@entryPointOutput): 8(ptr) Variable Output - 10: TypeInt 32 0 - 11: 10(int) Constant 2 - 12: TypeArray 7(fvec4) 11 - 13: TypePointer Input 12 - 14(m): 13(ptr) Variable Input + 8: TypeInt 32 0 + 9: 8(int) Constant 2 + 10: TypeArray 7(fvec4) 9 + 11: TypeVector 8(int) 2 + 12(VI): TypeStruct 10 11(ivec2) 7(fvec4) + 13: TypePointer Function 12(VI) 15: TypeInt 32 1 - 16: 15(int) Constant 1 - 17: TypePointer Input 7(fvec4) - 20: 15(int) Constant 0 - 24: TypeVector 10(int) 2 - 25: TypePointer Input 24(ivec2) - 26(coord): 25(ptr) Variable Input - 27: 10(int) Constant 0 - 28: TypePointer Input 10(int) - 34(d): 17(ptr) Variable Input - 37(e): 17(ptr) Variable Input + 16: 15(int) Constant 2 + 17: TypePointer Input 10 + 18(m): 17(ptr) Variable Input + 19: 15(int) Constant 1 + 20: TypePointer Input 7(fvec4) + 23: 15(int) Constant 0 + 27: TypePointer Input 11(ivec2) + 28(coord): 27(ptr) Variable Input + 29: 8(int) Constant 0 + 30: TypePointer Input 8(int) + 36(d): 20(ptr) Variable Input + 39(e): 20(ptr) Variable Input + 42: TypePointer Function 7(fvec4) + 44: TypePointer Output 10 + 45(m): 44(ptr) Variable Output + 46: TypePointer Function 10 + 49: TypePointer Output 11(ivec2) + 50(coord): 49(ptr) Variable Output + 51: TypePointer Function 11(ivec2) + 54: TypePointer Output 7(fvec4) + 55(b): 54(ptr) Variable Output + 59(b): 20(ptr) Variable Input 4(main): 2 Function None 3 5: Label - 18: 17(ptr) AccessChain 14(m) 16 - 19: 7(fvec4) Load 18 - 21: 17(ptr) AccessChain 14(m) 20 + 14(local): 13(ptr) Variable Function + 21: 20(ptr) AccessChain 18(m) 19 22: 7(fvec4) Load 21 - 23: 7(fvec4) FAdd 19 22 - 29: 28(ptr) AccessChain 26(coord) 27 - 30: 10(int) Load 29 - 31: 6(float) ConvertUToF 30 - 32: 7(fvec4) CompositeConstruct 31 31 31 31 - 33: 7(fvec4) FAdd 23 32 - 35: 7(fvec4) Load 34(d) - 36: 7(fvec4) FAdd 33 35 - 38: 7(fvec4) Load 37(e) - 39: 7(fvec4) FAdd 36 38 - Store 9(@entryPointOutput) 39 + 24: 20(ptr) AccessChain 18(m) 23 + 25: 7(fvec4) Load 24 + 26: 7(fvec4) FAdd 22 25 + 31: 30(ptr) AccessChain 28(coord) 29 + 32: 8(int) Load 31 + 33: 6(float) ConvertUToF 32 + 34: 7(fvec4) CompositeConstruct 33 33 33 33 + 35: 7(fvec4) FAdd 26 34 + 37: 7(fvec4) Load 36(d) + 38: 7(fvec4) FAdd 35 37 + 40: 7(fvec4) Load 39(e) + 41: 7(fvec4) FAdd 38 40 + 43: 42(ptr) AccessChain 14(local) 16 + Store 43 41 + 47: 46(ptr) AccessChain 14(local) 23 + 48: 10 Load 47 + Store 45(m) 48 + 52: 51(ptr) AccessChain 14(local) 19 + 53: 11(ivec2) Load 52 + Store 50(coord) 53 + 56: 42(ptr) AccessChain 14(local) 16 + 57: 7(fvec4) Load 56 + Store 55(b) 57 Return FunctionEnd diff --git a/Test/hlsl.struct.frag b/Test/hlsl.struct.frag index c76f3349..58cd524b 100644 --- a/Test/hlsl.struct.frag +++ b/Test/hlsl.struct.frag @@ -16,7 +16,7 @@ struct { float4 i; } s2; -struct { +struct IN_S { linear float4 a; nointerpolation bool b; noperspective centroid float1 c; @@ -25,19 +25,19 @@ struct { bool ff2 : packoffset(c0.y); bool ff3 : packoffset(c0.y) : register(ps_5_0, s0) ; float4 ff4 : VPOS : packoffset(c0.y) : register(ps_5_0, s0) ; -} s4; +}; float3 ff5 : packoffset(c1.y) : register(ps_5_0, s[5]); float3 ff6 : packoffset(c2.y) : register(s3[5]); -float4 PixelShaderFunction(float4 input) : COLOR0 +float4 PixelShaderFunction(float4 input, IN_S s) : COLOR0 { struct FS { bool3 b3; } s3; s3 == s3; - s2.i = s4.ff4; + s2.i = s.ff4; return input; } \ No newline at end of file diff --git a/Test/hlsl.structin.vert b/Test/hlsl.structin.vert index 424624a4..7eba552d 100644 --- a/Test/hlsl.structin.vert +++ b/Test/hlsl.structin.vert @@ -1,9 +1,14 @@ struct VI { float4 m[2]; uint2 coord; + linear float4 b; }; -float4 main(float4 d, VI vi, float4 e) : SV_POSITION +VI main(float4 d, VI vi, float4 e) : SV_POSITION { - return vi.m[1] + vi.m[0] + float4(vi.coord.x) + d + e; + VI local; + + local.b = vi.m[1] + vi.m[0] + float4(vi.coord.x) + d + e; + + return local; } \ No newline at end of file diff --git a/glslang/Include/revision.h b/glslang/Include/revision.h index 5ffcb46b..b1618c5c 100644 --- a/glslang/Include/revision.h +++ b/glslang/Include/revision.h @@ -2,5 +2,5 @@ // 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). -#define GLSLANG_REVISION "Overload400-PrecQual.1489" +#define GLSLANG_REVISION "Overload400-PrecQual.1490" #define GLSLANG_DATE "16-Sep-2016" diff --git a/hlsl/hlslGrammar.cpp b/hlsl/hlslGrammar.cpp index d0ff3cdb..cc7e9010 100755 --- a/hlsl/hlslGrammar.cpp +++ b/hlsl/hlslGrammar.cpp @@ -435,7 +435,7 @@ bool HlslGrammar::acceptFullySpecifiedType(TType& type) return false; if (type.getBasicType() == EbtBlock) { // the type was a block, which set some parts of the qualifier - parseContext.mergeQualifiers(loc, type.getQualifier(), qualifier, true); + parseContext.mergeQualifiers(type.getQualifier(), qualifier); // further, it can create an anonymous instance of the block if (peekTokenClass(EHTokSemicolon)) parseContext.declareBlock(loc, type); @@ -476,7 +476,6 @@ bool HlslGrammar::acceptQualifier(TQualifier& qualifier) qualifier.volatil = true; break; case EHTokLinear: - qualifier.storage = EvqVaryingIn; qualifier.smooth = true; break; case EHTokCentroid: diff --git a/hlsl/hlslParseHelper.cpp b/hlsl/hlslParseHelper.cpp index d97bf2a2..1b0cb345 100755 --- a/hlsl/hlslParseHelper.cpp +++ b/hlsl/hlslParseHelper.cpp @@ -728,7 +728,7 @@ void HlslParseContext::flattenStruct(const TVariable& variable) for (int member = 0; member < (int)members.size(); ++member) { TVariable* memberVariable = makeInternalVariable(members[member].type->getFieldName().c_str(), *members[member].type); - memberVariable->getWritableType().getQualifier().storage = variable.getType().getQualifier().storage; + mergeQualifiers(memberVariable->getWritableType().getQualifier(), variable.getType().getQualifier()); memberVariables.push_back(memberVariable); } @@ -3049,7 +3049,7 @@ void HlslParseContext::globalQualifierFix(const TSourceLoc&, TQualifier& qualifi // 'dst', for the purpose of error checking order for versions // that require specific orderings of qualifiers. // -void HlslParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, const TQualifier& src, bool force) +void HlslParseContext::mergeQualifiers(TQualifier& dst, const TQualifier& src) { // Storage qualification if (dst.storage == EvqTemporary || dst.storage == EvqGlobal) @@ -3060,8 +3060,6 @@ void HlslParseContext::mergeQualifiers(const TSourceLoc& loc, TQualifier& dst, c else if ((dst.storage == EvqIn && src.storage == EvqConst) || (dst.storage == EvqConst && src.storage == EvqIn)) dst.storage = EvqConstReadOnly; - else if (src.storage != EvqTemporary && src.storage != EvqGlobal) - error(loc, "too many storage qualifiers", GetStorageQualifierString(src.storage), ""); // Layout qualifiers mergeObjectLayoutQualifiers(dst, src, false); @@ -4586,7 +4584,7 @@ void HlslParseContext::declareBlock(const TSourceLoc& loc, TType& type, const TS } TQualifier newMemberQualification = defaultQualification; - mergeQualifiers(memberLoc, newMemberQualification, memberQualifier, false); + mergeQualifiers(newMemberQualification, memberQualifier); memberQualifier = newMemberQualification; } diff --git a/hlsl/hlslParseHelper.h b/hlsl/hlslParseHelper.h index ccdf771c..d54c373f 100755 --- a/hlsl/hlslParseHelper.h +++ b/hlsl/hlslParseHelper.h @@ -129,7 +129,7 @@ public: void boolCheck(const TSourceLoc&, const TIntermTyped*); void globalQualifierFix(const TSourceLoc&, TQualifier&); bool structQualifierErrorCheck(const TSourceLoc&, const TPublicType& pType); - void mergeQualifiers(const TSourceLoc&, TQualifier& dst, const TQualifier& src, bool force); + void mergeQualifiers(TQualifier& dst, const TQualifier& src); int computeSamplerTypeIndex(TSampler&); TSymbol* redeclareBuiltinVariable(const TSourceLoc&, const TString&, const TQualifier&, const TShaderQualifiers&, bool& newDeclaration); void redeclareBuiltinBlock(const TSourceLoc&, TTypeList& typeList, const TString& blockName, const TString* instanceName, TArraySizes* arraySizes);