HLSL: Fix crash when flattening both side of assignement simultaneously.
authorUnknown <xavierb@gmail.com>
Tue, 3 Oct 2017 07:10:26 +0000 (09:10 +0200)
committerUnknown <xavierb@gmail.com>
Tue, 3 Oct 2017 07:10:26 +0000 (09:10 +0200)
Test/baseLegalResults/hlsl.flattenOpaqueInit.vert.out
Test/baseResults/hlsl.flattenOpaqueInit.vert.out
Test/hlsl.flattenOpaqueInit.vert
hlsl/hlslParseHelper.cpp

index 21a960b..874fd00 100644 (file)
@@ -2,12 +2,12 @@ hlsl.flattenOpaqueInit.vert
 WARNING: AST will form illegal SPIR-V; need to transform to legalize
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 117
+// Id's are bound by 125
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 78
+                              EntryPoint Vertex 4  "main" 82
                               Source HLSL 500
                               Name 4  "main"
                               Name 17  "FxaaTex"
@@ -15,10 +15,10 @@ WARNING: AST will form illegal SPIR-V; need to transform to legalize
                               MemberName 17(FxaaTex) 1  "tex"
                               Name 38  "g_tInputTexture_sampler"
                               Name 42  "g_tInputTexture"
-                              Name 78  "@entryPointOutput"
+                              Name 82  "@entryPointOutput"
                               Decorate 38(g_tInputTexture_sampler) DescriptorSet 0
                               Decorate 42(g_tInputTexture) DescriptorSet 0
