move texture flush and param update to separate function

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



git-svn-id: http://skia.googlecode.com/svn/trunk@4142 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGpuGL_program.cpp b/src/gpu/gl/GrGpuGL_program.cpp
index e79afe1..1f3216f 100644
--- a/src/gpu/gl/GrGpuGL_program.cpp
+++ b/src/gpu/gl/GrGpuGL_program.cpp
@@ -39,13 +39,6 @@
     fCount = 0;
 }
 
-void GrGpuGL::ProgramCache::invalidateViewMatrices() {
-    for (int i = 0; i < fCount; ++i) {
-        // set to illegal matrix
-        fEntries[i].fProgramData.fViewMatrix = GrMatrix::InvalidMatrix();
-    }
-}
-
 GrGLProgram::CachedData* GrGpuGL::ProgramCache::getProgramData(
                                         const GrGLProgram& desc,
                                         GrCustomStage** stages) {
@@ -111,15 +104,20 @@
 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
 
 void GrGpuGL::flushViewMatrix() {
-    const GrMatrix& vm = this->getDrawState().getViewMatrix();
-    if (!fProgramData->fViewMatrix.cheapEqualTo(vm)) {
+    const GrGLRenderTarget* rt = static_cast<const GrGLRenderTarget*>(this->getDrawState().getRenderTarget());
+    SkISize viewportSize;
+    const GrGLIRect& viewport = rt->getViewport();
+    viewportSize.set(viewport.fWidth, viewport.fHeight);
 
-        const GrRenderTarget* rt = this->getDrawState().getRenderTarget();
-        GrAssert(NULL != rt);
+    const GrMatrix& vm = this->getDrawState().getViewMatrix();
+
+    if (!fProgramData->fViewMatrix.cheapEqualTo(vm) ||
+        fProgramData->fViewportSize != viewportSize) {
+
         GrMatrix m;
         m.setAll(
-            GrIntToScalar(2) / rt->width(), 0, -GR_Scalar1,
-            0,-GrIntToScalar(2) / rt->height(), GR_Scalar1,
+            GrIntToScalar(2) / viewportSize.fWidth, 0, -GR_Scalar1,
+            0,-GrIntToScalar(2) / viewportSize.fHeight, GR_Scalar1,
             0, 0, GrMatrix::I()[8]);
         m.setConcat(m, vm);
 
@@ -142,6 +140,7 @@
         GL_CALL(UniformMatrix3fv(fProgramData->fUniLocations.fViewMatrixUni,
                                  1, false, mt));
         fProgramData->fViewMatrix = vm;
+        fProgramData->fViewportSize = viewportSize;
     }
 }
 
@@ -438,6 +437,9 @@
 
     for (int s = 0; s < GrDrawState::kNumStages; ++s) {
         if (this->isStageEnabled(s)) {
+
+            this->flushBoundTextureAndParams(s);
+
             this->flushTextureMatrixAndDomain(s);
 
             this->flushTexelSize(s);
@@ -455,6 +457,18 @@
         }
     }
     this->flushColorMatrix();
+
+    GrIRect* rect = NULL;
+    GrIRect clipBounds;
+    if (drawState.isClipState() &&
+        fClip.hasConservativeBounds()) {
+        fClip.getConservativeBounds().roundOut(&clipBounds);
+        rect = &clipBounds;
+    }
+    // This must come after textures are flushed because a texture may need
+    // to be msaa-resolved (which will modify bound FBO state).
+    this->flushRenderTarget(rect);
+
     return true;
 }