OSDN Git Service

Fix sampler-array-using-loop-index.html regression.
authorNicolas Capens <capn@google.com>
Fri, 29 Apr 2016 17:35:00 +0000 (13:35 -0400)
committerNicolas Capens <capn@google.com>
Fri, 29 Apr 2016 19:21:09 +0000 (19:21 +0000)
Change-Id: I1d1a716bd9bd5b636c5b263a7094ff13ac9aa549
Reviewed-on: https://swiftshader-review.googlesource.com/5260
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
src/OpenGL/compiler/OutputASM.cpp

index 88a8780..0abb9e4 100644 (file)
@@ -1239,7 +1239,7 @@ namespace glsl
                                                {\r
                                                        float projFactor = 1.0f / constant->getFConst(t->getNominalSize() - 1);\r
                                                        Constant projCoord(constant->getFConst(0) * projFactor,\r
-                                                                          constant->getFConst(1) * projFactor, \r
+                                                                          constant->getFConst(1) * projFactor,\r
                                                                           constant->getFConst(2) * projFactor,\r
                                                                           0.0f);\r
                                                        emit(sw::Shader::OPCODE_MOV, &coord, &projCoord);\r
@@ -2853,35 +2853,45 @@ namespace glsl
                        TIntermTyped *right = binary->getRight();\r
                        const TType &leftType = left->getType();\r
                        int index = right->getAsConstantUnion() ? right->getAsConstantUnion()->getIConst(0) : 0;\r
+                       int offset = 0;\r
 \r
                        switch(binary->getOp())\r
                        {\r
                        case EOpIndexDirect:\r
                                ASSERT(left->isArray());\r
-                               return samplerRegister(left) + index * leftType.elementRegisterCount();\r
+                               offset = index * leftType.elementRegisterCount();\r
+                               break;\r
                        case EOpIndexDirectStruct:\r
+                               ASSERT(leftType.isStruct());\r
                                {\r
-                                       ASSERT(leftType.isStruct());\r
                                        const TFieldList &fields = leftType.getStruct()->fields();\r
-                                       int fieldOffset = 0;\r
 \r
                                        for(int i = 0; i < index; i++)\r
                                        {\r
-                                               fieldOffset += fields[i]->type()->totalRegisterCount();\r
+                                               offset += fields[i]->type()->totalRegisterCount();\r
                                        }\r
-\r
-                                       return samplerRegister(left) + fieldOffset;\r
                                }\r
-                       case EOpIndexDirectInterfaceBlock:   // Interface blocks can't contain samplers\r
+                               break;\r
                        case EOpIndexIndirect:               // Indirect indexing produces a temporary, not a sampler register\r
+                               return -1;\r
+                       case EOpIndexDirectInterfaceBlock:   // Interface blocks can't contain samplers\r
                        default:\r
                                UNREACHABLE(binary->getOp());\r
-                               return 0;\r
+                               return -1;\r
                        }\r
+\r
+                       int base = samplerRegister(left);\r
+\r
+                       if(base < 0)\r
+                       {\r
+                               return -1;\r
+                       }\r
+\r
+                       return base + offset;\r
                }\r
 \r
                UNREACHABLE(0);\r
-               return 0;   // Not a sampler register\r
+               return -1;   // Not a sampler register\r
        }\r
 \r
        int OutputASM::samplerRegister(TIntermSymbol *sampler)\r