Commit c431041d by Nicolas Capens

Fix sampler-array-using-loop-index.html regression.

Change-Id: I1d1a716bd9bd5b636c5b263a7094ff13ac9aa549 Reviewed-on: https://swiftshader-review.googlesource.com/5260Reviewed-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com> Tested-by: 's avatarNicolas Capens <capn@google.com>
parent 77a0f3a9
...@@ -1239,7 +1239,7 @@ namespace glsl ...@@ -1239,7 +1239,7 @@ namespace glsl
{ {
float projFactor = 1.0f / constant->getFConst(t->getNominalSize() - 1); float projFactor = 1.0f / constant->getFConst(t->getNominalSize() - 1);
Constant projCoord(constant->getFConst(0) * projFactor, Constant projCoord(constant->getFConst(0) * projFactor,
constant->getFConst(1) * projFactor, constant->getFConst(1) * projFactor,
constant->getFConst(2) * projFactor, constant->getFConst(2) * projFactor,
0.0f); 0.0f);
emit(sw::Shader::OPCODE_MOV, &coord, &projCoord); emit(sw::Shader::OPCODE_MOV, &coord, &projCoord);
...@@ -2853,35 +2853,45 @@ namespace glsl ...@@ -2853,35 +2853,45 @@ namespace glsl
TIntermTyped *right = binary->getRight(); TIntermTyped *right = binary->getRight();
const TType &leftType = left->getType(); const TType &leftType = left->getType();
int index = right->getAsConstantUnion() ? right->getAsConstantUnion()->getIConst(0) : 0; int index = right->getAsConstantUnion() ? right->getAsConstantUnion()->getIConst(0) : 0;
int offset = 0;
switch(binary->getOp()) switch(binary->getOp())
{ {
case EOpIndexDirect: case EOpIndexDirect:
ASSERT(left->isArray()); ASSERT(left->isArray());
return samplerRegister(left) + index * leftType.elementRegisterCount(); offset = index * leftType.elementRegisterCount();
break;
case EOpIndexDirectStruct: case EOpIndexDirectStruct:
ASSERT(leftType.isStruct());
{ {
ASSERT(leftType.isStruct());
const TFieldList &fields = leftType.getStruct()->fields(); const TFieldList &fields = leftType.getStruct()->fields();
int fieldOffset = 0;
for(int i = 0; i < index; i++) for(int i = 0; i < index; i++)
{ {
fieldOffset += fields[i]->type()->totalRegisterCount(); offset += fields[i]->type()->totalRegisterCount();
} }
return samplerRegister(left) + fieldOffset;
} }
case EOpIndexDirectInterfaceBlock: // Interface blocks can't contain samplers break;
case EOpIndexIndirect: // Indirect indexing produces a temporary, not a sampler register case EOpIndexIndirect: // Indirect indexing produces a temporary, not a sampler register
return -1;
case EOpIndexDirectInterfaceBlock: // Interface blocks can't contain samplers
default: default:
UNREACHABLE(binary->getOp()); UNREACHABLE(binary->getOp());
return 0; return -1;
} }
int base = samplerRegister(left);
if(base < 0)
{
return -1;
}
return base + offset;
} }
UNREACHABLE(0); UNREACHABLE(0);
return 0; // Not a sampler register return -1; // Not a sampler register
} }
int OutputASM::samplerRegister(TIntermSymbol *sampler) int OutputASM::samplerRegister(TIntermSymbol *sampler)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment