OSDN Git Service

gl_VertexID implementation
[android-x86/external-swiftshader.git] / src / OpenGL / compiler / OutputASM.cpp
index 49f62b1..2c8222e 100644 (file)
@@ -2554,6 +2554,7 @@ namespace glsl
                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;
@@ -2606,9 +2607,10 @@ namespace glsl
                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);
@@ -2944,9 +2946,19 @@ namespace glsl
                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)
                {
@@ -2992,7 +3004,7 @@ namespace glsl
                }
 
                UNREACHABLE(0);
-               return -1;   // Not a sampler register
+               return -1;   // Not a (uniform) sampler register
        }
 
        int OutputASM::samplerRegister(TIntermSymbol *sampler)
@@ -3507,11 +3519,11 @@ namespace glsl
                                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();
@@ -3598,6 +3610,19 @@ namespace glsl
                                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)
                        {