aboutsummaryrefslogtreecommitdiffhomepage
path: root/gpu/src/GrGLVertexBuffer.cpp
diff options
context:
space:
mode:
authorGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-02-14 16:51:21 +0000
committerGravatar bsalomon@google.com <bsalomon@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-02-14 16:51:21 +0000
commit1c13c9668a889e56a0c85b51b9f28139c25b76ff (patch)
tree0319884473e77141a574ab07333c6ed4797f7485 /gpu/src/GrGLVertexBuffer.cpp
parentdd53d91b60e368f1bbff6fb22d796765205ae25d (diff)
Refactor how Gr handles vertex and index data. GrGpu and GrInOrderDrawBuffer both GrBufferAllocPool to manage reserved and set-to-array vertex and index data.
rietveld issue 4188049 git-svn-id: http://skia.googlecode.com/svn/trunk@786 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'gpu/src/GrGLVertexBuffer.cpp')
-rw-r--r--gpu/src/GrGLVertexBuffer.cpp68
1 files changed, 44 insertions, 24 deletions
diff --git a/gpu/src/GrGLVertexBuffer.cpp b/gpu/src/GrGLVertexBuffer.cpp
index b4ddc244e0..ec489367ed 100644
--- a/gpu/src/GrGLVertexBuffer.cpp
+++ b/gpu/src/GrGLVertexBuffer.cpp
@@ -18,8 +18,8 @@
#include "GrGLVertexBuffer.h"
#include "GrGpuGL.h"
-GrGLVertexBuffer::GrGLVertexBuffer(GLuint id, GrGpuGL* gl, uint32_t sizeInBytes,
- bool dynamic) :
+GrGLVertexBuffer::GrGLVertexBuffer(GLuint id, GrGpuGL* gl, size_t sizeInBytes,
+ bool dynamic) :
INHERITED(sizeInBytes, dynamic),
fGL(gl),
fBufferID(id),
@@ -34,11 +34,16 @@ GrGLVertexBuffer::~GrGLVertexBuffer() {
}
}
+void GrGLVertexBuffer::bind() const {
+ GR_GL(BindBuffer(GL_ARRAY_BUFFER, fBufferID));
+ fGL->notifyVertexBufferBind(this);
+}
+
GLuint GrGLVertexBuffer::bufferID() const {
return fBufferID;
}
-void GrGLVertexBuffer::abandon() {
+void GrGLVertexBuffer::abandon() {
fBufferID = 0;
fGL = NULL;
fLockPtr = NULL;
@@ -48,30 +53,29 @@ void* GrGLVertexBuffer::lock() {
GrAssert(fBufferID);
GrAssert(!isLocked());
if (fGL->supportsBufferLocking()) {
- GR_GL(BindBuffer(GL_ARRAY_BUFFER, fBufferID));
- fGL->notifyVertexBufferBind(this);
- // call bufferData with null ptr to allow driver to perform renaming
- // If this call is removed revisit updateData to be sure it doesn't
- // leave buffer undersized (as it currently does).
- GR_GL(BufferData(GL_ARRAY_BUFFER, size(), NULL,
+ bind();
+ // Let driver know it can discard the old data
+ GR_GL(BufferData(GL_ARRAY_BUFFER, size(), NULL,
dynamic() ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW));
fLockPtr = GR_GLEXT(fGL->extensions(),
- MapBuffer(GL_ARRAY_BUFFER, GR_WRITE_ONLY));
+ MapBuffer(GL_ARRAY_BUFFER, GR_WRITE_ONLY));
return fLockPtr;
}
return NULL;
}
+void* GrGLVertexBuffer::lockPtr() const {
+ return fLockPtr;
+}
+
void GrGLVertexBuffer::unlock() {
GrAssert(fBufferID);
GrAssert(isLocked());
- if (fGL->supportsBufferLocking()) {
- GR_GL(BindBuffer(GL_ARRAY_BUFFER, fBufferID));
- fGL->notifyVertexBufferBind(this);
- GR_GLEXT(fGL->extensions(),
- UnmapBuffer(GL_ARRAY_BUFFER));
- fLockPtr = NULL;
- }
+ GrAssert(fGL->supportsBufferLocking());
+
+ bind();
+ GR_GLEXT(fGL->extensions(), UnmapBuffer(GL_ARRAY_BUFFER));
+ fLockPtr = NULL;
}
bool GrGLVertexBuffer::isLocked() const {
@@ -79,8 +83,7 @@ bool GrGLVertexBuffer::isLocked() const {
#if GR_DEBUG
if (fGL->supportsBufferLocking()) {
GLint mapped;
- GR_GL(BindBuffer(GL_ARRAY_BUFFER, fBufferID));
- fGL->notifyVertexBufferBind(this);
+ bind();
GR_GL(GetBufferParameteriv(GL_ARRAY_BUFFER, GR_BUFFER_MAPPED, &mapped));
GrAssert(!!mapped == !!fLockPtr);
}
@@ -88,16 +91,33 @@ bool GrGLVertexBuffer::isLocked() const {
return NULL != fLockPtr;
}
-bool GrGLVertexBuffer::updateData(const void* src, uint32_t srcSizeInBytes) {
+bool GrGLVertexBuffer::updateData(const void* src, size_t srcSizeInBytes) {
GrAssert(fBufferID);
GrAssert(!isLocked());
if (srcSizeInBytes > size()) {
return false;
}
- GR_GL(BindBuffer(GL_ARRAY_BUFFER, fBufferID));
- fGL->notifyVertexBufferBind(this);
- GR_GL(BufferData(GL_ARRAY_BUFFER, srcSizeInBytes, src,
- dynamic() ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW));
+ bind();
+ GLenum usage = dynamic() ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW;
+ if (size() == srcSizeInBytes) {
+ GR_GL(BufferData(GL_ARRAY_BUFFER, srcSizeInBytes, src, usage));
+ } else {
+ GR_GL(BufferData(GL_ARRAY_BUFFER, size(), NULL, usage));
+ GR_GL(BufferSubData(GL_ARRAY_BUFFER, 0, srcSizeInBytes, src));
+ }
+ return true;
+}
+
+bool GrGLVertexBuffer::updateSubData(const void* src,
+ size_t srcSizeInBytes,
+ size_t offset) {
+ GrAssert(fBufferID);
+ GrAssert(!isLocked());
+ if (srcSizeInBytes + offset > size()) {
+ return false;
+ }
+ bind();
+ GR_GL(BufferSubData(GL_ARRAY_BUFFER, offset, srcSizeInBytes, src));
return true;
}