Index: src/gpu/gl/GrGLBuffer.cpp |
diff --git a/src/gpu/gl/GrGLBuffer.cpp b/src/gpu/gl/GrGLBuffer.cpp |
index 37ce273d1f0d2c58e71071289a4b9ac19c200dc3..96226b91219491838026512eadd64408f16c531f 100644 |
--- a/src/gpu/gl/GrGLBuffer.cpp |
+++ b/src/gpu/gl/GrGLBuffer.cpp |
@@ -30,12 +30,8 @@ |
GrGLBuffer* GrGLBuffer::Create(GrGLGpu* gpu, size_t size, GrBufferType intendedType, |
GrAccessPattern accessPattern, const void* data) { |
- bool cpuBacked = gpu->glCaps().useNonVBOVertexAndIndexDynamicData() && |
- GrBufferTypeIsVertexOrIndex(intendedType) && |
- kDynamic_GrAccessPattern == accessPattern; |
- SkAutoTUnref<GrGLBuffer> buffer(new GrGLBuffer(gpu, size, intendedType, accessPattern, |
- cpuBacked, data)); |
- if (!cpuBacked && 0 == buffer->bufferID()) { |
+ SkAutoTUnref<GrGLBuffer> buffer(new GrGLBuffer(gpu, size, intendedType, accessPattern, data)); |
+ if (0 == buffer->bufferID()) { |
return nullptr; |
} |
return buffer.release(); |
@@ -89,42 +85,27 @@ inline static GrGLenum gr_to_gl_access_pattern(GrBufferType bufferType, |
} |
GrGLBuffer::GrGLBuffer(GrGLGpu* gpu, size_t size, GrBufferType intendedType, |
- GrAccessPattern accessPattern, bool cpuBacked, const void* data) |
- : INHERITED(gpu, size, intendedType, accessPattern, cpuBacked), |
- fCPUData(nullptr), |
+ GrAccessPattern accessPattern, const void* data) |
+ : INHERITED(gpu, size, intendedType, accessPattern), |
fIntendedType(intendedType), |
fBufferID(0), |
- fSizeInBytes(size), |
fUsage(gr_to_gl_access_pattern(intendedType, accessPattern)), |
fGLSizeInBytes(0), |
fHasAttachedToTexture(false) { |
- if (this->isCPUBacked()) { |
- // Core profile uses vertex array objects, which disallow client side arrays. |
- SkASSERT(!gpu->glCaps().isCoreProfile()); |
- if (gpu->caps()->mustClearUploadedBufferData()) { |
- fCPUData = sk_calloc_throw(fSizeInBytes); |
+ GL_CALL(GenBuffers(1, &fBufferID)); |
+ if (fBufferID) { |
+ GrGLenum target = gpu->bindBuffer(fIntendedType, this); |
+ CLEAR_ERROR_BEFORE_ALLOC(gpu->glInterface()); |
+ // make sure driver can allocate memory for this buffer |
+ GL_ALLOC_CALL(gpu->glInterface(), BufferData(target, |
+ (GrGLsizeiptr) size, |
+ data, |
+ fUsage)); |
+ if (CHECK_ALLOC_ERROR(gpu->glInterface()) != GR_GL_NO_ERROR) { |
+ GL_CALL(DeleteBuffers(1, &fBufferID)); |
+ fBufferID = 0; |
} else { |
- fCPUData = sk_malloc_flags(fSizeInBytes, SK_MALLOC_THROW); |
- } |
- if (data) { |
- memcpy(fCPUData, data, fSizeInBytes); |
- } |
- } else { |
- GL_CALL(GenBuffers(1, &fBufferID)); |
- if (fBufferID) { |
- GrGLenum target = gpu->bindBuffer(fIntendedType, this); |
- CLEAR_ERROR_BEFORE_ALLOC(gpu->glInterface()); |
- // make sure driver can allocate memory for this buffer |
- GL_ALLOC_CALL(gpu->glInterface(), BufferData(target, |
- (GrGLsizeiptr) fSizeInBytes, |
- data, |
- fUsage)); |
- if (CHECK_ALLOC_ERROR(gpu->glInterface()) != GR_GL_NO_ERROR) { |
- GL_CALL(DeleteBuffers(1, &fBufferID)); |
- fBufferID = 0; |
- } else { |
- fGLSizeInBytes = fSizeInBytes; |
- } |
+ fGLSizeInBytes = size; |
} |
} |
VALIDATE(); |
@@ -144,11 +125,7 @@ void GrGLBuffer::onRelease() { |
if (!this->wasDestroyed()) { |
VALIDATE(); |
// make sure we've not been abandoned or already released |
- if (fCPUData) { |
- SkASSERT(!fBufferID); |
- sk_free(fCPUData); |
- fCPUData = nullptr; |
- } else if (fBufferID) { |
+ if (fBufferID) { |
GL_CALL(DeleteBuffers(1, &fBufferID)); |
fBufferID = 0; |
fGLSizeInBytes = 0; |
@@ -165,8 +142,6 @@ void GrGLBuffer::onAbandon() { |
fBufferID = 0; |
fGLSizeInBytes = 0; |
fMapPtr = nullptr; |
- sk_free(fCPUData); |
- fCPUData = nullptr; |
VALIDATE(); |
INHERITED::onAbandon(); |
} |
@@ -179,12 +154,6 @@ void GrGLBuffer::onMap() { |
VALIDATE(); |
SkASSERT(!this->isMapped()); |
- if (0 == fBufferID) { |
- fMapPtr = fCPUData; |
- VALIDATE(); |
- return; |
- } |
- |
// TODO: Make this a function parameter. |
bool readOnly = (kXferGpuToCpu_GrBufferType == fIntendedType); |
@@ -195,8 +164,8 @@ void GrGLBuffer::onMap() { |
case GrGLCaps::kMapBuffer_MapBufferType: { |
GrGLenum target = this->glGpu()->bindBuffer(fIntendedType, this); |
// Let driver know it can discard the old data |
- if (GR_GL_USE_BUFFER_DATA_NULL_HINT || fGLSizeInBytes != fSizeInBytes) { |
- GL_CALL(BufferData(target, fSizeInBytes, nullptr, fUsage)); |
+ if (GR_GL_USE_BUFFER_DATA_NULL_HINT || fGLSizeInBytes != this->sizeInBytes()) { |
+ GL_CALL(BufferData(target, this->sizeInBytes(), nullptr, fUsage)); |
} |
GL_CALL_RET(fMapPtr, MapBuffer(target, readOnly ? GR_GL_READ_ONLY : GR_GL_WRITE_ONLY)); |
break; |
@@ -204,30 +173,30 @@ void GrGLBuffer::onMap() { |
case GrGLCaps::kMapBufferRange_MapBufferType: { |
GrGLenum target = this->glGpu()->bindBuffer(fIntendedType, this); |
// Make sure the GL buffer size agrees with fDesc before mapping. |
- if (fGLSizeInBytes != fSizeInBytes) { |
- GL_CALL(BufferData(target, fSizeInBytes, nullptr, fUsage)); |
+ if (fGLSizeInBytes != this->sizeInBytes()) { |
+ GL_CALL(BufferData(target, this->sizeInBytes(), nullptr, fUsage)); |
} |
GrGLbitfield writeAccess = GR_GL_MAP_WRITE_BIT; |
if (kXferCpuToGpu_GrBufferType != fIntendedType) { |
// TODO: Make this a function parameter. |
writeAccess |= GR_GL_MAP_INVALIDATE_BUFFER_BIT; |
} |
- GL_CALL_RET(fMapPtr, MapBufferRange(target, 0, fSizeInBytes, |
+ GL_CALL_RET(fMapPtr, MapBufferRange(target, 0, this->sizeInBytes(), |
readOnly ? GR_GL_MAP_READ_BIT : writeAccess)); |
break; |
} |
case GrGLCaps::kChromium_MapBufferType: { |
GrGLenum target = this->glGpu()->bindBuffer(fIntendedType, this); |
// Make sure the GL buffer size agrees with fDesc before mapping. |
- if (fGLSizeInBytes != fSizeInBytes) { |
- GL_CALL(BufferData(target, fSizeInBytes, nullptr, fUsage)); |
+ if (fGLSizeInBytes != this->sizeInBytes()) { |
+ GL_CALL(BufferData(target, this->sizeInBytes(), nullptr, fUsage)); |
} |
- GL_CALL_RET(fMapPtr, MapBufferSubData(target, 0, fSizeInBytes, |
+ GL_CALL_RET(fMapPtr, MapBufferSubData(target, 0, this->sizeInBytes(), |
readOnly ? GR_GL_READ_ONLY : GR_GL_WRITE_ONLY)); |
break; |
} |
} |
- fGLSizeInBytes = fSizeInBytes; |
+ fGLSizeInBytes = this->sizeInBytes(); |
VALIDATE(); |
} |
@@ -268,19 +237,15 @@ bool GrGLBuffer::onUpdateData(const void* src, size_t srcSizeInBytes) { |
SkASSERT(!this->isMapped()); |
VALIDATE(); |
- if (srcSizeInBytes > fSizeInBytes) { |
+ if (srcSizeInBytes > this->sizeInBytes()) { |
return false; |
} |
- if (0 == fBufferID) { |
- memcpy(fCPUData, src, srcSizeInBytes); |
- return true; |
- } |
- SkASSERT(srcSizeInBytes <= fSizeInBytes); |
+ SkASSERT(srcSizeInBytes <= this->sizeInBytes()); |
// bindbuffer handles dirty context |
GrGLenum target = this->glGpu()->bindBuffer(fIntendedType, this); |
#if GR_GL_USE_BUFFER_DATA_NULL_HINT |
- if (fSizeInBytes == srcSizeInBytes) { |
+ if (this->sizeInBytes() == srcSizeInBytes) { |
GL_CALL(BufferData(target, (GrGLsizeiptr) srcSizeInBytes, src, fUsage)); |
} else { |
// Before we call glBufferSubData we give the driver a hint using |
@@ -290,10 +255,10 @@ bool GrGLBuffer::onUpdateData(const void* src, size_t srcSizeInBytes) { |
// assign a different allocation for the new contents to avoid |
// flushing the gpu past draws consuming the old contents. |
// TODO I think we actually want to try calling bufferData here |
- GL_CALL(BufferData(target, fSizeInBytes, nullptr, fUsage)); |
+ GL_CALL(BufferData(target, this->sizeInBytes(), nullptr, fUsage)); |
GL_CALL(BufferSubData(target, 0, (GrGLsizeiptr) srcSizeInBytes, src)); |
} |
- fGLSizeInBytes = fSizeInBytes; |
+ fGLSizeInBytes = this->sizeInBytes(); |
#else |
// Note that we're cheating on the size here. Currently no methods |
// allow a partial update that preserves contents of non-updated |
@@ -316,11 +281,8 @@ void GrGLBuffer::setMemoryBacking(SkTraceMemoryDump* traceMemoryDump, |
#ifdef SK_DEBUG |
void GrGLBuffer::validate() const { |
- // The following assert isn't valid when the buffer has been abandoned: |
- // SkASSERT((0 == fDesc.fID) == (fCPUData)); |
SkASSERT(0 != fBufferID || 0 == fGLSizeInBytes); |
- SkASSERT(nullptr == fMapPtr || fCPUData || fGLSizeInBytes <= fSizeInBytes); |
- SkASSERT(nullptr == fCPUData || nullptr == fMapPtr || fCPUData == fMapPtr); |
+ SkASSERT(nullptr == fMapPtr || fGLSizeInBytes <= this->sizeInBytes()); |
} |
#endif |