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());