| Index: src/gpu/gl/GrGLBufferImpl.cpp
|
| diff --git a/src/gpu/gl/GrGLBufferImpl.cpp b/src/gpu/gl/GrGLBufferImpl.cpp
|
| index 3dea4f5ac76c512c362e88fbc9dba1dcca6e6f78..3c75b9fe6a1fefa1af8a696736dfbb58808dceba 100644
|
| --- a/src/gpu/gl/GrGLBufferImpl.cpp
|
| +++ b/src/gpu/gl/GrGLBufferImpl.cpp
|
| @@ -26,22 +26,20 @@
|
| , fLockPtr(NULL) {
|
| if (0 == desc.fID) {
|
| fCPUData = sk_malloc_flags(desc.fSizeInBytes, SK_MALLOC_THROW);
|
| - fGLSizeInBytes = 0;
|
| } else {
|
| fCPUData = NULL;
|
| - // We assume that the GL buffer was created at the desc's size initially.
|
| - fGLSizeInBytes = fDesc.fSizeInBytes;
|
| }
|
| VALIDATE();
|
| }
|
|
|
| void GrGLBufferImpl::release(GrGpuGL* gpu) {
|
| - VALIDATE();
|
| // make sure we've not been abandoned or already released
|
| if (NULL != fCPUData) {
|
| + VALIDATE();
|
| sk_free(fCPUData);
|
| fCPUData = NULL;
|
| } else if (fDesc.fID && !fDesc.fIsWrapped) {
|
| + VALIDATE();
|
| GL_CALL(gpu, DeleteBuffers(1, &fDesc.fID));
|
| if (GR_GL_ARRAY_BUFFER == fBufferType) {
|
| gpu->notifyVertexBufferDelete(fDesc.fID);
|
| @@ -50,19 +48,15 @@
|
| gpu->notifyIndexBufferDelete(fDesc.fID);
|
| }
|
| fDesc.fID = 0;
|
| - fGLSizeInBytes = 0;
|
| }
|
| fLockPtr = NULL;
|
| - VALIDATE();
|
| }
|
|
|
| void GrGLBufferImpl::abandon() {
|
| fDesc.fID = 0;
|
| - fGLSizeInBytes = 0;
|
| fLockPtr = NULL;
|
| sk_free(fCPUData);
|
| fCPUData = NULL;
|
| - VALIDATE();
|
| }
|
|
|
| void GrGLBufferImpl::bind(GrGpuGL* gpu) const {
|
| @@ -73,7 +67,6 @@
|
| SkASSERT(GR_GL_ELEMENT_ARRAY_BUFFER == fBufferType);
|
| gpu->bindIndexBufferAndDefaultVertexArray(fDesc.fID);
|
| }
|
| - VALIDATE();
|
| }
|
|
|
| void* GrGLBufferImpl::lock(GrGpuGL* gpu) {
|
| @@ -81,55 +74,17 @@
|
| SkASSERT(!this->isLocked());
|
| if (0 == fDesc.fID) {
|
| fLockPtr = fCPUData;
|
| - } else {
|
| - switch (gpu->glCaps().mapBufferType()) {
|
| - case GrGLCaps::kNone_MapBufferType:
|
| - VALIDATE();
|
| - return NULL;
|
| - case GrGLCaps::kMapBuffer_MapBufferType:
|
| - this->bind(gpu);
|
| - // Let driver know it can discard the old data
|
| - if (GR_GL_USE_BUFFER_DATA_NULL_HINT || fDesc.fSizeInBytes != fGLSizeInBytes) {
|
| - fGLSizeInBytes = fDesc.fSizeInBytes;
|
| - GL_CALL(gpu,
|
| - BufferData(fBufferType, fGLSizeInBytes, NULL,
|
| - fDesc.fDynamic ? DYNAMIC_USAGE_PARAM : GR_GL_STATIC_DRAW));
|
| - }
|
| - GR_GL_CALL_RET(gpu->glInterface(), fLockPtr,
|
| - MapBuffer(fBufferType, GR_GL_WRITE_ONLY));
|
| - break;
|
| - case GrGLCaps::kMapBufferRange_MapBufferType: {
|
| - this->bind(gpu);
|
| - // Make sure the GL buffer size agrees with fDesc before mapping.
|
| - if (fDesc.fSizeInBytes != fGLSizeInBytes) {
|
| - fGLSizeInBytes = fDesc.fSizeInBytes;
|
| - GL_CALL(gpu,
|
| - BufferData(fBufferType, fGLSizeInBytes, NULL,
|
| - fDesc.fDynamic ? DYNAMIC_USAGE_PARAM : GR_GL_STATIC_DRAW));
|
| - }
|
| - static const GrGLbitfield kAccess = GR_GL_MAP_INVALIDATE_BUFFER_BIT |
|
| - GR_GL_MAP_WRITE_BIT;
|
| - GR_GL_CALL_RET(gpu->glInterface(),
|
| - fLockPtr,
|
| - MapBufferRange(fBufferType, 0, fGLSizeInBytes, kAccess));
|
| - break;
|
| - }
|
| - case GrGLCaps::kChromium_MapBufferType:
|
| - this->bind(gpu);
|
| - // Make sure the GL buffer size agrees with fDesc before mapping.
|
| - if (fDesc.fSizeInBytes != fGLSizeInBytes) {
|
| - fGLSizeInBytes = fDesc.fSizeInBytes;
|
| - GL_CALL(gpu,
|
| - BufferData(fBufferType, fGLSizeInBytes, NULL,
|
| - fDesc.fDynamic ? DYNAMIC_USAGE_PARAM : GR_GL_STATIC_DRAW));
|
| - }
|
| - GR_GL_CALL_RET(gpu->glInterface(),
|
| - fLockPtr,
|
| - MapBufferSubData(fBufferType, 0, fGLSizeInBytes, GR_GL_WRITE_ONLY));
|
| - break;
|
| - }
|
| + } else if (gpu->caps()->bufferLockSupport()) {
|
| + this->bind(gpu);
|
| + // Let driver know it can discard the old data
|
| + GL_CALL(gpu, BufferData(fBufferType,
|
| + (GrGLsizeiptr) fDesc.fSizeInBytes,
|
| + NULL,
|
| + fDesc.fDynamic ? DYNAMIC_USAGE_PARAM : GR_GL_STATIC_DRAW));
|
| + GR_GL_CALL_RET(gpu->glInterface(),
|
| + fLockPtr,
|
| + MapBuffer(fBufferType, GR_GL_WRITE_ONLY));
|
| }
|
| - VALIDATE();
|
| return fLockPtr;
|
| }
|
|
|
| @@ -137,20 +92,9 @@
|
| VALIDATE();
|
| SkASSERT(this->isLocked());
|
| if (0 != fDesc.fID) {
|
| - switch (gpu->glCaps().mapBufferType()) {
|
| - case GrGLCaps::kNone_MapBufferType:
|
| - SkDEBUGFAIL("Shouldn't get here.");
|
| - return;
|
| - case GrGLCaps::kMapBuffer_MapBufferType: // fall through
|
| - case GrGLCaps::kMapBufferRange_MapBufferType:
|
| - this->bind(gpu);
|
| - GL_CALL(gpu, UnmapBuffer(fBufferType));
|
| - break;
|
| - case GrGLCaps::kChromium_MapBufferType:
|
| - this->bind(gpu);
|
| - GR_GL_CALL(gpu->glInterface(), UnmapBufferSubData(fLockPtr));
|
| - break;
|
| - }
|
| + SkASSERT(gpu->caps()->bufferLockSupport());
|
| + this->bind(gpu);
|
| + GL_CALL(gpu, UnmapBuffer(fBufferType));
|
| }
|
| fLockPtr = NULL;
|
| }
|
| @@ -183,8 +127,7 @@
|
| // draws that reference the old contents. With this hint it can
|
| // assign a different allocation for the new contents to avoid
|
| // flushing the gpu past draws consuming the old contents.
|
| - fGLSizeInBytes = fDesc.fSizeInBytes;
|
| - GL_CALL(gpu, BufferData(fBufferType, fGLSizeInBytes, NULL, usage));
|
| + GL_CALL(gpu, BufferData(fBufferType, (GrGLsizeiptr) fDesc.fSizeInBytes, NULL, usage));
|
| GL_CALL(gpu, BufferSubData(fBufferType, 0, (GrGLsizeiptr) srcSizeInBytes, src));
|
| }
|
| #else
|
| @@ -204,12 +147,10 @@
|
| // Chromium's command buffer may turn a glBufferSubData where the size
|
| // exactly matches the buffer size into a glBufferData. So we tack 1
|
| // extra byte onto the glBufferData.
|
| - fGLSizeInBytes = srcSizeInBytes + 1;
|
| - GL_CALL(gpu, BufferData(fBufferType, fGLSizeInBytes, NULL, usage));
|
| + GL_CALL(gpu, BufferData(fBufferType, srcSizeInBytes + 1, NULL, usage));
|
| GL_CALL(gpu, BufferSubData(fBufferType, 0, srcSizeInBytes, src));
|
| } else {
|
| - fGLSizeInBytes = srcSizeInBytes;
|
| - GL_CALL(gpu, BufferData(fBufferType, fGLSizeInBytes, src, usage));
|
| + GL_CALL(gpu, BufferData(fBufferType, srcSizeInBytes, src, usage));
|
| }
|
| #endif
|
| return true;
|
| @@ -220,7 +161,5 @@
|
| // The following assert isn't valid when the buffer has been abandoned:
|
| // SkASSERT((0 == fDesc.fID) == (NULL != fCPUData));
|
| SkASSERT(0 != fDesc.fID || !fDesc.fIsWrapped);
|
| - SkASSERT(NULL == fCPUData || 0 == fGLSizeInBytes);
|
| - SkASSERT(NULL == fLockPtr || fGLSizeInBytes == fDesc.fSizeInBytes);
|
| SkASSERT(NULL == fCPUData || NULL == fLockPtr || fCPUData == fLockPtr);
|
| }
|
|
|