Refactor GrGLUniformManager::UniformHandle to initialize itself by default

Refactor GrGLUniformManager::UniformHandle to initialize itself to
"invalid" state by default. This simplifies the effect
constructors. In the future, it should also help catch potential
uninitialized uniform variable usage.

Remove unneeded explicit uniform handle validity assertions before the
handle usage. The assertion will always be made when handle is
converted to index.

BUG=skia:1492
R=bsalomon@google.com

Author: kkinnunen@nvidia.com

Review URL: https://chromiumcodereview.appspot.com/22340010

git-svn-id: http://skia.googlecode.com/svn/trunk/src@10713 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/effects/SkBicubicImageFilter.cpp b/effects/SkBicubicImageFilter.cpp
index db8dbfd..26d4b2e 100644
--- a/effects/SkBicubicImageFilter.cpp
+++ b/effects/SkBicubicImageFilter.cpp
@@ -215,8 +215,6 @@
 GrGLBicubicEffect::GrGLBicubicEffect(const GrBackendEffectFactory& factory,
                                      const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fCoefficientsUni(GrGLUniformManager::kInvalidUniformHandle)
-    , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle)
     , fEffectMatrix(drawEffect.castEffect<GrBicubicEffect>().coordsType()) {
 }
 
diff --git a/effects/SkColorMatrixFilter.cpp b/effects/SkColorMatrixFilter.cpp
index 3d1fd6f..7bb9673 100644
--- a/effects/SkColorMatrixFilter.cpp
+++ b/effects/SkColorMatrixFilter.cpp
@@ -391,9 +391,8 @@
 
         GLEffect(const GrBackendEffectFactory& factory,
                  const GrDrawEffect&)
