{\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
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