case EvqPosition: return sw::Shader::PARAMETER_OUTPUT;
case EvqPointSize: return sw::Shader::PARAMETER_OUTPUT;
case EvqInstanceID: return sw::Shader::PARAMETER_MISCTYPE;
+ case EvqVertexID: return sw::Shader::PARAMETER_MISCTYPE;
case EvqFragCoord: return sw::Shader::PARAMETER_MISCTYPE;
case EvqFrontFacing: return sw::Shader::PARAMETER_MISCTYPE;
case EvqPointCoord: return sw::Shader::PARAMETER_INPUT;
case EvqConstReadOnly: return temporaryRegister(operand);
case EvqPosition: return varyingRegister(operand);
case EvqPointSize: return varyingRegister(operand);
- case EvqInstanceID: vertexShader->declareInstanceId(); return 0;
- case EvqFragCoord: pixelShader->declareVPos(); return 0;
- case EvqFrontFacing: pixelShader->declareVFace(); return 1;
+ case EvqInstanceID: vertexShader->declareInstanceId(); return sw::Shader::InstanceIDIndex;
+ case EvqVertexID: vertexShader->declareVertexId(); return sw::Shader::VertexIDIndex;
+ case EvqFragCoord: pixelShader->declareVPos(); return sw::Shader::VPosIndex;
+ case EvqFrontFacing: pixelShader->declareVFace(); return sw::Shader::VFaceIndex;
case EvqPointCoord: return varyingRegister(operand);
case EvqFragColor: return 0;
case EvqFragData: return fragmentOutputRegister(operand);
TIntermSymbol *symbol = sampler->getAsSymbolNode();
TIntermBinary *binary = sampler->getAsBinaryNode();
- if(symbol && type.getQualifier() == EvqUniform)
+ if(symbol)
{
- return samplerRegister(symbol);
+ switch(type.getQualifier())
+ {
+ case EvqUniform:
+ return samplerRegister(symbol);
+ case EvqIn:
+ case EvqConstReadOnly:
+ // Function arguments are not (uniform) sampler registers
+ return -1;
+ default:
+ UNREACHABLE(type.getQualifier());
+ }
}
else if(binary)
{
}
UNREACHABLE(0);
- return -1; // Not a sampler register
+ return -1; // Not a (uniform) sampler register
}
int OutputASM::samplerRegister(TIntermSymbol *sampler)
TIntermSequence &sequence = init->getSequence();
TIntermTyped *variable = sequence[0]->getAsTyped();
- if(variable && variable->getQualifier() == EvqTemporary)
+ if(variable && variable->getQualifier() == EvqTemporary && variable->getBasicType() == EbtInt)
{
TIntermBinary *assign = variable->getAsBinaryNode();
- if(assign->getOp() == EOpInitialize)
+ if(assign && assign->getOp() == EOpInitialize)
{
TIntermSymbol *symbol = assign->getLeft()->getAsSymbolNode();
TIntermConstantUnion *constant = assign->getRight()->getAsConstantUnion();
comparator = EOpLessThan;
limit += 1;
}
+ else if(comparator == EOpGreaterThanEqual)
+ {
+ comparator = EOpLessThan;
+ limit -= 1;
+ std::swap(initial, limit);
+ increment = -increment;
+ }
+ else if(comparator == EOpGreaterThan)
+ {
+ comparator = EOpLessThan;
+ std::swap(initial, limit);
+ increment = -increment;
+ }
if(comparator == EOpLessThan)
{