HLSL: Remove workarounds for assigning to opaques.
authorJohn Kessenich <cepheus@frii.com>
Thu, 7 Sep 2017 10:33:11 +0000 (04:33 -0600)
committerGregF <greg@LunarG.com>
Fri, 29 Sep 2017 15:53:24 +0000 (09:53 -0600)
This assumes it will be combined with optimizing transforms
that eliminate assignments to opaques.

Test/baseResults/hlsl.aliasOpaque.frag.out
Test/baseResults/hlsl.array.flatten.frag.out
Test/baseResults/hlsl.flattenOpaqueInit.vert.out
Test/baseResults/hlsl.flattenOpaqueInitMix.vert.out
glslang/MachineIndependent/localintermediate.h
hlsl/hlslParseHelper.cpp
hlsl/hlslParseHelper.h

index 222322e..aa40170 100755 (executable)
@@ -1,4 +1,5 @@
 hlsl.aliasOpaque.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
@@ -21,18 +22,24 @@ gl_FragCoord origin is upper left
 0:17  Function Definition: @main( ( temp 4-component vector of float)
 0:17    Function Parameters: 
 0:?     Sequence
-0:19      'gss2' ( uniform sampler)
-0:20      'gss' ( uniform sampler)
-0:21      'gtex' ( uniform texture2D)
+0:19      move second child to first child ( temp sampler)
+0:?         'os.ss' ( temp sampler)
+0:19        'gss2' ( uniform sampler)
+0:20      move second child to first child ( temp sampler)
+0:?         'os.ss' ( temp sampler)
+0:20        'gss' ( uniform sampler)
+0:21      move second child to first child ( temp texture2D)
+0:?         'os.tex' ( temp texture2D)
+0:21        'gtex' ( uniform texture2D)
 0:22      move second child to first child ( temp float)
 0:?         'os.a' ( temp float)
 0:22        Constant:
 0:22          3.000000
 0:28      Branch: Return with expression
 0:28        Function Call: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
-0:?           'gss' ( uniform sampler)
+0:?           'os.ss' ( temp sampler)
 0:?           'os.a' ( temp float)
-0:?           'gtex' ( uniform texture2D)
+0:?           'os.tex' ( temp texture2D)
 0:17  Function Definition: main( ( temp void)
 0:17    Function Parameters: 
 0:?     Sequence
@@ -71,18 +78,24 @@ gl_FragCoord origin is upper left
 0:17  Function Definition: @main( ( temp 4-component vector of float)
 0:17    Function Parameters: 
 0:?     Sequence
-0:19      'gss2' ( uniform sampler)
-0:20      'gss' ( uniform sampler)
-0:21      'gtex' ( uniform texture2D)
+0:19      move second child to first child ( temp sampler)
+0:?         'os.ss' ( temp sampler)
+0:19        'gss2' ( uniform sampler)
+0:20      move second child to first child ( temp sampler)
+0:?         'os.ss' ( temp sampler)
+0:20        'gss' ( uniform sampler)
+0:21      move second child to first child ( temp texture2D)
+0:?         'os.tex' ( temp texture2D)
+0:21        'gtex' ( uniform texture2D)
 0:22      move second child to first child ( temp float)
 0:?         'os.a' ( temp float)
 0:22        Constant:
 0:22          3.000000
 0:28      Branch: Return with expression
 0:28        Function Call: osCall(struct-OS-p1-f1-t211; ( temp 4-component vector of float)
-0:?           'gss' ( uniform sampler)
+0:?           'os.ss' ( temp sampler)
 0:?           'os.a' ( temp float)
-0:?           'gtex' ( uniform texture2D)
+0:?           'os.tex' ( temp texture2D)
 0:17  Function Definition: main( ( temp void)
 0:17    Function Parameters: 
 0:?     Sequence
@@ -97,12 +110,12 @@ gl_FragCoord origin is upper left
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 48
+// Id's are bound by 53
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 46
+                              EntryPoint Fragment 4  "main" 51
                               ExecutionMode 4 OriginUpperLeft
                               Source HLSL 500
                               Name 4  "main"
@@ -111,16 +124,18 @@ gl_FragCoord origin is upper left
                               Name 15  "s.a"
                               Name 16  "s.tex"
                               Name 20  "@main("
-                              Name 35  "gss2"
-                              Name 36  "gss"
-                              Name 37  "gtex"
-                              Name 38  "os.a"
-                              Name 40  "param"
-                              Name 46  "@entryPointOutput"
-                              Decorate 35(gss2) DescriptorSet 0
-                              Decorate 36(gss) DescriptorSet 0
-                              Decorate 37(gtex) DescriptorSet 0
-                              Decorate 46(@entryPointOutput) Location 0
+                              Name 35  "os.ss"
+                              Name 36  "gss2"
+                              Name 38  "gss"
+                              Name 40  "os.tex"
+                              Name 41  "gtex"
+                              Name 43  "os.a"
+                              Name 45  "param"
+                              Name 51  "@entryPointOutput"
+                              Decorate 36(gss2) DescriptorSet 0
+                              Decorate 38(gss) DescriptorSet 0
+                              Decorate 41(gtex) DescriptorSet 0
+                              Decorate 51(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeSampler
@@ -137,16 +152,18 @@ gl_FragCoord origin is upper left
               28:    8(float) Constant 1045220557
               29:    8(float) Constant 1050253722
               30:   27(fvec2) ConstantComposite 28 29
-        35(gss2):      7(ptr) Variable UniformConstant
-         36(gss):      7(ptr) Variable UniformConstant
-        37(gtex):     11(ptr) Variable UniformConstant
-              39:    8(float) Constant 1077936128
-              45:             TypePointer Output 12(fvec4)
-46(@entryPointOutput):     45(ptr) Variable Output
+       35(os.ss):      7(ptr) Variable UniformConstant
+        36(gss2):      7(ptr) Variable UniformConstant
+         38(gss):      7(ptr) Variable UniformConstant
+      40(os.tex):     11(ptr) Variable UniformConstant
+        41(gtex):     11(ptr) Variable UniformConstant
+              44:    8(float) Constant 1077936128
+              50:             TypePointer Output 12(fvec4)
+51(@entryPointOutput):     50(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              47:   12(fvec4) FunctionCall 20(@main()
-                              Store 46(@entryPointOutput) 47
+              52:   12(fvec4) FunctionCall 20(@main()
+                              Store 51(@entryPointOutput) 52
                               Return
                               FunctionEnd
 17(osCall(struct-OS-p1-f1-t211;):   12(fvec4) Function None 13
@@ -164,11 +181,17 @@ gl_FragCoord origin is upper left
                               FunctionEnd
       20(@main():   12(fvec4) Function None 19
               21:             Label
-        38(os.a):      9(ptr) Variable Function
-       40(param):      9(ptr) Variable Function
-                              Store 38(os.a) 39
-              41:    8(float) Load 38(os.a)
-                              Store 40(param) 41
-              42:   12(fvec4) FunctionCall 17(osCall(struct-OS-p1-f1-t211;) 36(gss) 40(param) 37(gtex)
-                              ReturnValue 42
+        43(os.a):      9(ptr) Variable Function
+       45(param):      9(ptr) Variable Function
+              37:           6 Load 36(gss2)
+                              Store 35(os.ss) 37
+              39:           6 Load 38(gss)
+                              Store 35(os.ss) 39
+              42:          10 Load 41(gtex)
+                              Store 40(os.tex) 42
+                              Store 43(os.a) 44
+              46:    8(float) Load 43(os.a)
+                              Store 45(param) 46
+              47:   12(fvec4) FunctionCall 17(osCall(struct-OS-p1-f1-t211;) 35(os.ss) 45(param) 40(os.tex)
+                              ReturnValue 47
                               FunctionEnd
index 0129ede..7479027 100644 (file)
@@ -1,4 +1,5 @@
 hlsl.array.flatten.frag
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
 Shader version: 500
 gl_FragCoord origin is upper left
 0:? Sequence
index 4bd3161..f42d583 100755 (executable)
@@ -1,6 +1,5 @@
 hlsl.flattenOpaqueInit.vert
-WARNING: 0:20: '=' : cannot do member-wise aliasing for opaque members with this initializer 
-
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
 Shader version: 500
 0:? Sequence
 0:5  Function Definition: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
@@ -19,13 +18,36 @@ Shader version: 500
 0:10  Function Definition: fillOpaque( ( temp structure{ temp sampler smpl,  temp texture2D tex})
 0:10    Function Parameters: 
 0:?     Sequence
-0:12      'g_tInputTexture_sampler' ( uniform sampler)
-0:13      'g_tInputTexture' ( uniform texture2D)
+0:12      move second child to first child ( temp sampler)
+0:?         't.smpl' ( temp sampler)
+0:12        'g_tInputTexture_sampler' ( uniform sampler)
+0:13      move second child to first child ( temp texture2D)
+0:?         't.tex' ( temp texture2D)
+0:13        'g_tInputTexture' ( uniform texture2D)
 0:14      Branch: Return with expression
 0:14        't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
 0:18  Function Definition: @main( ( temp 4-component vector of float)
 0:18    Function Parameters: 
 0:?     Sequence
+0:19      Sequence
+0:19        Sequence
+0:19          move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19            'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19            Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19              'g_tInputTexture_sampler' ( uniform sampler)
+0:19              'g_tInputTexture' ( uniform texture2D)
+0:19          move second child to first child ( temp sampler)
+0:?             'tex1.smpl' ( temp sampler)
+0:19            smpl: direct index for structure ( temp sampler)
+0:19              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19              Constant:
+0:19                0 (const int)
+0:19          move second child to first child ( temp texture2D)
+0:?             'tex1.tex' ( temp texture2D)
+0:19            tex: direct index for structure ( temp texture2D)
+0:19              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19              Constant:
+0:19                1 (const int)
 0:20      Sequence
 0:20        Sequence
 0:20          move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
@@ -45,8 +67,8 @@ Shader version: 500
 0:20                1 (const int)
 0:21      Branch: Return with expression
 0:21        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
-0:?           'g_tInputTexture_sampler' ( uniform sampler)
-0:?           'g_tInputTexture' ( uniform texture2D)
+0:?           'tex1.smpl' ( temp sampler)
+0:?           'tex1.tex' ( temp texture2D)
 0:18  Function Definition: main( ( temp void)
 0:18    Function Parameters: 
 0:?     Sequence
@@ -80,13 +102,36 @@ Shader version: 500
 0:10  Function Definition: fillOpaque( ( temp structure{ temp sampler smpl,  temp texture2D tex})
 0:10    Function Parameters: 
 0:?     Sequence
-0:12      'g_tInputTexture_sampler' ( uniform sampler)
-0:13      'g_tInputTexture' ( uniform texture2D)
+0:12      move second child to first child ( temp sampler)
+0:?         't.smpl' ( temp sampler)
+0:12        'g_tInputTexture_sampler' ( uniform sampler)
+0:13      move second child to first child ( temp texture2D)
+0:?         't.tex' ( temp texture2D)
+0:13        'g_tInputTexture' ( uniform texture2D)
 0:14      Branch: Return with expression
 0:14        't' ( temp structure{ temp sampler smpl,  temp texture2D tex})
 0:18  Function Definition: @main( ( temp 4-component vector of float)
 0:18    Function Parameters: 
 0:?     Sequence
+0:19      Sequence
+0:19        Sequence
+0:19          move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19            'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19            Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19              'g_tInputTexture_sampler' ( uniform sampler)
+0:19              'g_tInputTexture' ( uniform texture2D)
+0:19          move second child to first child ( temp sampler)
+0:?             'tex1.smpl' ( temp sampler)
+0:19            smpl: direct index for structure ( temp sampler)
+0:19              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19              Constant:
+0:19                0 (const int)
+0:19          move second child to first child ( temp texture2D)
+0:?             'tex1.tex' ( temp texture2D)
+0:19            tex: direct index for structure ( temp texture2D)
+0:19              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
+0:19              Constant:
+0:19                1 (const int)
 0:20      Sequence
 0:20        Sequence
 0:20          move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex})
@@ -106,8 +151,8 @@ Shader version: 500
 0:20                1 (const int)
 0:21      Branch: Return with expression
 0:21        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
-0:?           'g_tInputTexture_sampler' ( uniform sampler)
-0:?           'g_tInputTexture' ( uniform texture2D)
+0:?           'tex1.smpl' ( temp sampler)
+0:?           'tex1.tex' ( temp texture2D)
 0:18  Function Definition: main( ( temp void)
 0:18    Function Parameters: 
 0:?     Sequence
@@ -121,12 +166,12 @@ Shader version: 500
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 60
+// Id's are bound by 74
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 58
+                              EntryPoint Vertex 4  "main" 72
                               Source HLSL 500
                               Name 4  "main"
                               Name 15  "lookUp(struct-FxaaTex-p1-t211;"
@@ -137,16 +182,21 @@ Shader version: 500
                               MemberName 17(FxaaTex) 1  "tex"
                               Name 19  "fillOpaque("
                               Name 22  "@main("
-                              Name 36  "g_tInputTexture_sampler"
-                              Name 37  "g_tInputTexture"
-                              Name 39  "t"
-                              Name 43  "flattenTemp"
-                              Name 45  "tex2.smpl"
-                              Name 50  "tex2.tex"
-                              Name 58  "@entryPointOutput"
-                              Decorate 36(g_tInputTexture_sampler) DescriptorSet 0
-                              Decorate 37(g_tInputTexture) DescriptorSet 0
-                              Decorate 58(@entryPointOutput) Location 0
+                              Name 36  "t.smpl"
+                              Name 37  "g_tInputTexture_sampler"
+                              Name 39  "t.tex"
+                              Name 40  "g_tInputTexture"
+                              Name 43  "t"
+                              Name 47  "flattenTemp"
+                              Name 51  "tex1.smpl"
+                              Name 56  "tex1.tex"
+                              Name 60  "flattenTemp"
+                              Name 62  "tex2.smpl"
+                              Name 65  "tex2.tex"
+                              Name 72  "@entryPointOutput"
+                              Decorate 37(g_tInputTexture_sampler) DescriptorSet 0
+                              Decorate 40(g_tInputTexture) DescriptorSet 0
+                              Decorate 72(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeSampler
@@ -165,22 +215,27 @@ Shader version: 500
               30:    8(float) Constant 1053609165
               31:   28(fvec2) ConstantComposite 29 30
               32:    8(float) Constant 0
-36(g_tInputTexture_sampler):      7(ptr) Variable UniformConstant
-37(g_tInputTexture):     10(ptr) Variable UniformConstant
-              38:             TypePointer UniformConstant 17(FxaaTex)
-           39(t):     38(ptr) Variable UniformConstant
- 43(flattenTemp):     38(ptr) Variable UniformConstant
-   45(tex2.smpl):      7(ptr) Variable UniformConstant
-              46:             TypeInt 32 1
-              47:     46(int) Constant 0
-    50(tex2.tex):     10(ptr) Variable UniformConstant
-              51:     46(int) Constant 1
-              57:             TypePointer Output 11(fvec4)
-58(@entryPointOutput):     57(ptr) Variable Output
+      36(t.smpl):      7(ptr) Variable UniformConstant
+37(g_tInputTexture_sampler):      7(ptr) Variable UniformConstant
+       39(t.tex):     10(ptr) Variable UniformConstant
+40(g_tInputTexture):     10(ptr) Variable UniformConstant
+              42:             TypePointer UniformConstant 17(FxaaTex)
+           43(t):     42(ptr) Variable UniformConstant
+ 47(flattenTemp):     42(ptr) Variable UniformConstant
+   51(tex1.smpl):      7(ptr) Variable UniformConstant
+              52:             TypeInt 32 1
+              53:     52(int) Constant 0
+    56(tex1.tex):     10(ptr) Variable UniformConstant
+              57:     52(int) Constant 1
+ 60(flattenTemp):     42(ptr) Variable UniformConstant
+   62(tex2.smpl):      7(ptr) Variable UniformConstant
+    65(tex2.tex):     10(ptr) Variable UniformConstant
+              71:             TypePointer Output 11(fvec4)
+72(@entryPointOutput):     71(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              59:   11(fvec4) FunctionCall 22(@main()
-                              Store 58(@entryPointOutput) 59
+              73:   11(fvec4) FunctionCall 22(@main()
+                              Store 72(@entryPointOutput) 73
                               Return
                               FunctionEnd
 15(lookUp(struct-FxaaTex-p1-t211;):   11(fvec4) Function None 12
@@ -195,19 +250,33 @@ Shader version: 500
                               FunctionEnd
  19(fillOpaque(): 17(FxaaTex) Function None 18
               20:             Label
-              40: 17(FxaaTex) Load 39(t)
-                              ReturnValue 40
+              38:           6 Load 37(g_tInputTexture_sampler)
+                              Store 36(t.smpl) 38
+              41:           9 Load 40(g_tInputTexture)
+                              Store 39(t.tex) 41
+              44: 17(FxaaTex) Load 43(t)
+                              ReturnValue 44
                               FunctionEnd
       22(@main():   11(fvec4) Function None 21
               23:             Label
-              44: 17(FxaaTex) FunctionCall 19(fillOpaque()
-                              Store 43(flattenTemp) 44
-              48:      7(ptr) AccessChain 43(flattenTemp) 47
-              49:           6 Load 48
-                              Store 45(tex2.smpl) 49
-              52:     10(ptr) AccessChain 43(flattenTemp) 51
-              53:           9 Load 52
-                              Store 50(tex2.tex) 53
-              54:   11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 36(g_tInputTexture_sampler) 37(g_tInputTexture)
-                              ReturnValue 54
+              48:           6 Load 37(g_tInputTexture_sampler)
+              49:           9 Load 40(g_tInputTexture)
+              50: 17(FxaaTex) CompositeConstruct 48 49
+                              Store 47(flattenTemp) 50
+              54:      7(ptr) AccessChain 47(flattenTemp) 53
+              55:           6 Load 54
+                              Store 51(tex1.smpl) 55
+              58:     10(ptr) AccessChain 47(flattenTemp) 57
+              59:           9 Load 58
+                              Store 56(tex1.tex) 59
+              61: 17(FxaaTex) FunctionCall 19(fillOpaque()
+                              Store 60(flattenTemp) 61
+              63:      7(ptr) AccessChain 60(flattenTemp) 53
+              64:           6 Load 63
+                              Store 62(tex2.smpl) 64
+              66:     10(ptr) AccessChain 60(flattenTemp) 57
+              67:           9 Load 66
+                              Store 65(tex2.tex) 67
+              68:   11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 51(tex1.smpl) 56(tex1.tex)
+                              ReturnValue 68
                               FunctionEnd
index 1dbc3c3..237ab67 100755 (executable)
@@ -1,4 +1,5 @@
 hlsl.flattenOpaqueInitMix.vert
+WARNING: AST will form illegal SPIR-V; need to transform to legalize
 Shader version: 500
 0:? Sequence
 0:5  Function Definition: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
@@ -19,15 +20,36 @@ Shader version: 500
 0:10    Function Parameters: 
 0:?     Sequence
 0:11      Sequence
-0:?         Sequence
+0:11        Sequence
+0:11          move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11            'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11            Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              'g_tInputTexture_sampler' ( uniform sampler)
+0:11              'g_tInputTexture' ( uniform texture2D)
+0:11              Constant:
+0:11                0.500000
+0:11          move second child to first child ( temp sampler)
+0:?             'tex.smpl' ( temp sampler)
+0:11            smpl: direct index for structure ( temp sampler)
+0:11              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp texture2D)
+0:?             'tex.tex' ( temp texture2D)
+0:11            tex: direct index for structure ( temp texture2D)
+0:11              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              Constant:
+0:11                1 (const int)
 0:11          move second child to first child ( temp float)
 0:?             'tex.f' ( temp float)
-0:11            Constant:
-0:11              0.500000
+0:11            f: direct index for structure ( temp float)
+0:11              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              Constant:
+0:11                2 (const int)
 0:12      Branch: Return with expression
 0:12        Function Call: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
-0:?           'g_tInputTexture_sampler' ( uniform sampler)
-0:?           'g_tInputTexture' ( uniform texture2D)
+0:?           'tex.smpl' ( temp sampler)
+0:?           'tex.tex' ( temp texture2D)
 0:?           'tex.f' ( temp float)
 0:10  Function Definition: main( ( temp void)
 0:10    Function Parameters: 
@@ -64,15 +86,36 @@ Shader version: 500
 0:10    Function Parameters: 
 0:?     Sequence
 0:11      Sequence
-0:?         Sequence
+0:11        Sequence
+0:11          move second child to first child ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11            'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11            Construct structure ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              'g_tInputTexture_sampler' ( uniform sampler)
+0:11              'g_tInputTexture' ( uniform texture2D)
+0:11              Constant:
+0:11                0.500000
+0:11          move second child to first child ( temp sampler)
+0:?             'tex.smpl' ( temp sampler)
+0:11            smpl: direct index for structure ( temp sampler)
+0:11              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              Constant:
+0:11                0 (const int)
+0:11          move second child to first child ( temp texture2D)
+0:?             'tex.tex' ( temp texture2D)
+0:11            tex: direct index for structure ( temp texture2D)
+0:11              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              Constant:
+0:11                1 (const int)
 0:11          move second child to first child ( temp float)
 0:?             'tex.f' ( temp float)
-0:11            Constant:
-0:11              0.500000
+0:11            f: direct index for structure ( temp float)
+0:11              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex,  temp float f})
+0:11              Constant:
+0:11                2 (const int)
 0:12      Branch: Return with expression
 0:12        Function Call: lookUp(struct-FxaaTex-p1-t21-f11; ( temp 4-component vector of float)
-0:?           'g_tInputTexture_sampler' ( uniform sampler)
-0:?           'g_tInputTexture' ( uniform texture2D)
+0:?           'tex.smpl' ( temp sampler)
+0:?           'tex.tex' ( temp texture2D)
 0:?           'tex.f' ( temp float)
 0:10  Function Definition: main( ( temp void)
 0:10    Function Parameters: 
@@ -87,12 +130,12 @@ Shader version: 500
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 46
+// Id's are bound by 65
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 44
+                              EntryPoint Vertex 4  "main" 63
                               Source HLSL 500
                               Name 4  "main"
                               Name 17  "lookUp(struct-FxaaTex-p1-t21-f11;"
@@ -100,14 +143,21 @@ Shader version: 500
                               Name 15  "tex.tex"
                               Name 16  "tex.f"
                               Name 20  "@main("
-                              Name 34  "tex.f"
-                              Name 36  "g_tInputTexture_sampler"
-                              Name 37  "g_tInputTexture"
-                              Name 38  "param"
-                              Name 44  "@entryPointOutput"
-                              Decorate 36(g_tInputTexture_sampler) DescriptorSet 0
-                              Decorate 37(g_tInputTexture) DescriptorSet 0
-                              Decorate 44(@entryPointOutput) Location 0
+                              Name 34  "FxaaTex"
+                              MemberName 34(FxaaTex) 0  "smpl"
+                              MemberName 34(FxaaTex) 1  "tex"
+                              MemberName 34(FxaaTex) 2  "f"
+                              Name 36  "flattenTemp"
+                              Name 37  "g_tInputTexture_sampler"
+                              Name 39  "g_tInputTexture"
+                              Name 43  "tex.smpl"
+                              Name 48  "tex.tex"
+                              Name 52  "tex.f"
+                              Name 57  "param"
+                              Name 63  "@entryPointOutput"
+                              Decorate 37(g_tInputTexture_sampler) DescriptorSet 0
+                              Decorate 39(g_tInputTexture) DescriptorSet 0
+                              Decorate 63(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeSampler
@@ -122,15 +172,25 @@ Shader version: 500
               24:             TypeSampledImage 9
               28:             TypeVector 8(float) 2
               30:    8(float) Constant 0
-              35:    8(float) Constant 1056964608
-36(g_tInputTexture_sampler):      7(ptr) Variable UniformConstant
-37(g_tInputTexture):     10(ptr) Variable UniformConstant
-              43:             TypePointer Output 12(fvec4)
-44(@entryPointOutput):     43(ptr) Variable Output
+     34(FxaaTex):             TypeStruct 6 9 8(float)
+              35:             TypePointer UniformConstant 34(FxaaTex)
+ 36(flattenTemp):     35(ptr) Variable UniformConstant
+37(g_tInputTexture_sampler):      7(ptr) Variable UniformConstant
+39(g_tInputTexture):     10(ptr) Variable UniformConstant
+              41:    8(float) Constant 1056964608
+    43(tex.smpl):      7(ptr) Variable UniformConstant
+              44:             TypeInt 32 1
+              45:     44(int) Constant 0
+     48(tex.tex):     10(ptr) Variable UniformConstant
+              49:     44(int) Constant 1
+              53:     44(int) Constant 2
+              54:             TypePointer UniformConstant 8(float)
+              62:             TypePointer Output 12(fvec4)
+63(@entryPointOutput):     62(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              45:   12(fvec4) FunctionCall 20(@main()
-                              Store 44(@entryPointOutput) 45
+              64:   12(fvec4) FunctionCall 20(@main()
+                              Store 63(@entryPointOutput) 64
                               Return
                               FunctionEnd
 17(lookUp(struct-FxaaTex-p1-t21-f11;):   12(fvec4) Function None 13
@@ -149,11 +209,23 @@ Shader version: 500
                               FunctionEnd
       20(@main():   12(fvec4) Function None 19
               21:             Label
-       34(tex.f):     11(ptr) Variable Function
-       38(param):     11(ptr) Variable Function
-                              Store 34(tex.f) 35
-              39:    8(float) Load 34(tex.f)
-                              Store 38(param) 39
-              40:   12(fvec4) FunctionCall 17(lookUp(struct-FxaaTex-p1-t21-f11;) 36(g_tInputTexture_sampler) 37(g_tInputTexture) 38(param)
-                              ReturnValue 40
+       52(tex.f):     11(ptr) Variable Function
+       57(param):     11(ptr) Variable Function
+              38:           6 Load 37(g_tInputTexture_sampler)
+              40:           9 Load 39(g_tInputTexture)
+              42: 34(FxaaTex) CompositeConstruct 38 40 41
+                              Store 36(flattenTemp) 42
+              46:      7(ptr) AccessChain 36(flattenTemp) 45
+              47:           6 Load 46
+                              Store 43(tex.smpl) 47
+              50:     10(ptr) AccessChain 36(flattenTemp) 49
+              51:           9 Load 50
+                              Store 48(tex.tex) 51
+              55:     54(ptr) AccessChain 36(flattenTemp) 53
+              56:    8(float) Load 55
+                              Store 52(tex.f) 56
+              58:    8(float) Load 52(tex.f)
+                              Store 57(param) 58
+              59:   12(fvec4) FunctionCall 17(lookUp(struct-FxaaTex-p1-t21-f11;) 43(tex.smpl) 48(tex.tex) 57(param)
+                              ReturnValue 59
                               FunctionEnd
index 9f6e3da..e0133dc 100644 (file)
@@ -234,7 +234,8 @@ public:
         hlslOffsets(false),
         useStorageBuffer(false),
         hlslIoMapping(false),
-        textureSamplerTransformMode(EShTexSampTransKeep)
+        textureSamplerTransformMode(EShTexSampTransKeep),
+        needToLegalize(false)
     {
         localSize[0] = 1;
         localSize[1] = 1;
@@ -610,6 +611,9 @@ public:
     void addProcessArgument(const std::string& arg) { processes.addArgument(arg); }
     const std::vector<std::string>& getProcesses() const { return processes.getProcesses(); }
 
+    void setNeedsLegalization() { needToLegalize = true; }
+    bool needsLegalization() const { return needToLegalize; }
+
     const char* const implicitThisName;
 
 protected:
@@ -708,6 +712,8 @@ protected:
     // for OpModuleProcessed, or equivalent
     TProcesses processes;
 
+    bool needToLegalize;
+
 private:
     void operator=(TIntermediate&); // prevent assignments
 };
index d953eed..6f023de 100755 (executable)
@@ -166,11 +166,6 @@ bool HlslParseContext::shouldConvertLValue(const TIntermNode* node) const
     if (lhsAsAggregate != nullptr && lhsAsAggregate->getOp() == EOpImageLoad)
         return true;
 
-    // If it's a syntactic write to a sampler, we will use that to establish
-    // a compile-time alias.
-    if (node->getAsTyped()->getBasicType() == EbtSampler)
-        return true;
-
     return false;
 }
 
@@ -239,6 +234,13 @@ bool HlslParseContext::lValueErrorCheck(const TSourceLoc& loc, const char* op, T
         }
     }
 
+    // We tolerate samplers as l-values, even though they are nominally
+    // illegal, because we expect a later optimization to eliminate them.
+    if (node->getType().getBasicType() == EbtSampler) {
+        intermediate.setNeedsLegalization();
+        return false;
+    }
+
     // Let the base class check errors
     return TParseContextBase::lValueErrorCheck(loc, op, node);
 }
@@ -274,10 +276,6 @@ TIntermTyped* HlslParseContext::handleLvalue(const TSourceLoc& loc, const char*
 
     // *** If we get here, we're going to apply some conversion to an l-value.
 
-    // Spin off sampler aliasing
-    if (node->getAsTyped()->getBasicType() == EbtSampler)
-        return handleSamplerLvalue(loc, op, node);
-
     // Helper to create a load.
     const auto makeLoad = [&](TIntermSymbol* rhsTmp, TIntermTyped* object, TIntermTyped* coord, const TType& derefType) {
         TIntermAggregate* loadOp = new TIntermAggregate(EOpImageLoad);
@@ -524,58 +522,6 @@ TIntermTyped* HlslParseContext::handleLvalue(const TSourceLoc& loc, const char*
     return node;
 }
 
-// Deal with sampler aliasing: turning assignments into aliases
-// Return a placeholder node for higher-level code that think assignments must
-// generate code.
-TIntermTyped* HlslParseContext::handleSamplerLvalue(const TSourceLoc& loc, const char* op, TIntermTyped*& node)
-{
-    // Can only alias an assignment:  "s1 = s2"
-    TIntermBinary* binary = node->getAsBinaryNode();
-    if (binary == nullptr || node->getAsOperator()->getOp() != EOpAssign ||
-        binary->getLeft()->getAsSymbolNode() == nullptr ||
-        binary->getRight()->getAsSymbolNode() == nullptr) {
-        error(loc, "can't modify sampler", op, "");
-        return node;
-    }
-
-    if (controlFlowNestingLevel > 0)
-        warn(loc, "sampler or image aliased under control flow; consumption must be in same path", op, "");
-
-    TIntermTyped* set = setOpaqueLvalue(binary->getLeft(), binary->getRight());
-    if (set == nullptr)
-        warn(loc, "could not create alias for sampler", op, "");
-    else
-        node = set;
-
-    return node;
-}
-
-// Do an opaque assignment that needs to turn into an alias.
-// Return nullptr if it can't be done, otherwise return a placeholder
-// node for higher-level code that think assignments must generate code.
-TIntermTyped* HlslParseContext::setOpaqueLvalue(TIntermTyped* leftTyped, TIntermTyped* rightTyped)
-{
-    // Best is if we are aliasing a flattened struct member "S.s1 = s2",
-    // in which case we want to update the flattening information with the alias,
-    // making everything else work seamlessly.
-    TIntermSymbol* left = leftTyped->getAsSymbolNode();
-    TIntermSymbol* right = rightTyped->getAsSymbolNode();
-    for (auto fit = flattenMap.begin(); fit != flattenMap.end(); ++fit) {
-        for (auto mit = fit->second.members.begin(); mit != fit->second.members.end(); ++mit) {
-            if ((*mit)->getUniqueId() == left->getId()) {
-                // found it: update with alias to the existing variable, and don't emit any code
-                (*mit) = new TVariable(&right->getName(), right->getType());
-                (*mit)->setUniqueId(right->getId());
-                // replace node (rest of compiler expects either an error or code to generate)
-                // with pointless access
-                return right;
-            }
-        }
-    }
-
-    return nullptr;
-}
-
 void HlslParseContext::handlePragma(const TSourceLoc& loc, const TVector<TString>& tokens)
 {
     if (pragmaCallback)
@@ -2513,41 +2459,6 @@ TIntermAggregate* HlslParseContext::assignClipCullDistance(const TSourceLoc& loc
     return assignList;
 }
 
-// For a declaration with an initializer, where the initialized symbol is flattened,
-// and possibly contains opaque values, such that the initializer should never exist
-// as emitted code, because even creating the initializer would write opaques.
-//
-// If possible, decompose this into individual member-wise assignments, which themselves
-// are expected to then not exist for opaque types, because they will turn into aliases.
-//
-// Return a node that contains the non-aliased assignments that must continue to exist.
-TIntermTyped* HlslParseContext::executeFlattenedInitializer(const TSourceLoc& loc, TIntermSymbol* symbol,
-                                                            TIntermAggregate& initializer)
-{
-    // We need individual RHS initializers per member to do this
-    const TTypeList* typeList = symbol->getType().getStruct();
-    if (typeList == nullptr || initializer.getSequence().size() != typeList->size()) {
-        warn(loc, "cannot do member-wise aliasing for opaque members with this initializer", "=", "");
-        return handleAssign(loc, EOpAssign, symbol, &initializer);
-    }
-
-    TIntermAggregate* initList = nullptr;
-    // synthesize an access to each member, and then an assignment to it
-    for (int member = 0; member < (int)typeList->size(); ++member) {
-        TIntermTyped* memberInitializer = initializer.getSequence()[member]->getAsTyped();
-        TIntermTyped* flattenedMember = flattenAccess(symbol, member);
-        if (flattenedMember->getType().containsOpaque())
-            setOpaqueLvalue(flattenedMember, memberInitializer);
-        else
-            initList = intermediate.growAggregate(initList, handleAssign(loc, EOpAssign, flattenedMember,
-                                                  memberInitializer));
-    }
-
-    if (initList)
-        initList->setOperator(EOpSequence);
-    return initList;
-}
-
 // Some simple source assignments need to be flattened to a sequence
 // of AST assignments. Catch these and flatten, otherwise, pass through
 // to intermediate.addAssign().
@@ -2560,6 +2471,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
     if (left == nullptr || right == nullptr)
         return nullptr;
 
+    // writing to opaques will require fixing transforms
+    if (left->getType().containsOpaque())
+        intermediate.setNeedsLegalization();
+
     if (left->getAsOperator() && left->getAsOperator()->getOp() == EOpMatrixSwizzle)
         return handleAssignToMatrixSwizzle(loc, op, left, right);
 
@@ -2720,7 +2635,8 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
             const int elementsL = left->getType().isArray()  ? left->getType().getOuterArraySize()  : 1;
             const int elementsR = right->getType().isArray() ? right->getType().getOuterArraySize() : 1;
 
-            // The arrays may not be the same size, e.g, if the size has been forced for EbvTe\ 1ssLevelInner or Outer.
+            // The arrays might not be the same size,
+            // e.g., if the size has been forced for EbvTessLevelInner/Outer.
             const int elementsToCopy = std::min(elementsL, elementsR);
 
             // array case
@@ -7616,20 +7532,10 @@ TIntermNode* HlslParseContext::executeInitializer(const TSourceLoc& loc, TInterm
         // normal assigning of a value to a variable...
         specializationCheck(loc, initializer->getType(), "initializer");
         TIntermSymbol* intermSymbol = intermediate.addSymbol(*variable, loc);
-
-        // If we are flattening, it could be due to setting opaques, which must be handled
-        // as aliases, and the 'initializer' node cannot actually be emitted, because it
-        // itself stores the result of the constructor, and we can't store to opaques.
-        // handleAssign() will emit the initializer.
-        TIntermNode* initNode = nullptr;
-        if (flattened && intermSymbol->getType().containsOpaque())
-            return executeFlattenedInitializer(loc, intermSymbol, *initializer->getAsAggregate());
-        else {
-            initNode = handleAssign(loc, EOpAssign, intermSymbol, initializer);
-            if (initNode == nullptr)
-                assignError(loc, "=", intermSymbol->getCompleteString(), initializer->getCompleteString());
-            return initNode;
-        }
+        TIntermNode* initNode = handleAssign(loc, EOpAssign, intermSymbol, initializer);
+        if (initNode == nullptr)
+            assignError(loc, "=", intermSymbol->getCompleteString(), initializer->getCompleteString());
+        return initNode;
     }
 
     return nullptr;
@@ -9517,6 +9423,11 @@ void HlslParseContext::finish()
         error(mipsOperatorMipArg.back().loc, "unterminated mips operator:", "", "");
     }
 
+    // Communicate out (esp. for command line) that we formed AST that will make
+    // illegal AST SPIR-V and it needs transforms to legalize it.
+    if (intermediate.needsLegalization())
+        infoSink.info << "WARNING: AST will form illegal SPIR-V; need to transform to legalize";
+
     removeUnusedStructBufferCounters();
     addPatchConstantInvocation();
     fixTextureShadowModes();
index 86f7bbe..077beb9 100755 (executable)
@@ -88,7 +88,6 @@ public:
     void remapNonEntryPointIO(TFunction& function);
     TIntermNode* handleReturnValue(const TSourceLoc&, TIntermTyped*);
     void handleFunctionArgument(TFunction*, TIntermTyped*& arguments, TIntermTyped* newArg);
-    TIntermTyped* executeFlattenedInitializer(const TSourceLoc&, TIntermSymbol*, TIntermAggregate&);
     TIntermTyped* handleAssign(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
     TIntermTyped* handleAssignToMatrixSwizzle(const TSourceLoc&, TOperator, TIntermTyped* left, TIntermTyped* right);
     TIntermTyped* handleFunctionCall(const TSourceLoc&, TFunction*, TIntermTyped*);
@@ -191,8 +190,6 @@ public:
 
     // Apply L-value conversions.  E.g, turning a write to a RWTexture into an ImageStore.
     TIntermTyped* handleLvalue(const TSourceLoc&, const char* op, TIntermTyped*& node);
-    TIntermTyped* handleSamplerLvalue(const TSourceLoc&, const char* op, TIntermTyped*& node);
-    TIntermTyped* setOpaqueLvalue(TIntermTyped* left, TIntermTyped* right);
     bool lValueErrorCheck(const TSourceLoc&, const char* op, TIntermTyped*) override;
 
     TLayoutFormat getLayoutFromTxType(const TSourceLoc&, const TType&);