-        : INHERITED(factory)
-        , fMatrixHandle(GrGLUniformManager::kInvalidUniformHandle)
-        , fVectorHandle(GrGLUniformManager::kInvalidUniformHandle) {}
+        : INHERITED(factory) {
+        }
 
         virtual void emitCode(GrGLShaderBuilder* builder,
                               const GrDrawEffect&,
diff --git a/effects/SkLightingImageFilter.cpp b/effects/SkLightingImageFilter.cpp
index 7a74f73..ccb1dc5 100644
--- a/effects/SkLightingImageFilter.cpp
+++ b/effects/SkLightingImageFilter.cpp
@@ -25,7 +25,6 @@
 
 // For brevity
 typedef GrGLUniformManager::UniformHandle UniformHandle;
-static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle;
 #endif
 
 namespace {
@@ -1150,8 +1149,6 @@
 GrGLLightingEffect::GrGLLightingEffect(const GrBackendEffectFactory& factory,
                                        const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fImageIncrementUni(kInvalidUniformHandle)
-    , fSurfaceScaleUni(kInvalidUniformHandle)
     , fEffectMatrix(drawEffect.castEffect<GrLightingEffect>().coordsType()) {
     const GrLightingEffect& m = drawEffect.castEffect<GrLightingEffect>();
     fLight = m.light()->createGLLight();
@@ -1294,8 +1291,7 @@
 
 GrGLDiffuseLightingEffect::GrGLDiffuseLightingEffect(const GrBackendEffectFactory& factory,
                                                      const GrDrawEffect& drawEffect)
-    : INHERITED(factory, drawEffect)
-    , fKDUni(kInvalidUniformHandle) {
+    : INHERITED(factory, drawEffect) {
 }
 
 void GrGLDiffuseLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkString* funcName) {
@@ -1372,9 +1368,7 @@
 
 GrGLSpecularLightingEffect::GrGLSpecularLightingEffect(const GrBackendEffectFactory& factory,
                                                        const GrDrawEffect& drawEffect)
-    : GrGLLightingEffect(factory, drawEffect)
-    , fKSUni(kInvalidUniformHandle)
-    , fShininessUni(kInvalidUniformHandle) {
+    : INHERITED(factory, drawEffect) {
 }
 
 void GrGLSpecularLightingEffect::emitLightFunc(GrGLShaderBuilder* builder, SkString* funcName) {
diff --git a/effects/SkMagnifierImageFilter.cpp b/effects/SkMagnifierImageFilter.cpp
index f7fbda2..a747620 100644
--- a/effects/SkMagnifierImageFilter.cpp
+++ b/effects/SkMagnifierImageFilter.cpp
@@ -118,9 +118,6 @@
 GrGLMagnifierEffect::GrGLMagnifierEffect(const GrBackendEffectFactory& factory,
                                          const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fOffsetVar(GrGLUniformManager::kInvalidUniformHandle)
-    , fZoomVar(GrGLUniformManager::kInvalidUniformHandle)
-    , fInsetVar(GrGLUniformManager::kInvalidUniformHandle)
     , fEffectMatrix(drawEffect.castEffect<GrMagnifierEffect>().coordsType()) {
 }
 
diff --git a/effects/SkMatrixConvolutionImageFilter.cpp b/effects/SkMatrixConvolutionImageFilter.cpp
index bedd6f8..1f60a49 100644
--- a/effects/SkMatrixConvolutionImageFilter.cpp
+++ b/effects/SkMatrixConvolutionImageFilter.cpp
@@ -351,11 +351,6 @@
 GrGLMatrixConvolutionEffect::GrGLMatrixConvolutionEffect(const GrBackendEffectFactory& factory,
                                                          const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fKernelUni(GrGLUniformManager::kInvalidUniformHandle)
-    , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle)
-    , fTargetUni(GrGLUniformManager::kInvalidUniformHandle)
-    , fGainUni(GrGLUniformManager::kInvalidUniformHandle)
-    , fBiasUni(GrGLUniformManager::kInvalidUniformHandle)
     , fEffectMatrix(drawEffect.castEffect<GrMatrixConvolutionEffect>().coordsType()) {
     const GrMatrixConvolutionEffect& m = drawEffect.castEffect<GrMatrixConvolutionEffect>();
     fKernelSize = m.kernelSize();
diff --git a/effects/SkMorphologyImageFilter.cpp b/effects/SkMorphologyImageFilter.cpp
index 94a6327..33dd2e6 100644
--- a/effects/SkMorphologyImageFilter.cpp
+++ b/effects/SkMorphologyImageFilter.cpp
@@ -312,7 +312,6 @@
 GrGLMorphologyEffect::GrGLMorphologyEffect(const GrBackendEffectFactory& factory,
                                            const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fImageIncrementUni(GrGLUniformManager::kInvalidUniformHandle)
     , fEffectMatrix(drawEffect.castEffect<GrMorphologyEffect>().coordsType()) {
     const GrMorphologyEffect& m = drawEffect.castEffect<GrMorphologyEffect>();
     fRadius = m.radius();
diff --git a/effects/gradients/SkGradientShader.cpp b/effects/gradients/SkGradientShader.cpp
index 4e528b5..2c554dc 100644
--- a/effects/gradients/SkGradientShader.cpp
+++ b/effects/gradients/SkGradientShader.cpp
@@ -826,7 +826,6 @@
 GrGLGradientEffect::GrGLGradientEffect(const GrBackendEffectFactory& factory)
     : INHERITED(factory)
     , fCachedYCoord(SK_ScalarMax)
-    , fFSYUni(GrGLUniformManager::kInvalidUniformHandle)
     , fEffectMatrix(kCoordsType) {
 }
 
diff --git a/effects/gradients/SkTwoPointConicalGradient.cpp b/effects/gradients/SkTwoPointConicalGradient.cpp
index 664ec91..ee6e25a 100644
--- a/effects/gradients/SkTwoPointConicalGradient.cpp
+++ b/effects/gradients/SkTwoPointConicalGradient.cpp
@@ -336,7 +336,6 @@
 
 // For brevity
 typedef GrGLUniformManager::UniformHandle UniformHandle;
-static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle;
 
 class GrGLConical2Gradient : public GrGLGradientEffect {
 public:
@@ -475,8 +474,6 @@
 GrGLConical2Gradient::GrGLConical2Gradient(const GrBackendEffectFactory& factory,
                                            const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fVSParamUni(kInvalidUniformHandle)
-    , fFSParamUni(kInvalidUniformHandle)
     , fVSVaryingName(NULL)
     , fFSVaryingName(NULL)
     , fCachedCenter(SK_ScalarMax)
diff --git a/effects/gradients/SkTwoPointRadialGradient.cpp b/effects/gradients/SkTwoPointRadialGradient.cpp
index 3d526a6..46724cb 100644
--- a/effects/gradients/SkTwoPointRadialGradient.cpp
+++ b/effects/gradients/SkTwoPointRadialGradient.cpp
@@ -376,7 +376,6 @@
 
 // For brevity
 typedef GrGLUniformManager::UniformHandle UniformHandle;
-static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle;
 
 class GrGLRadial2Gradient : public GrGLGradientEffect {
 
@@ -516,8 +515,6 @@
 GrGLRadial2Gradient::GrGLRadial2Gradient(const GrBackendEffectFactory& factory,
                                          const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fVSParamUni(kInvalidUniformHandle)
-    , fFSParamUni(kInvalidUniformHandle)
     , fVSVaryingName(NULL)
     , fFSVaryingName(NULL)
     , fCachedCenter(SK_ScalarMax)
diff --git a/gpu/effects/GrConvolutionEffect.cpp b/gpu/effects/GrConvolutionEffect.cpp
index e7fb8e5..65da811 100644
--- a/gpu/effects/GrConvolutionEffect.cpp
+++ b/gpu/effects/GrConvolutionEffect.cpp
@@ -14,7 +14,6 @@
 
 // For brevity
 typedef GrGLUniformManager::UniformHandle UniformHandle;
-static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle;
 
 class GrGLConvolutionEffect : public GrGLEffect {
 public:
@@ -50,9 +49,6 @@
 GrGLConvolutionEffect::GrGLConvolutionEffect(const GrBackendEffectFactory& factory,
                                              const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fKernelUni(kInvalidUniformHandle)
-    , fImageIncrementUni(kInvalidUniformHandle)
-    , fBoundsUni(kInvalidUniformHandle)
     , fEffectMatrix(drawEffect.castEffect<GrConvolutionEffect>().coordsType()) {
     const GrConvolutionEffect& c = drawEffect.castEffect<GrConvolutionEffect>();
     fRadius = c.radius();
diff --git a/gpu/effects/GrTextureDomainEffect.cpp b/gpu/effects/GrTextureDomainEffect.cpp
index eb4001d..80fa770 100644
--- a/gpu/effects/GrTextureDomainEffect.cpp
+++ b/gpu/effects/GrTextureDomainEffect.cpp
@@ -38,7 +38,6 @@
 GrGLTextureDomainEffect::GrGLTextureDomainEffect(const GrBackendEffectFactory& factory,
                                                  const GrDrawEffect& drawEffect)
     : INHERITED(factory)
-    , fNameUni(GrGLUniformManager::kInvalidUniformHandle)
     , fEffectMatrix(drawEffect.castEffect<GrTextureDomainEffect>().coordsType()) {
     fPrevDomain[0] = SK_FloatNaN;
 }
diff --git a/gpu/gl/GrGLEffectMatrix.cpp b/gpu/gl/GrGLEffectMatrix.cpp
index 523b37e..437e683 100644
--- a/gpu/gl/GrGLEffectMatrix.cpp
+++ b/gpu/gl/GrGLEffectMatrix.cpp
@@ -189,8 +189,7 @@
                                const SkMatrix& matrix,
                                const GrDrawEffect& drawEffect,
                                const GrTexture* texture) {
-    GrAssert((GrGLUniformManager::kInvalidUniformHandle == fUni) ==
-             (kVoid_GrSLType == fUniType));
+    GrAssert(fUni.isValid() != (kVoid_GrSLType == fUniType));
     const SkMatrix& coordChangeMatrix = GrEffect::kLocal_CoordsType == fCoordsType ?
                                             drawEffect.getCoordChangeMatrix() :
                                             SkMatrix::I();
diff --git a/gpu/gl/GrGLEffectMatrix.h b/gpu/gl/GrGLEffectMatrix.h
index fc4b783..9c05c57 100644
--- a/gpu/gl/GrGLEffectMatrix.h
+++ b/gpu/gl/GrGLEffectMatrix.h
@@ -59,8 +59,7 @@
     };
 
     GrGLEffectMatrix(CoordsType coordsType)
-        : fUni(GrGLUniformManager::kInvalidUniformHandle)
-        , fCoordsType(coordsType) {
+        : fCoordsType(coordsType) {
         GrAssert(GrEffect::kLocal_CoordsType == coordsType ||
                  GrEffect::kPosition_CoordsType == coordsType);
         fPrevMatrix = SkMatrix::InvalidMatrix();
diff --git a/gpu/gl/GrGLProgram.cpp b/gpu/gl/GrGLProgram.cpp
index 8a24d60..300e7a7 100644
--- a/gpu/gl/GrGLProgram.cpp
+++ b/gpu/gl/GrGLProgram.cpp
@@ -753,7 +753,7 @@
 void GrGLProgram::initSamplerUniforms() {
     GL_CALL(UseProgram(fProgramID));
     GrGLint texUnitIdx = 0;
-    if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopySamplerUni) {
+    if (fUniformHandles.fDstCopySamplerUni.isValid()) {
         fUniformManager.setSampler(fUniformHandles.fDstCopySamplerUni, texUnitIdx);
         fDstCopyTexUnit = texUnitIdx++;
     }
@@ -772,7 +772,7 @@
     effect->fTextureUnits.reset(numSamplers);
     for (int s = 0; s < numSamplers; ++s) {
         UniformHandle handle = effect->fSamplerUnis[s];
-        if (GrGLUniformManager::kInvalidUniformHandle != handle) {
+        if (handle.isValid()) {
             fUniformManager.setSampler(handle, *texUnitIdx);
             effect->fTextureUnits[s] = (*texUnitIdx)++;
         }
@@ -795,7 +795,7 @@
     GrAssert((*stage.getEffect())->numTextures() == numSamplers);
     for (int s = 0; s < numSamplers; ++s) {
         UniformHandle handle = effect.fSamplerUnis[s];
-        if (GrGLUniformManager::kInvalidUniformHandle != handle) {
+        if (handle.isValid()) {
             const GrTextureAccess& access = (*stage.getEffect())->textureAccess(s);
             GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture());
             int unit = effect.fTextureUnits[s];
@@ -830,7 +830,7 @@
     this->setMatrixAndRenderTargetHeight(drawState);
 
     // Setup the SkXfermode::Mode-based colorfilter uniform if necessary
-    if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fColorFilterUni &&
+    if (fUniformHandles.fColorFilterUni.isValid() &&
         fColorFilterColor != drawState.getColorFilterColor()) {
         GrGLfloat c[4];
         GrColorToRGBAFloat(drawState.getColorFilterColor(), c);
@@ -839,10 +839,7 @@
     }
 
     if (NULL != dstCopy) {
-        if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyTopLeftUni) {
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fDstCopyScaleUni);
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
-                     fUniformHandles.fDstCopySamplerUni);
+        if (fUniformHandles.fDstCopyTopLeftUni.isValid()) {
             fUniformManager.set2f(fUniformHandles.fDstCopyTopLeftUni,
                                   static_cast<GrGLfloat>(dstCopy->offset().fX),
                                   static_cast<GrGLfloat>(dstCopy->offset().fY));
@@ -853,15 +850,13 @@
             static GrTextureParams kParams; // the default is clamp, nearest filtering.
             gpu->bindTexture(fDstCopyTexUnit, kParams, texture);
         } else {
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle ==
-                    fUniformHandles.fDstCopyScaleUni);
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle ==
-                    fUniformHandles.fDstCopySamplerUni);
+            GrAssert(!fUniformHandles.fDstCopyScaleUni.isValid());
+            GrAssert(!fUniformHandles.fDstCopySamplerUni.isValid());
         }
     } else {
-        GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fDstCopyTopLeftUni);
-        GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fDstCopyScaleUni);
-        GrAssert(GrGLUniformManager::kInvalidUniformHandle == fUniformHandles.fDstCopySamplerUni);
+        GrAssert(!fUniformHandles.fDstCopyTopLeftUni.isValid());
+        GrAssert(!fUniformHandles.fDstCopyScaleUni.isValid());
+        GrAssert(!fUniformHandles.fDstCopySamplerUni.isValid());
     }
 
     for (int e = 0; e < fColorEffects.count(); ++e) {
@@ -902,8 +897,6 @@
                     // OpenGL ES doesn't support unsigned byte varieties of glUniform
                     GrGLfloat c[4];
                     GrColorToRGBAFloat(color, c);
-                    GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
-                             fUniformHandles.fColorUni);
                     fUniformManager.set4fv(fUniformHandles.fColorUni, 0, 1, c);
                     fColor = color;
                 }
@@ -943,8 +936,6 @@
                     // OpenGL ES doesn't support unsigned byte varieties of glUniform
                     GrGLfloat c[4];
                     GrColorToRGBAFloat(coverage, c);
-                    GrAssert(GrGLUniformManager::kInvalidUniformHandle !=
-                             fUniformHandles.fCoverageUni);
                     fUniformManager.set4fv(fUniformHandles.fCoverageUni, 0, 1, c);
                     fCoverage = coverage;
                 }
@@ -968,7 +959,7 @@
     size.set(rt->width(), rt->height());
 
     // Load the RT height uniform if it is needed to y-flip gl_FragCoord.
-    if (GrGLUniformManager::kInvalidUniformHandle != fUniformHandles.fRTHeightUni &&
+    if (fUniformHandles.fRTHeightUni.isValid() &&
         fMatrixState.fRenderTargetSize.fHeight != size.fHeight) {
         fUniformManager.set1f(fUniformHandles.fRTHeightUni, SkIntToScalar(size.fHeight));
     }
diff --git a/gpu/gl/GrGLProgram.h b/gpu/gl/GrGLProgram.h
index 3534552..279890f 100644
--- a/gpu/gl/GrGLProgram.h
+++ b/gpu/gl/GrGLProgram.h
@@ -132,17 +132,6 @@
         UniformHandle       fDstCopyTopLeftUni;
         UniformHandle       fDstCopyScaleUni;
         UniformHandle       fDstCopySamplerUni;
-
-        UniformHandles() {
-            fViewMatrixUni = GrGLUniformManager::kInvalidUniformHandle;
-            fColorUni = GrGLUniformManager::kInvalidUniformHandle;
-            fCoverageUni = GrGLUniformManager::kInvalidUniformHandle;
-            fColorFilterUni = GrGLUniformManager::kInvalidUniformHandle;
-            fRTHeightUni = GrGLUniformManager::kInvalidUniformHandle;
-            fDstCopyTopLeftUni = GrGLUniformManager::kInvalidUniformHandle;
-            fDstCopyScaleUni = GrGLUniformManager::kInvalidUniformHandle;
-            fDstCopySamplerUni = GrGLUniformManager::kInvalidUniformHandle;
-        }
     };
 
     typedef SkSTArray<4, UniformHandle, true> SamplerUniSArray;
diff --git a/gpu/gl/GrGLShaderBuilder.cpp b/gpu/gl/GrGLShaderBuilder.cpp
index 36eb6d5..5ed8f0d 100644
--- a/gpu/gl/GrGLShaderBuilder.cpp
+++ b/gpu/gl/GrGLShaderBuilder.cpp
@@ -110,9 +110,6 @@
     , fUsesGS(false)
 #endif
     , fSetupFragPosition(false)
-    , fRTHeightUniform(GrGLUniformManager::kInvalidUniformHandle)
-    , fDstCopyTopLeftUniform (GrGLUniformManager::kInvalidUniformHandle)
-    , fDstCopyScaleUniform (GrGLUniformManager::kInvalidUniformHandle)
     , fTopLeftFragPosRead(kTopLeftFragPosRead_FragPosKey == desc.getHeader().fFragPosKey) {
 
     const GrGLProgramDesc::KeyHeader& header = desc.getHeader();
@@ -391,7 +388,7 @@
     GrAssert(0 != visibility);
 
     BuilderUniform& uni = fUniforms.push_back();
-    UniformHandle h = index_to_handle(fUniforms.count() - 1);
+    UniformHandle h = GrGLUniformManager::UniformHandle::CreateFromUniformIndex(fUniforms.count() - 1);
     GR_DEBUGCODE(UniformHandle h2 =)
     fUniformManager.appendUniform(type, count);
     // We expect the uniform manager to initially have no uniforms and that all uniforms are added
@@ -418,10 +415,6 @@
     return h;
 }
 
-const GrGLShaderVar& GrGLShaderBuilder::getUniformVariable(UniformHandle u) const {
-    return fUniforms[handle_to_index(u)].fVariable;
-}
-
 bool GrGLShaderBuilder::addAttribute(GrSLType type,
                                      const char* name) {
     for (int i = 0; i < fVSAttrs.count(); ++i) {
@@ -512,7 +505,7 @@
             // temporarily change the stage index because we're inserting non-stage code.
             CodeStage::AutoStageRestore csar(&fCodeStage, NULL);
 
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle == fRTHeightUniform);
+            GrAssert(!fRTHeightUniform.isValid());
             const char* rtHeightName;
 
             fRTHeightUniform = this->addUniform(kFragment_ShaderType,
@@ -524,7 +517,7 @@
                                    kCoordName, rtHeightName);
             fSetupFragPosition = true;
         }
-        GrAssert(GrGLUniformManager::kInvalidUniformHandle != fRTHeightUniform);
+        GrAssert(fRTHeightUniform.isValid());
         return kCoordName;
     }
 }
diff --git a/gpu/gl/GrGLShaderBuilder.h b/gpu/gl/GrGLShaderBuilder.h
index b67846a..e56f459 100644
--- a/gpu/gl/GrGLShaderBuilder.h
+++ b/gpu/gl/GrGLShaderBuilder.h
@@ -33,8 +33,7 @@
     class TextureSampler {
     public:
         TextureSampler()
-            : fConfigComponentMask(0)
-            , fSamplerUniform(GrGLUniformManager::kInvalidUniformHandle) {
+            : fConfigComponentMask(0) {
             // we will memcpy the first 4 bytes from passed in swizzle. This ensures the string is
             // terminated.
             fSwizzle[4] = '\0';
@@ -44,7 +43,7 @@
 
         TextureSampler& operator= (const TextureSampler& other) {
             GrAssert(0 == fConfigComponentMask);
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle == fSamplerUniform);
+            GrAssert(!fSamplerUniform.isValid());
 
             fConfigComponentMask = other.fConfigComponentMask;
             fSamplerUniform = other.fSamplerUniform;
@@ -67,7 +66,7 @@
                   int idx) {
             GrAssert(!this->isInitialized());
             GrAssert(0 != configComponentMask);
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle == fSamplerUniform);
+            GrAssert(!fSamplerUniform.isValid());
 
             GrAssert(NULL != builder);
             SkString name;
@@ -75,7 +74,7 @@
             fSamplerUniform = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
                                                   kSampler2D_GrSLType,
                                                   name.c_str());
-            GrAssert(GrGLUniformManager::kInvalidUniformHandle != fSamplerUniform);
+            GrAssert(fSamplerUniform.isValid());
 
             fConfigComponentMask = configComponentMask;
             memcpy(fSwizzle, swizzle, 4);
@@ -228,7 +227,9 @@
                                                       int arrayCount,
                                                       const char** outName = NULL);
 
-    const GrGLShaderVar& getUniformVariable(GrGLUniformManager::UniformHandle) const;
+    const GrGLShaderVar& getUniformVariable(GrGLUniformManager::UniformHandle u) const {
+        return fUniformManager.getBuilderUniform(fUniforms, u).fVariable;
+    }
 
     /**
      * Shortcut for getUniformVariable(u).c_str()
diff --git a/gpu/gl/GrGLUniformHandle.h b/gpu/gl/GrGLUniformHandle.h
index 231dd31..797afff 100644
--- a/gpu/gl/GrGLUniformHandle.h
+++ b/gpu/gl/GrGLUniformHandle.h
@@ -8,9 +8,8 @@
 #ifndef GrUniformHandle_DEFINED
 #define GrUniformHandle_DEFINED
 
-namespace {
-inline int handle_to_index(GrGLUniformManager::UniformHandle h) { return ~h; }
-inline GrGLUniformManager::UniformHandle index_to_handle(int i) { return ~i; }
+inline GrGLUniformManager::UniformHandle GrGLUniformManager::UniformHandle::CreateFromUniformIndex(int index) {
+    return GrGLUniformManager::UniformHandle(index);
 }
 
 #endif
diff --git a/gpu/gl/GrGLUniformManager.cpp b/gpu/gl/GrGLUniformManager.cpp
index da6726b..b559e10 100644
--- a/gpu/gl/GrGLUniformManager.cpp
+++ b/gpu/gl/GrGLUniformManager.cpp
@@ -22,11 +22,11 @@
     uni.fType = type;
     uni.fVSLocation = kUnusedUniform;
     uni.fFSLocation = kUnusedUniform;
-    return index_to_handle(idx);
+    return GrGLUniformManager::UniformHandle::CreateFromUniformIndex(idx);
 }
 
 void GrGLUniformManager::setSampler(UniformHandle u, GrGLint texUnit) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kSampler2D_GrSLType);
     GrAssert(GrGLShaderVar::kNonArray == uni.fArrayCount);
     // FIXME: We still insert a single sampler uniform for every stage. If the shader does not
@@ -42,7 +42,7 @@
 }
 
 void GrGLUniformManager::set1f(UniformHandle u, GrGLfloat v0) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kFloat_GrSLType);
     GrAssert(GrGLShaderVar::kNonArray == uni.fArrayCount);
     GrAssert(kUnusedUniform != uni.fFSLocation || kUnusedUniform != uni.fVSLocation);
@@ -58,7 +58,7 @@
                                 int offset,
                                 int arrayCount,
                                 const GrGLfloat v[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kFloat_GrSLType);
     GrAssert(arrayCount > 0);
     ASSERT_ARRAY_UPLOAD_IN_BOUNDS(uni, offset, arrayCount);
@@ -75,7 +75,7 @@
 }
 
 void GrGLUniformManager::set2f(UniformHandle u, GrGLfloat v0, GrGLfloat v1) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kVec2f_GrSLType);
     GrAssert(GrGLShaderVar::kNonArray == uni.fArrayCount);
     GrAssert(kUnusedUniform != uni.fFSLocation || kUnusedUniform != uni.fVSLocation);
@@ -91,7 +91,7 @@
                                 int offset,
                                 int arrayCount,
                                 const GrGLfloat v[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kVec2f_GrSLType);
     GrAssert(arrayCount > 0);
     ASSERT_ARRAY_UPLOAD_IN_BOUNDS(uni, offset, arrayCount);
@@ -105,7 +105,7 @@
 }
 
 void GrGLUniformManager::set3f(UniformHandle u, GrGLfloat v0, GrGLfloat v1, GrGLfloat v2) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kVec3f_GrSLType);
     GrAssert(GrGLShaderVar::kNonArray == uni.fArrayCount);
     GrAssert(kUnusedUniform != uni.fFSLocation || kUnusedUniform != uni.fVSLocation);
@@ -121,7 +121,7 @@
                                 int offset,
                                 int arrayCount,
                                 const GrGLfloat v[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kVec3f_GrSLType);
     GrAssert(arrayCount > 0);
     ASSERT_ARRAY_UPLOAD_IN_BOUNDS(uni, offset, arrayCount);
@@ -139,7 +139,7 @@
                                GrGLfloat v1,
                                GrGLfloat v2,
                                GrGLfloat v3) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kVec4f_GrSLType);
     GrAssert(GrGLShaderVar::kNonArray == uni.fArrayCount);
     GrAssert(kUnusedUniform != uni.fFSLocation || kUnusedUniform != uni.fVSLocation);
@@ -155,7 +155,7 @@
                                 int offset,
                                 int arrayCount,
                                 const GrGLfloat v[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kVec4f_GrSLType);
     GrAssert(arrayCount > 0);
     GrAssert(kUnusedUniform != uni.fFSLocation || kUnusedUniform != uni.fVSLocation);
@@ -168,7 +168,7 @@
 }
 
 void GrGLUniformManager::setMatrix3f(UniformHandle u, const GrGLfloat matrix[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kMat33f_GrSLType);
     GrAssert(GrGLShaderVar::kNonArray == uni.fArrayCount);
     // TODO: Re-enable this assert once texture matrices aren't forced on all effects
@@ -182,7 +182,7 @@
 }
 
 void GrGLUniformManager::setMatrix4f(UniformHandle u, const GrGLfloat matrix[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kMat44f_GrSLType);
     GrAssert(GrGLShaderVar::kNonArray == uni.fArrayCount);
     GrAssert(kUnusedUniform != uni.fFSLocation || kUnusedUniform != uni.fVSLocation);
@@ -198,7 +198,7 @@
                                       int offset,
                                       int arrayCount,
                                       const GrGLfloat matrices[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kMat33f_GrSLType);
     GrAssert(arrayCount > 0);
     ASSERT_ARRAY_UPLOAD_IN_BOUNDS(uni, offset, arrayCount);
@@ -217,7 +217,7 @@
                                       int offset,
                                       int arrayCount,
                                       const GrGLfloat matrices[]) const {
-    const Uniform& uni = fUniforms[handle_to_index(u)];
+    const Uniform& uni = fUniforms[u.toUniformIndex()];
     GrAssert(uni.fType == kMat44f_GrSLType);
     GrAssert(arrayCount > 0);
     ASSERT_ARRAY_UPLOAD_IN_BOUNDS(uni, offset, arrayCount);
@@ -267,3 +267,8 @@
         }
     }
 }
+
+const GrGLUniformManager::BuilderUniform&
+GrGLUniformManager::getBuilderUniform(const BuilderUniformArray& array, UniformHandle handle) const {
+    return array[handle.toUniformIndex()];
+}
diff --git a/gpu/gl/GrGLUniformManager.h b/gpu/gl/GrGLUniformManager.h
index ee693a6..863d66f 100644
--- a/gpu/gl/GrGLUniformManager.h
+++ b/gpu/gl/GrGLUniformManager.h
@@ -22,8 +22,29 @@
 class GrGLUniformManager {
 public:
     // Opaque handle to a uniform
-    typedef int UniformHandle;
-    static const UniformHandle kInvalidUniformHandle = 0;
+    class UniformHandle {
+    public:
+        static UniformHandle CreateFromUniformIndex(int i);
+
+        bool isValid() const { return 0 != fValue; }
+
+        bool operator==(const UniformHandle& other) const { return other.fValue == fValue; }
+
+        UniformHandle()
+            : fValue(0) {
+        }
+
+    private:
+        UniformHandle(int value)
+            : fValue(~value) {
+            GrAssert(isValid());
+        }
+
+        int toUniformIndex() const { GrAssert(isValid()); return ~fValue; }
+
+        int fValue;
+        friend class GrGLUniformManager; // For accessing toUniformIndex().
+    };
 
     GrGLUniformManager(const GrGLContext& context) : fContext(context) {}
 
@@ -65,6 +86,11 @@
      */
     void getUniformLocations(GrGLuint programID, const BuilderUniformArray& uniforms);
 
+    /**
+     * Called by the GrGLShaderBuilder to access the array by the handle (index).
+     */
+    const BuilderUniform& getBuilderUniform(const BuilderUniformArray&, GrGLUniformManager::UniformHandle) const;
+
 private:
     enum {
         kUnusedUniform = -1,
diff --git a/gpu/gl/GrGpuGL_program.cpp b/gpu/gl/GrGpuGL_program.cpp
index 786640c..20967c6 100644
--- a/gpu/gl/GrGpuGL_program.cpp
+++ b/gpu/gl/GrGpuGL_program.cpp
@@ -12,7 +12,6 @@
 #include "SkTSearch.h"
 
 typedef GrGLUniformManager::UniformHandle UniformHandle;
-static const UniformHandle kInvalidUniformHandle = GrGLUniformManager::kInvalidUniformHandle;
 
 struct GrGpuGL::ProgramCache::Entry {
     SK_DECLARE_INST_COUNT_ROOT(Entry);