git-svn-id: http://skia.googlecode.com/svn/trunk@783 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gpu/src/GrGpuGLShaders2.cpp b/gpu/src/GrGpuGLShaders2.cpp
index 9aa327a..81f83c9 100644
--- a/gpu/src/GrGpuGLShaders2.cpp
+++ b/gpu/src/GrGpuGLShaders2.cpp
@@ -988,11 +988,11 @@
     if (kPoints_PrimitiveType != primType) {
         desc->fOptFlags |= ProgramDesc::kNotPoints_OptFlagBit;
     }
-#if GR_AGGRESSIVE_SHADER_OPTS

-    if (!(desc->fVertexLayout & kColor_VertexLayoutBit) &&

-        (0xffffffff == fCurrDrawState.fColor)) {

-        desc->fOptFlags |= ProgramDesc::kVertexColorAllOnes_OptFlagBit;

-    }

+#if GR_AGGRESSIVE_SHADER_OPTS
+    if (!(desc->fVertexLayout & kColor_VertexLayoutBit) &&
+        (0xffffffff == fCurrDrawState.fColor)) {
+        desc->fOptFlags |= ProgramDesc::kVertexColorAllOnes_OptFlagBit;
+    }
 #endif
 
     for (int s = 0; s < kNumStages; ++s) {
@@ -1094,7 +1094,7 @@
     fProgram = NULL;
     fProgramCache = new ProgramCache();
 
-#if GR_DEBUG
+#if 0
     ProgramUnitTest();
 #endif
 }
@@ -1332,43 +1332,9 @@
                                                   oldTexCoordOffsets,
                                                   &oldColorOffset);
 
-    const GLvoid* posPtr = (GLvoid*)(newStride * startVertex);
-
-    if (kBuffer_GeometrySrcType == fGeometrySrc.fVertexSrc) {
-        GrAssert(NULL != fGeometrySrc.fVertexBuffer);
-        GrAssert(!fGeometrySrc.fVertexBuffer->isLocked());
-        if (fHWGeometryState.fVertexBuffer != fGeometrySrc.fVertexBuffer) {
-            GrGLVertexBuffer* buf =
-                                (GrGLVertexBuffer*)fGeometrySrc.fVertexBuffer;
-            GR_GL(BindBuffer(GL_ARRAY_BUFFER, buf->bufferID()));
-            fHWGeometryState.fVertexBuffer = fGeometrySrc.fVertexBuffer;
-        }
-    } else {
-        if (kArray_GeometrySrcType == fGeometrySrc.fVertexSrc) {
-            posPtr = (void*)((intptr_t)fGeometrySrc.fVertexArray +
-                             (intptr_t)posPtr);
-        } else {
-            GrAssert(kReserved_GeometrySrcType == fGeometrySrc.fVertexSrc);
-            posPtr = (void*)((intptr_t)fVertices.get() + (intptr_t)posPtr);
-        }
-        if (NULL != fHWGeometryState.fVertexBuffer) {
-            GR_GL(BindBuffer(GL_ARRAY_BUFFER, 0));
-            fHWGeometryState.fVertexBuffer = NULL;
-        }
-    }
-
-    if (kBuffer_GeometrySrcType == fGeometrySrc.fIndexSrc) {
-        GrAssert(NULL != fGeometrySrc.fIndexBuffer);
-        GrAssert(!fGeometrySrc.fIndexBuffer->isLocked());
-        if (fHWGeometryState.fIndexBuffer != fGeometrySrc.fIndexBuffer) {
-            GrGLIndexBuffer* buf = (GrGLIndexBuffer*)fGeometrySrc.fIndexBuffer;
-            GR_GL(BindBuffer(GL_ELEMENT_ARRAY_BUFFER, buf->bufferID()));
-            fHWGeometryState.fIndexBuffer = fGeometrySrc.fIndexBuffer;
-        }
-    } else if (NULL != fHWGeometryState.fIndexBuffer) {
-        GR_GL(BindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
-        fHWGeometryState.fIndexBuffer = NULL;
-    }
+    const GLvoid* posPtr = setBuffersAndGetVertexStart(newStride, startVertex, 
+                                                       startIndex, vertexCount,
+                                                       indexCount);
 
     GLenum scalarType;
     bool texCoordNorm;
@@ -1388,7 +1354,7 @@
     bool strideChange = newStride != oldStride;
     bool posChange = baseChange || scalarChange || strideChange;
 
-    if (posChange) {
+    if (fHWGeometryState.fArrayPtrsDirty || posChange) {
         GR_GL(VertexAttribPointer(POS_ATTR_LOCATION, 2, scalarType,
                                   false, newStride, posPtr));
         fHWGeometryState.fPositionPtr = posPtr;
@@ -1399,8 +1365,10 @@
             GLvoid* texCoordPtr = (int8_t*)posPtr + newTexCoordOffsets[t];
             if (oldTexCoordOffsets[t] <= 0) {
                 GR_GL(EnableVertexAttribArray(TEX_ATTR_LOCATION(t)));
-            }
-            if (posChange || newTexCoordOffsets[t] != oldTexCoordOffsets[t]) {
+                GR_GL(VertexAttribPointer(TEX_ATTR_LOCATION(t), 2, scalarType,
+                                          texCoordNorm, newStride, texCoordPtr));
+            } else if (fHWGeometryState.fArrayPtrsDirty || posChange || 
+                newTexCoordOffsets[t] != oldTexCoordOffsets[t]) {
                 GR_GL(VertexAttribPointer(TEX_ATTR_LOCATION(t), 2, scalarType,
                                           texCoordNorm, newStride, texCoordPtr));
             }
@@ -1413,8 +1381,11 @@
         GLvoid* colorPtr = (int8_t*)posPtr + newColorOffset;
         if (oldColorOffset <= 0) {
             GR_GL(EnableVertexAttribArray(COL_ATTR_LOCATION));
-        }
-        if (posChange || newColorOffset != oldColorOffset) {
+            GR_GL(VertexAttribPointer(COL_ATTR_LOCATION, 4,
+                                      GL_UNSIGNED_BYTE,
+                                      true, newStride, colorPtr));
+        } else if (fHWGeometryState.fArrayPtrsDirty || posChange || 
+            newColorOffset != oldColorOffset) {
             GR_GL(VertexAttribPointer(COL_ATTR_LOCATION, 4,
                                       GL_UNSIGNED_BYTE,
                                       true, newStride, colorPtr));
@@ -1427,3 +1398,4 @@
 }
 #endif
 
+