Make shader generator more legible. Get rid of some magic values.

Review URL: http://codereview.appspot.com/4531043/


git-svn-id: http://skia.googlecode.com/svn/trunk@1281 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGLShaders.cpp b/gpu/src/GrGpuGLShaders.cpp
index b914221..c2b8971 100644
--- a/gpu/src/GrGpuGLShaders.cpp
+++ b/gpu/src/GrGpuGLShaders.cpp
@@ -27,12 +27,6 @@
 #define SKIP_CACHE_CHECK    true
 #define GR_UINT32_MAX   static_cast<uint32_t>(-1)
 
-#if GR_GL_ATTRIBUTE_MATRICES
-    #define VIEWMAT_ATTR_LOCATION (3 + GrDrawTarget::kMaxTexCoords)
-    #define TEXMAT_ATTR_LOCATION(X) (6 + GrDrawTarget::kMaxTexCoords + 3 * (X))
-    #define BOGUS_MATRIX_UNI_LOCATION 1000
-#endif
-
 #include "GrTHashCache.h"
 
 class GrGpuGLShaders::ProgramCache : public ::GrNoncopyable {
@@ -118,7 +112,9 @@
                 GrGpuGLShaders::DeleteProgram(&entry->fProgramData);
             }
             entry->fKey.copyAndTakeOwnership(key);
-            desc.genProgram(&entry->fProgramData);
+            if (!desc.genProgram(&entry->fProgramData)) {
+                return NULL;
+            }
             fHashCache.insert(entry->fKey, entry);
         }
 
@@ -241,21 +237,24 @@
 }
 
 const GrMatrix& GrGpuGLShaders::getHWSamplerMatrix(int stage) {
-#if GR_GL_ATTRIBUTE_MATRICES
-    return fHWDrawState.fSamplerStates[stage].getMatrix();
-#else
     GrAssert(fProgramData);
-    return fProgramData->fTextureMatrices[stage];
-#endif
+
+    if (GrGLProgram::kSetAsAttribute == 
+        fProgramData->fUniLocations.fStages[stage].fTextureMatrixUni) {
+        return fHWDrawState.fSamplerStates[stage].getMatrix();
+    } else {
+        return fProgramData->fTextureMatrices[stage];
+    }
 }
 
 void GrGpuGLShaders::recordHWSamplerMatrix(int stage, const GrMatrix& matrix) {
-#if GR_GL_ATTRIBUTE_MATRICES
-    fHWDrawState.fSamplerStates[stage].setMatrix(matrix);
-#else
     GrAssert(fProgramData);
-    fProgramData->fTextureMatrices[stage] = matrix;
-#endif
+    if (GrGLProgram::kSetAsAttribute == 
+        fProgramData->fUniLocations.fStages[stage].fTextureMatrixUni) {
+        fHWDrawState.fSamplerStates[stage].setMatrix(matrix);
+    } else {
+        fProgramData->fTextureMatrices[stage] = matrix;
+    }
 }
 
 void GrGpuGLShaders::resetContext() {
@@ -263,11 +262,11 @@
 
     fHWGeometryState.fVertexLayout = 0;
     fHWGeometryState.fVertexOffset = ~0;
-    GR_GL(DisableVertexAttribArray(COL_ATTR_LOCATION));
+    GR_GL(DisableVertexAttribArray(GrGLProgram::ColorAttributeIdx()));
     for (int t = 0; t < kMaxTexCoords; ++t) {
-        GR_GL(DisableVertexAttribArray(TEX_ATTR_LOCATION(t)));
+        GR_GL(DisableVertexAttribArray(GrGLProgram::TexCoordAttributeIdx(t)));
     }
-    GR_GL(EnableVertexAttribArray(POS_ATTR_LOCATION));
+    GR_GL(EnableVertexAttribArray(GrGLProgram::PositionAttributeIdx()));
 
     fHWProgramID = 0;
 }
@@ -293,52 +292,60 @@
         m[GrMatrix::kTransY],
         m[GrMatrix::kPersp2]
     };