-                              Decorate 78(@entryPointOutput) Location 0
+                              Decorate 82(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeSampler
@@ -36,14 +36,14 @@ WARNING: AST will form illegal SPIR-V; need to transform to legalize
 38(g_tInputTexture_sampler):     37(ptr) Variable UniformConstant
               41:             TypePointer UniformConstant 9
 42(g_tInputTexture):     41(ptr) Variable UniformConstant
-              77:             TypePointer Output 11(fvec4)
-78(@entryPointOutput):     77(ptr) Variable Output
+              81:             TypePointer Output 11(fvec4)
+82(@entryPointOutput):     81(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              90:           6 Load 38(g_tInputTexture_sampler)
-              91:           9 Load 42(g_tInputTexture)
-             115:          26 SampledImage 91 90
-             116:   11(fvec4) ImageSampleExplicitLod 115 31 Lod 32
-                              Store 78(@entryPointOutput) 116
+              96:           6 Load 38(g_tInputTexture_sampler)
+              97:           9 Load 42(g_tInputTexture)
+             123:          26 SampledImage 97 96
+             124:   11(fvec4) ImageSampleExplicitLod 123 31 Lod 32
+                              Store 82(@entryPointOutput) 124
                               Return
                               FunctionEnd
index dee2808..368dde5 100755 (executable)
@@ -65,10 +65,18 @@ Shader version: 500
 0:20              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
 0:20              Constant:
 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:?           'tex1.smpl' ( temp sampler)
-0:?           'tex1.tex' ( temp texture2D)
+0:21      Sequence
+0:21        Sequence
+0:21          move second child to first child ( temp sampler)
+0:?             'tex3.smpl' ( temp sampler)
+0:?             'tex1.smpl' ( temp sampler)
+0:21          move second child to first child ( temp texture2D)
+0:?             'tex3.tex' ( temp texture2D)
+0:?             'tex1.tex' ( temp texture2D)
+0:22      Branch: Return with expression
+0:22        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:?           'tex3.smpl' ( temp sampler)
+0:?           'tex3.tex' ( temp texture2D)
 0:18  Function Definition: main( ( temp void)
 0:18    Function Parameters: 
 0:?     Sequence
@@ -149,10 +157,18 @@ Shader version: 500
 0:20              'flattenTemp' ( temp structure{ temp sampler smpl,  temp texture2D tex})
 0:20              Constant:
 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:?           'tex1.smpl' ( temp sampler)
-0:?           'tex1.tex' ( temp texture2D)
+0:21      Sequence
+0:21        Sequence
+0:21          move second child to first child ( temp sampler)
+0:?             'tex3.smpl' ( temp sampler)
+0:?             'tex1.smpl' ( temp sampler)
+0:21          move second child to first child ( temp texture2D)
+0:?             'tex3.tex' ( temp texture2D)
+0:?             'tex1.tex' ( temp texture2D)
+0:22      Branch: Return with expression
+0:22        Function Call: lookUp(struct-FxaaTex-p1-t211; ( temp 4-component vector of float)
+0:?           'tex3.smpl' ( temp sampler)
+0:?           'tex3.tex' ( temp texture2D)
 0:18  Function Definition: main( ( temp void)
 0:18    Function Parameters: 
 0:?     Sequence
@@ -166,12 +182,12 @@ Shader version: 500
 
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 80
+// Id's are bound by 84
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Vertex 4  "main" 78
+                              EntryPoint Vertex 4  "main" 82
                               Source HLSL 500
                               Name 4  "main"
                               Name 15  "lookUp(struct-FxaaTex-p1-t211;"
@@ -193,12 +209,14 @@ Shader version: 500
                               Name 62  "flattenTemp"
                               Name 64  "tex2.smpl"
                               Name 67  "tex2.tex"
-                              Name 70  "param"
-                              Name 72  "param"
-                              Name 78  "@entryPointOutput"
+                              Name 70  "tex3.smpl"
+                              Name 72  "tex3.tex"
+                              Name 74  "param"
+                              Name 76  "param"
+                              Name 82  "@entryPointOutput"
                               Decorate 38(g_tInputTexture_sampler) DescriptorSet 0
                               Decorate 42(g_tInputTexture) DescriptorSet 0
-                              Decorate 78(@entryPointOutput) Location 0
+                              Decorate 82(@entryPointOutput) Location 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeSampler
@@ -225,12 +243,12 @@ Shader version: 500
               54:             TypeInt 32 1
               55:     54(int) Constant 0
               59:     54(int) Constant 1
-              77:             TypePointer Output 11(fvec4)
-78(@entryPointOutput):     77(ptr) Variable Output
+              81:             TypePointer Output 11(fvec4)
+82(@entryPointOutput):     81(ptr) Variable Output
          4(main):           2 Function None 3
                5:             Label
-              79:   11(fvec4) FunctionCall 22(@main()
-                              Store 78(@entryPointOutput) 79
+              83:   11(fvec4) FunctionCall 22(@main()
+                              Store 82(@entryPointOutput) 83
                               Return
                               FunctionEnd
 15(lookUp(struct-FxaaTex-p1-t211;):   11(fvec4) Function None 12
@@ -263,8 +281,10 @@ Shader version: 500
  62(flattenTemp):     44(ptr) Variable Function
    64(tex2.smpl):      7(ptr) Variable Function
     67(tex2.tex):     10(ptr) Variable Function
-       70(param):      7(ptr) Variable Function
-       72(param):     10(ptr) Variable Function
+   70(tex3.smpl):      7(ptr) Variable Function
+    72(tex3.tex):     10(ptr) Variable Function
+       74(param):      7(ptr) Variable Function
+       76(param):     10(ptr) Variable Function
               50:           6 Load 38(g_tInputTexture_sampler)
               51:           9 Load 42(g_tInputTexture)
               52: 17(FxaaTex) CompositeConstruct 50 51
@@ -284,9 +304,13 @@ Shader version: 500
               69:           9 Load 68
                               Store 67(tex2.tex) 69
               71:           6 Load 53(tex1.smpl)
-                              Store 70(param) 71
+                              Store 70(tex3.smpl) 71
               73:           9 Load 58(tex1.tex)
-                              Store 72(param) 73
-              74:   11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 70(param) 72(param)
-                              ReturnValue 74
+                              Store 72(tex3.tex) 73
+              75:           6 Load 70(tex3.smpl)
+                              Store 74(param) 75
+              77:           9 Load 72(tex3.tex)
+                              Store 76(param) 77
+              78:   11(fvec4) FunctionCall 15(lookUp(struct-FxaaTex-p1-t211;) 74(param) 76(param)
+                              ReturnValue 78
                               FunctionEnd
index 75d28a9..bcf39ce 100644 (file)
@@ -18,5 +18,6 @@ float4 main() : SV_TARGET0
 {\r
     FxaaTex tex1 = { g_tInputTexture_sampler, g_tInputTexture };\r
     FxaaTex tex2 = fillOpaque();\r
-    return lookUp(tex1);\r
-}
\ No newline at end of file
+    FxaaTex tex3 = tex1;
+    return lookUp(tex3);\r
+}
index 91deb4f..0ba5d27 100755 (executable)
@@ -2595,7 +2595,8 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
         }
     }
 
-    int memberIdx = 0;
+    int memberIdxLeft = 0;
+    int memberIdxRight = 0;
 
     // When dealing with split arrayed structures of built-ins, the arrayness is moved to the extracted built-in
     // variables, which is awkward when copying between split and unsplit structures.  This variable tracks
@@ -2635,8 +2636,10 @@ TIntermTyped* HlslParseContext::handleAssign(const TSourceLoc& loc, TOperator op
                 subTree->setType(splitDerefType);
             }
         } else if (flattened && isFinalFlattening(derefType)) {
-            const TVector<TVariable*>& flatVariables = isLeft ? *leftVariables : *rightVariables;
-            subTree = intermediate.addSymbol(*flatVariables[memberIdx++]);
+            if (isLeft)
+                subTree = intermediate.addSymbol(*(*leftVariables)[memberIdxLeft++]);
+            else
+                subTree = intermediate.addSymbol(*(*rightVariables)[memberIdxRight++]);
         } else {
             // Index operator if it's an aggregate, else EOpNull
             const TOperator accessOp = node->getType().isArray()  ? EOpIndexDirect