Fix for not transforming all image symbols into sampled images symbols
authort.jung <t.jung@gaijin.ru>
Thu, 29 Jun 2017 13:29:32 +0000 (15:29 +0200)
committert.jung <t.jung@gaijin.ru>
Fri, 30 Jun 2017 05:06:17 +0000 (07:06 +0200)
Change-Id: I10f9bcea2e97f36912a81214552b93db4805b61a

Test/baseResults/spv.texture.sampler.transform.frag.out
glslang/MachineIndependent/Intermediate.cpp

index bc86ab2..ffa664e 100644 (file)
@@ -1,19 +1,19 @@
 spv.texture.sampler.transform.frag
 // Module Version 10000
 // Generated by (magic number): 80001
-// Id's are bound by 19
+// Id's are bound by 20
 
                               Capability Shader
                1:             ExtInstImport  "GLSL.std.450"
                               MemoryModel Logical GLSL450
-                              EntryPoint Fragment 4  "main" 9 16
+                              EntryPoint Fragment 4  "main" 9 17
                               ExecutionMode 4 OriginUpperLeft
                               Source GLSL 440
                               Name 4  "main"
                               Name 9  "color"
-                              Name 12  "tex"
-                              Name 16  "coord"
-                              Decorate 12(tex) DescriptorSet 0
+                              Name 13  "tex"
+                              Name 17  "coord"
+                              Decorate 13(tex) DescriptorSet 0
                2:             TypeVoid
                3:             TypeFunction 2
                6:             TypeFloat 32
@@ -21,16 +21,17 @@ spv.texture.sampler.transform.frag
                8:             TypePointer Output 7(fvec4)
         9(color):      8(ptr) Variable Output
               10:             TypeImage 6(float) 2D sampled format:Unknown
-              11:             TypePointer UniformConstant 10
-         12(tex):     11(ptr) Variable UniformConstant
-              14:             TypeVector 6(float) 2
-              15:             TypePointer Input 14(fvec2)
-       16(coord):     15(ptr) Variable Input
+              11:             TypeSampledImage 10
+              12:             TypePointer UniformConstant 11
+         13(tex):     12(ptr) Variable UniformConstant
+              15:             TypeVector 6(float) 2
+              16:             TypePointer Input 15(fvec2)
+       17(coord):     16(ptr) Variable Input
          4(main):           2 Function None 3
                5:             Label
-              13:          10 Load 12(tex)
-              17:   14(fvec2) Load 16(coord)
-              18:    7(fvec4) ImageSampleImplicitLod 13 17
-                              Store 9(color) 18
+              14:          11 Load 13(tex)
+              18:   15(fvec2) Load 17(coord)
+              19:    7(fvec4) ImageSampleImplicitLod 14 18
+                              Store 9(color) 19
                               Return
                               FunctionEnd
index df3056e..a08944a 100644 (file)
@@ -3186,6 +3186,11 @@ bool TIntermediate::specConstantPropagates(const TIntermTyped& node1, const TInt
 }
 
 struct TextureUpgradeAndSamplerRemovalTransform : public TIntermTraverser {
+    void visitSymbol(TIntermSymbol* symbol) override {
+        if (symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isTexture()) {
+            symbol->getWritableType().getSampler().combined = true;
+        }
+    }
     bool visitAggregate(TVisit, TIntermAggregate* ag) override {
         using namespace std;
         TIntermSequence& seq = ag->getSequence();
@@ -3199,17 +3204,11 @@ struct TextureUpgradeAndSamplerRemovalTransform : public TIntermTraverser {
         });
         seq.erase(newEnd, seq.end());
         // replace constructors with sampler/textures
-        // update textures into sampled textures
         for_each(seq.begin(), seq.end(), [](TIntermNode*& node) {
-            TIntermSymbol* symbol = node->getAsSymbolNode();
-            if (!symbol) {
-                TIntermAggregate *constructor = node->getAsAggregate();
-                if (constructor && constructor->getOp() == EOpConstructTextureSampler) {
-                    if (!constructor->getSequence().empty())
-                        node = constructor->getSequence()[0];
-                }
-            } else if (symbol->getBasicType() == EbtSampler && symbol->getType().getSampler().isTexture()) {
-                symbol->getWritableType().getSampler().combined = true;
+            TIntermAggregate *constructor = node->getAsAggregate();
+            if (constructor && constructor->getOp() == EOpConstructTextureSampler) {
+                if (!constructor->getSequence().empty())
+                    node = constructor->getSequence()[0];
             }
         });
         return true;