Add support for vertex data rendered from CPU arrays.
Review URL: https://codereview.appspot.com/7380044

git-svn-id: http://skia.googlecode.com/svn/trunk@7807 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/gl/GrGpuGL.cpp b/src/gpu/gl/GrGpuGL.cpp
index 785b500..235811c 100644
--- a/src/gpu/gl/GrGpuGL.cpp
+++ b/src/gpu/gl/GrGpuGL.cpp
@@ -1231,27 +1231,33 @@
     desc.fSizeInBytes = size;
     desc.fIsWrapped = false;
 
-    GL_CALL(GenBuffers(1, &desc.fID));
-    if (desc.fID) {
-        GL_CALL(BindBuffer(GR_GL_ARRAY_BUFFER, desc.fID));
-        CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
-        // make sure driver can allocate memory for this buffer
-        GL_ALLOC_CALL(this->glInterface(),
-                      BufferData(GR_GL_ARRAY_BUFFER,
-                                 desc.fSizeInBytes,
-                                 NULL,   // data ptr
-                                 desc.fDynamic ? GR_GL_DYNAMIC_DRAW : GR_GL_STATIC_DRAW));
-        if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) {
-            GL_CALL(DeleteBuffers(1, &desc.fID));
-            // deleting bound buffer does implicit bind to 0
-            fHWGeometryState.setVertexBufferID(0);
-            return NULL;
-        }
+    if (false && desc.fDynamic) {
+        desc.fID = 0;
         GrGLVertexBuffer* vertexBuffer = SkNEW_ARGS(GrGLVertexBuffer, (this, desc));
-        fHWGeometryState.setVertexBufferID(desc.fID);
         return vertexBuffer;
+    } else {
+        GL_CALL(GenBuffers(1, &desc.fID));
+        if (desc.fID) {
+            GL_CALL(BindBuffer(GR_GL_ARRAY_BUFFER, desc.fID));
+            fHWGeometryState.setVertexBufferID(desc.fID);
+            CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
+            // make sure driver can allocate memory for this buffer
+            GL_ALLOC_CALL(this->glInterface(),
+                          BufferData(GR_GL_ARRAY_BUFFER,
+                                     desc.fSizeInBytes,
+                                     NULL,   // data ptr
+                                     desc.fDynamic ? GR_GL_DYNAMIC_DRAW : GR_GL_STATIC_DRAW));
+            if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) {
+                GL_CALL(DeleteBuffers(1, &desc.fID));
+                // deleting bound buffer does implicit bind to 0
+                fHWGeometryState.setVertexBufferID(0);
+                return NULL;
+            }
+            GrGLVertexBuffer* vertexBuffer = SkNEW_ARGS(GrGLVertexBuffer, (this, desc));
+            return vertexBuffer;
+        }
+        return NULL;
     }
-    return NULL;
 }
 
 GrIndexBuffer* GrGpuGL::onCreateIndexBuffer(uint32_t size, bool dynamic) {
@@ -1260,27 +1266,33 @@
     desc.fSizeInBytes = size;
     desc.fIsWrapped = false;
 
-    GL_CALL(GenBuffers(1, &desc.fID));
-    if (desc.fID) {
-        GL_CALL(BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, desc.fID));
-        CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
-        // make sure driver can allocate memory for this buffer
-        GL_ALLOC_CALL(this->glInterface(),
-                      BufferData(GR_GL_ELEMENT_ARRAY_BUFFER,
-                                 desc.fSizeInBytes,
-                                 NULL,  // data ptr
-                                 desc.fDynamic ? GR_GL_DYNAMIC_DRAW : GR_GL_STATIC_DRAW));
-        if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) {
-            GL_CALL(DeleteBuffers(1, &desc.fID));
-            // deleting bound buffer does implicit bind to 0
-            fHWGeometryState.setIndexBufferID(0);
-            return NULL;
-        }
+    if (false && desc.fDynamic) {
+        desc.fID = 0;
         GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc));
-        fHWGeometryState.setIndexBufferID(desc.fID);
         return indexBuffer;
+    } else {
+        GL_CALL(GenBuffers(1, &desc.fID));
+        if (desc.fID) {
+            GL_CALL(BindBuffer(GR_GL_ELEMENT_ARRAY_BUFFER, desc.fID));
+            fHWGeometryState.setIndexBufferID(desc.fID);
+            CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
+            // make sure driver can allocate memory for this buffer
+            GL_ALLOC_CALL(this->glInterface(),
+                          BufferData(GR_GL_ELEMENT_ARRAY_BUFFER,
+                                     desc.fSizeInBytes,
+                                     NULL,  // data ptr
+                                     desc.fDynamic ? GR_GL_DYNAMIC_DRAW : GR_GL_STATIC_DRAW));
+            if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) {
+                GL_CALL(DeleteBuffers(1, &desc.fID));
+                // deleting bound buffer does implicit bind to 0
+                fHWGeometryState.setIndexBufferID(0);
+                return NULL;
+            }
+            GrIndexBuffer* indexBuffer = SkNEW_ARGS(GrGLIndexBuffer, (this, desc));
+            return indexBuffer;
+        }
+        return NULL;
     }
-    return NULL;
 }
 
 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath) {
@@ -2354,6 +2366,7 @@
 
         GrAssert(NULL != ibuf);
         GrAssert(!ibuf->isLocked());
+        *indexOffsetInBytes += ibuf->baseOffset();
         if (!fHWGeometryState.isIndexBufferIDBound(ibuf->bufferID())) {
             ibuf->bind();
             fHWGeometryState.setIndexBufferID(ibuf->bufferID());