-#if GR_GL_ATTRIBUTE_MATRICES
-    GR_GL(VertexAttrib4fv(VIEWMAT_ATTR_LOCATION+0, mt+0));
-    GR_GL(VertexAttrib4fv(VIEWMAT_ATTR_LOCATION+1, mt+3));
-    GR_GL(VertexAttrib4fv(VIEWMAT_ATTR_LOCATION+2, mt+6));
-#else
-    GR_GL(UniformMatrix3fv(fProgramData->fUniLocations.fViewMatrixUni,1,false,mt));
-#endif
+
+    if (GrGLProgram::kSetAsAttribute ==  
+        fProgramData->fUniLocations.fViewMatrixUni) {
+        int baseIdx = GrGLProgram::ViewMatrixAttributeIdx();
+        GR_GL(VertexAttrib4fv(baseIdx + 0, mt+0));
+        GR_GL(VertexAttrib4fv(baseIdx + 1, mt+3));
+        GR_GL(VertexAttrib4fv(baseIdx + 2, mt+6));
+    } else {
+        GrAssert(GrGLProgram::kUnusedUniform != 
+                 fProgramData->fUniLocations.fViewMatrixUni);
+        GR_GL(UniformMatrix3fv(fProgramData->fUniLocations.fViewMatrixUni,
+                               1, false, mt));
+    }
 }
 
 void GrGpuGLShaders::flushTextureMatrix(int s) {
     const int& uni = fProgramData->fUniLocations.fStages[s].fTextureMatrixUni;
     GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTextures[s];
     if (NULL != texture) {
-        if (-1 != uni &&
+        if (GrGLProgram::kUnusedUniform != uni &&
             (((1 << s) & fDirtyFlags.fTextureChangedMask) ||
             getHWSamplerMatrix(s) != getSamplerMatrix(s))) {
 
-                GrAssert(NULL != fCurrDrawState.fTextures[s]);
+            GrAssert(NULL != fCurrDrawState.fTextures[s]);
 
-                GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTextures[s];
+            GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTextures[s];
 
-                GrMatrix m = getSamplerMatrix(s);
-                GrSamplerState::SampleMode mode = 
-                    fCurrDrawState.fSamplerStates[s].getSampleMode();
-                AdjustTextureMatrix(texture, mode, &m);
+            GrMatrix m = getSamplerMatrix(s);
+            GrSamplerState::SampleMode mode = 
+                fCurrDrawState.fSamplerStates[s].getSampleMode();
+            AdjustTextureMatrix(texture, mode, &m);
 
-                // ES doesn't allow you to pass true to the transpose param,
-                // so do our own transpose
-                GrScalar mt[]  = {
-                    m[GrMatrix::kScaleX],
-                    m[GrMatrix::kSkewY],
-                    m[GrMatrix::kPersp0],
-                    m[GrMatrix::kSkewX],
-                    m[GrMatrix::kScaleY],
-                    m[GrMatrix::kPersp1],
-                    m[GrMatrix::kTransX],
-                    m[GrMatrix::kTransY],
-                    m[GrMatrix::kPersp2]
-                };
-            #if GR_GL_ATTRIBUTE_MATRICES
-                GR_GL(VertexAttrib4fv(TEXMAT_ATTR_LOCATION(0)+0, mt+0));
-                GR_GL(VertexAttrib4fv(TEXMAT_ATTR_LOCATION(0)+1, mt+3));
-                GR_GL(VertexAttrib4fv(TEXMAT_ATTR_LOCATION(0)+2, mt+6));
-            #else
+            // ES doesn't allow you to pass true to the transpose param,
+            // so do our own transpose
+            GrScalar mt[]  = {
+                m[GrMatrix::kScaleX],
+                m[GrMatrix::kSkewY],
+                m[GrMatrix::kPersp0],
+                m[GrMatrix::kSkewX],
+                m[GrMatrix::kScaleY],
+                m[GrMatrix::kPersp1],
+                m[GrMatrix::kTransX],
+                m[GrMatrix::kTransY],
+                m[GrMatrix::kPersp2]
+            };
+            if (GrGLProgram::kSetAsAttribute ==
+                fProgramData->fUniLocations.fStages[s].fTextureMatrixUni) {
+                int baseIdx = GrGLProgram::TextureMatrixAttributeIdx(s);
+                GR_GL(VertexAttrib4fv(baseIdx + 0, mt+0));
+                GR_GL(VertexAttrib4fv(baseIdx + 1, mt+3));
+                GR_GL(VertexAttrib4fv(baseIdx + 2, mt+6));
+            } else {
                 GR_GL(UniformMatrix3fv(uni, 1, false, mt));
-            #endif
+            }
             recordHWSamplerMatrix(s, getSamplerMatrix(s));
         }
     }
@@ -348,7 +355,7 @@
 
     const int &uni = fProgramData->fUniLocations.fStages[s].fRadial2Uni;
     const GrSamplerState& sampler = fCurrDrawState.fSamplerStates[s];
-    if (-1 != uni &&
+    if (GrGLProgram::kUnusedUniform != uni &&
         (fProgramData->fRadial2CenterX1[s] != sampler.getRadial2CenterX1() ||
          fProgramData->fRadial2Radius0[s]  != sampler.getRadial2Radius0()  ||
          fProgramData->fRadial2PosRoot[s]  != sampler.isRadial2PosRoot())) {
@@ -375,7 +382,7 @@
 
 void GrGpuGLShaders::flushTexelSize(int s) {
     const int& uni = fProgramData->fUniLocations.fStages[s].fNormalizedTexelSizeUni;
-    if (-1 != uni) {
+    if (GrGLProgram::kUnusedUniform != uni) {
         GrGLTexture* texture = (GrGLTexture*) fCurrDrawState.fTextures[s];
         if (texture->allocWidth() != fProgramData->fTextureWidth[s] ||
             texture->allocHeight() != fProgramData->fTextureWidth[s]) {
@@ -404,7 +411,7 @@
                         GrColorUnpackB(fCurrDrawState.fColor) / 255.f,
                         GrColorUnpackA(fCurrDrawState.fColor) / 255.f
                     };
-                    GR_GL(VertexAttrib4fv(COL_ATTR_LOCATION, c));
+                    GR_GL(VertexAttrib4fv(GrGLProgram::ColorAttributeIdx(), c));
                     fHWDrawState.fColor = fCurrDrawState.fColor;
                 }
                 break;
@@ -417,7 +424,8 @@
                         GrColorUnpackB(fCurrDrawState.fColor) / 255.f,
                         GrColorUnpackA(fCurrDrawState.fColor) / 255.f
                     };
-                    GrAssert(-1 != fProgramData->fUniLocations.fColorUni);
+                    GrAssert(GrGLProgram::kUnusedUniform != 
+                             fProgramData->fUniLocations.fColorUni);
                     GR_GL(Uniform4fv(fProgramData->fUniLocations.fColorUni, 1, c));
                     fProgramData->fColor = fCurrDrawState.fColor;
                 }
@@ -440,16 +448,17 @@
     if (fDirtyFlags.fRenderTargetChanged) {
         // our coords are in pixel space and the GL matrices map to NDC
         // so if the viewport changed, our matrix is now wrong.
-#if GR_GL_ATTRIBUTE_MATRICES
         fHWDrawState.fViewMatrix = GrMatrix::InvalidMatrix();
-#else
         // we assume all shader matrices may be wrong after viewport changes
         fProgramCache->invalidateViewMatrices();
-#endif
     }
 
     buildProgram(type);
     fProgramData = fProgramCache->getProgramData(fCurrentProgram);
+    if (NULL == fProgramData) {
+        GrAssert(!"Failed to create program!");
+        return false;
+    }
 
     if (fHWProgramID != fProgramData->fProgramID) {
         GR_GL(UseProgram(fProgramData->fProgramID));
@@ -462,15 +471,17 @@
 
     this->flushColor();
 
-#if GR_GL_ATTRIBUTE_MATRICES
-    GrMatrix& currViewMatrix = fHWDrawState.fViewMatrix;
-#else
-    GrMatrix& currViewMatrix = fProgramData->fViewMatrix;
-#endif
+    GrMatrix* currViewMatrix;
+    if (GrGLProgram::kSetAsAttribute == 
+        fProgramData->fUniLocations.fViewMatrixUni) {
+        currViewMatrix = &fHWDrawState.fViewMatrix;
+    } else {
+        currViewMatrix = &fProgramData->fViewMatrix;
+    }
 
-    if (currViewMatrix != fCurrDrawState.fViewMatrix) {
+    if (*currViewMatrix != fCurrDrawState.fViewMatrix) {
         flushViewMatrix();
-        currViewMatrix = fCurrDrawState.fViewMatrix;
+        *currViewMatrix = fCurrDrawState.fViewMatrix;
     }
 
     for (int s = 0; s < kNumStages; ++s) {
@@ -540,42 +551,43 @@
                                    fGeometrySrc.fVertexLayout)));
 
     if (posAndTexChange) {
-        GR_GL(VertexAttribPointer(POS_ATTR_LOCATION, 2, scalarType,
-                                  false, newStride, (GrGLvoid*)vertexOffset));
+        int idx = GrGLProgram::PositionAttributeIdx();
+        GR_GL(VertexAttribPointer(idx, 2, scalarType, false, newStride, 
+                                  (GrGLvoid*)vertexOffset));
         fHWGeometryState.fVertexOffset = vertexOffset;
     }
 
     for (int t = 0; t < kMaxTexCoords; ++t) {
         if (newTexCoordOffsets[t] > 0) {
             GrGLvoid* texCoordOffset = (GrGLvoid*)(vertexOffset + newTexCoordOffsets[t]);
+            int idx = GrGLProgram::TexCoordAttributeIdx(t);
             if (oldTexCoordOffsets[t] <= 0) {
-                GR_GL(EnableVertexAttribArray(TEX_ATTR_LOCATION(t)));
-                GR_GL(VertexAttribPointer(TEX_ATTR_LOCATION(t), 2, scalarType,
-                                          texCoordNorm, newStride, texCoordOffset));
+                GR_GL(EnableVertexAttribArray(idx));
+                GR_GL(VertexAttribPointer(idx, 2, scalarType, texCoordNorm, 
+                                          newStride, texCoordOffset));
             } else if (posAndTexChange ||
                        newTexCoordOffsets[t] != oldTexCoordOffsets[t]) {
-                GR_GL(VertexAttribPointer(TEX_ATTR_LOCATION(t), 2, scalarType,
-                                          texCoordNorm, newStride, texCoordOffset));
+                GR_GL(VertexAttribPointer(idx, 2, scalarType, texCoordNorm, 
+                                          newStride, texCoordOffset));
             }
         } else if (oldTexCoordOffsets[t] > 0) {
-            GR_GL(DisableVertexAttribArray(TEX_ATTR_LOCATION(t)));
+            GR_GL(DisableVertexAttribArray(GrGLProgram::TexCoordAttributeIdx(t)));
         }
     }
 
     if (newColorOffset > 0) {
         GrGLvoid* colorOffset = (int8_t*)(vertexOffset + newColorOffset);
+        int idx = GrGLProgram::ColorAttributeIdx();
         if (oldColorOffset <= 0) {
-            GR_GL(EnableVertexAttribArray(COL_ATTR_LOCATION));
-            GR_GL(VertexAttribPointer(COL_ATTR_LOCATION, 4,
-                                      GR_GL_UNSIGNED_BYTE,
+            GR_GL(EnableVertexAttribArray(idx));
+            GR_GL(VertexAttribPointer(idx, 4, GR_GL_UNSIGNED_BYTE,
                                       true, newStride, colorOffset));
         } else if (allOffsetsChange || newColorOffset != oldColorOffset) {
-            GR_GL(VertexAttribPointer(COL_ATTR_LOCATION, 4,
-                                      GR_GL_UNSIGNED_BYTE,
+            GR_GL(VertexAttribPointer(idx, 4, GR_GL_UNSIGNED_BYTE,
                                       true, newStride, colorOffset));
         }
     } else if (oldColorOffset > 0) {
-        GR_GL(DisableVertexAttribArray(COL_ATTR_LOCATION));
+        GR_GL(DisableVertexAttribArray(GrGLProgram::ColorAttributeIdx()));
     }
 
     fHWGeometryState.fVertexLayout = fGeometrySrc.fVertexLayout;