| Index: src/gpu/gl/GrGLGpu.cpp
|
| diff --git a/src/gpu/gl/GrGLGpu.cpp b/src/gpu/gl/GrGLGpu.cpp
|
| index 5b6ae7cc180fe2023fdb921147cc9a03972ff53a..ecaf09091ba0e25b3226f3bf27ce653ca3746622 100644
|
| --- a/src/gpu/gl/GrGLGpu.cpp
|
| +++ b/src/gpu/gl/GrGLGpu.cpp
|
| @@ -1479,19 +1479,30 @@ GrIndexBuffer* GrGLGpu::onCreateIndexBuffer(size_t size, bool dynamic) {
|
| }
|
| }
|
|
|
| -GrTransferBuffer* GrGLGpu::onCreateTransferBuffer(size_t size, TransferType type) {
|
| +GrTransferBuffer* GrGLGpu::onCreateTransferBuffer(size_t size, TransferType xferType) {
|
| + GrGLCaps::TransferBufferType xferBufferType = this->ctxInfo().caps()->transferBufferType();
|
| + if (GrGLCaps::kNone_TransferBufferType == xferBufferType) {
|
| + return nullptr;
|
| + }
|
| +
|
| GrGLTransferBuffer::Desc desc;
|
| - bool toGpu = (kCpuToGpu_TransferType == type);
|
| + bool toGpu = (kCpuToGpu_TransferType == xferType);
|
| desc.fUsage = toGpu ? GrGLBufferImpl::kStreamDraw_Usage : GrGLBufferImpl::kStreamRead_Usage;
|
|
|
| desc.fSizeInBytes = size;
|
|
|
| - // TODO: check caps to see if we can create a PBO, and which kind
|
| GL_CALL(GenBuffers(1, &desc.fID));
|
| if (desc.fID) {
|
| CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
|
| - // make sure driver can allocate memory for this buffer
|
| - GrGLenum type = toGpu ? GR_GL_PIXEL_UNPACK_BUFFER : GR_GL_PIXEL_PACK_BUFFER;
|
| + // make sure driver can allocate memory for this bmapuffer
|
| + GrGLenum type;
|
| + if (GrGLCaps::kChromium_TransferBufferType == xferBufferType) {
|
| + type = toGpu ? GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM
|
| + : GR_GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM;
|
| + } else {
|
| + SkASSERT(GrGLCaps::kPBO_TransferBufferType == xferBufferType);
|
| + type = toGpu ? GR_GL_PIXEL_UNPACK_BUFFER : GR_GL_PIXEL_PACK_BUFFER;
|
| + }
|
| GL_ALLOC_CALL(this->glInterface(),
|
| BufferData(type,
|
| (GrGLsizeiptr) desc.fSizeInBytes,
|
| @@ -1650,6 +1661,8 @@ void GrGLGpu::bindBuffer(GrGLuint id, GrGLenum type) {
|
| this->bindVertexBuffer(id);
|
| } else if (GR_GL_ELEMENT_ARRAY_BUFFER == type) {
|
| this->bindIndexBufferAndDefaultVertexArray(id);
|
| + } else {
|
| + GR_GL_CALL(this->glInterface(), BindBuffer(type, id));
|
| }
|
| }
|
|
|
| @@ -1679,6 +1692,8 @@ void* GrGLGpu::mapBuffer(GrGLuint id, GrGLenum type, GrGLBufferImpl::Usage usage
|
| size_t currentSize, size_t requestedSize) {
|
| void* mapPtr = nullptr;
|
| GrGLenum glUsage = get_gl_usage(usage);
|
| + bool readOnly = (GrGLBufferImpl::kStreamRead_Usage == usage);
|
| +
|
| // Handling dirty context is done in the bindBuffer call
|
| switch (this->glCaps().mapBufferType()) {
|
| case GrGLCaps::kNone_MapBufferType:
|
| @@ -1689,7 +1704,7 @@ void* GrGLGpu::mapBuffer(GrGLuint id, GrGLenum type, GrGLBufferImpl::Usage usage
|
| if (GR_GL_USE_BUFFER_DATA_NULL_HINT || currentSize != requestedSize) {
|
| GL_CALL(BufferData(type, requestedSize, nullptr, glUsage));
|
| }
|
| - GL_CALL_RET(mapPtr, MapBuffer(type, GR_GL_WRITE_ONLY));
|
| + GL_CALL_RET(mapPtr, MapBuffer(type, readOnly ? GR_GL_READ_ONLY : GR_GL_WRITE_ONLY));
|
| break;
|
| case GrGLCaps::kMapBufferRange_MapBufferType: {
|
| this->bindBuffer(id, type);
|
| @@ -1697,9 +1712,11 @@ void* GrGLGpu::mapBuffer(GrGLuint id, GrGLenum type, GrGLBufferImpl::Usage usage
|
| if (currentSize != requestedSize) {
|
| GL_CALL(BufferData(type, requestedSize, nullptr, glUsage));
|
| }
|
| - static const GrGLbitfield kAccess = GR_GL_MAP_INVALIDATE_BUFFER_BIT |
|
| - GR_GL_MAP_WRITE_BIT;
|
| - GL_CALL_RET(mapPtr, MapBufferRange(type, 0, requestedSize, kAccess));
|
| + static const GrGLbitfield kWriteAccess = GR_GL_MAP_INVALIDATE_BUFFER_BIT |
|
| + GR_GL_MAP_WRITE_BIT;
|
| + GL_CALL_RET(mapPtr, MapBufferRange(type, 0, requestedSize, readOnly ?
|
| + GR_GL_MAP_READ_BIT :
|
| + kWriteAccess));
|
| break;
|
| }
|
| case GrGLCaps::kChromium_MapBufferType:
|
| @@ -1708,7 +1725,9 @@ void* GrGLGpu::mapBuffer(GrGLuint id, GrGLenum type, GrGLBufferImpl::Usage usage
|
| if (currentSize != requestedSize) {
|
| GL_CALL(BufferData(type, requestedSize, nullptr, glUsage));
|
| }
|
| - GL_CALL_RET(mapPtr, MapBufferSubData(type, 0, requestedSize, GR_GL_WRITE_ONLY));
|
| + GL_CALL_RET(mapPtr, MapBufferSubData(type, 0, requestedSize, readOnly ?
|
| + GR_GL_READ_ONLY :
|
| + GR_GL_WRITE_ONLY));
|
| break;
|
| }
|
| return mapPtr;
|
|
|