Make GrGLProgram no longer depend on kNumStages

R=robertphillips@google.com

Review URL: https://codereview.chromium.org/16158007

git-svn-id: http://skia.googlecode.com/svn/trunk@9462 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGLProgram.h b/src/gpu/gl/GrGLProgram.h
index be6e687..ce43b71 100644
--- a/src/gpu/gl/GrGLProgram.h
+++ b/src/gpu/gl/GrGLProgram.h
@@ -156,8 +156,7 @@
     // Helper for setData() that sets the view matrix and loads the render target height uniform
     void setMatrixAndRenderTargetHeight(const GrDrawState&);
 
-    typedef SkSTArray<4, UniformHandle, true> SamplerUniSArray;
-
+    // handles for uniforms (aside from per-effect samplers)
     struct UniformHandles {
         UniformHandle       fViewMatrixUni;
         UniformHandle       fColorUni;
@@ -173,9 +172,6 @@
         UniformHandle       fDstCopyScaleUni;
         UniformHandle       fDstCopySamplerUni;
 
-        // An array of sampler uniform handles for each effect.
-        SamplerUniSArray    fEffectSamplerUnis[GrDrawState::kNumStages];
-
         UniformHandles() {
             fViewMatrixUni = GrGLUniformManager::kInvalidUniformHandle;
             fColorUni = GrGLUniformManager::kInvalidUniformHandle;
@@ -188,6 +184,17 @@
         }
     };
 
+    typedef SkSTArray<4, UniformHandle, true> SamplerUniSArray;
+    typedef SkSTArray<4, int, true> TextureUnitSArray;
+
+    struct EffectAndSamplers {
+        EffectAndSamplers() : fGLEffect(NULL) {}
+        ~EffectAndSamplers() { delete fGLEffect; }
+        GrGLEffect*         fGLEffect;
+        SamplerUniSArray    fSamplerUnis;  // sampler uni handles for effect's GrTextureAccess
+        TextureUnitSArray   fTextureUnits; // texture unit used for each entry of fSamplerUnis
+    };
+
     // GL IDs
     GrGLuint                    fVShaderID;
     GrGLuint                    fGShaderID;
@@ -199,8 +206,9 @@
     GrColor                     fColor;
     GrColor                     fCoverage;
     GrColor                     fColorFilterColor;
+    int                         fDstCopyTexUnit;
 
-    GrGLEffect*                 fEffects[GrDrawState::kNumStages];
+    SkTArray<EffectAndSamplers> fEffectStates;
 
     GrGLProgramDesc             fDesc;
     const GrGLContext&          fContext;