Chromium Code Reviews| Index: src/gpu/gl/debug/GrGLCreateDebugInterface.cpp |
| diff --git a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp |
| index 087bd4723e44e5716bda8da5bd3ee80cd09d01be..8ae0e7269538ec3ea903ae11bb4b0c99c280905f 100644 |
| --- a/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp |
| +++ b/src/gpu/gl/debug/GrGLCreateDebugInterface.cpp |
| @@ -622,12 +622,14 @@ GrGLvoid GR_GL_FUNCTION_TYPE debugGLDeleteBuffers(GrGLsizei n, const GrGLuint* i |
| } |
| // map a buffer to the caller's address space |
| -GrGLvoid* GR_GL_FUNCTION_TYPE debugGLMapBuffer(GrGLenum target, GrGLenum access) { |
| - |
| +GrGLvoid* GR_GL_FUNCTION_TYPE debugGLMapBufferRange(GrGLenum target, GrGLintptr offset, |
| + GrGLsizeiptr length, GrGLbitfield access) { |
| GrAlwaysAssert(GR_GL_ARRAY_BUFFER == target || |
| GR_GL_ELEMENT_ARRAY_BUFFER == target); |
| - // GR_GL_READ_ONLY == access || || GR_GL_READ_WRIT == access); |
| - GrAlwaysAssert(GR_GL_WRITE_ONLY == access); |
| + |
| + // We only expect read access and we expect that the buffer or range is always invalidated. |
| + GrAlwaysAssert(!SkToBool(GR_GL_MAP_READ_BIT & access)); |
| + GrAlwaysAssert((GR_GL_MAP_INVALIDATE_BUFFER_BIT | GR_GL_MAP_INVALIDATE_RANGE_BIT) & access); |
| GrBufferObj *buffer = NULL; |
| switch (target) { |
| @@ -638,20 +640,41 @@ GrGLvoid* GR_GL_FUNCTION_TYPE debugGLMapBuffer(GrGLenum target, GrGLenum access) |
| buffer = GrDebugGL::getInstance()->getElementArrayBuffer(); |
| break; |
| default: |
| - SkFAIL("Unexpected target to glMapBuffer"); |
| + SkFAIL("Unexpected target to glMapBufferRange"); |
| break; |
| } |
|
robertphillips
2014/05/02 12:57:30
NULL != ?
bsalomon
2014/05/02 14:44:22
Done.
|
| if (buffer) { |
| + GrAlwaysAssert(offset >= 0 && offset + length <= buffer->getSize()); |
| GrAlwaysAssert(!buffer->getMapped()); |
| - buffer->setMapped(); |
| - return buffer->getDataPtr(); |
| + buffer->setMapped(offset, length); |
| + return buffer->getDataPtr() + offset; |
| } |
| GrAlwaysAssert(false); |
| return NULL; // no buffer bound to the target |
| } |
| +GrGLvoid* GR_GL_FUNCTION_TYPE debugGLMapBuffer(GrGLenum target, GrGLenum access) { |
| + GrAlwaysAssert(GR_GL_WRITE_ONLY == access); |
| + |
| + GrBufferObj *buffer; |
| + switch (target) { |
| + case GR_GL_ARRAY_BUFFER: |
| + buffer = GrDebugGL::getInstance()->getArrayBuffer(); |
| + break; |
| + case GR_GL_ELEMENT_ARRAY_BUFFER: |
| + buffer = GrDebugGL::getInstance()->getElementArrayBuffer(); |
| + break; |
| + default: |
| + SkFAIL("Unexpected target to glMapBuffer"); |
| + break; |
| + } |
| + |
| + return debugGLMapBufferRange(target, 0, buffer->getSize(), |
| + GR_GL_MAP_WRITE_BIT | GR_GL_MAP_INVALIDATE_BUFFER_BIT); |
| +} |
| + |
| // remove a buffer from the caller's address space |
| // TODO: check if the "access" method from "glMapBuffer" was honored |
| GrGLboolean GR_GL_FUNCTION_TYPE debugGLUnmapBuffer(GrGLenum target) { |
| @@ -682,6 +705,34 @@ GrGLboolean GR_GL_FUNCTION_TYPE debugGLUnmapBuffer(GrGLenum target) { |
| return GR_GL_FALSE; // GR_GL_INVALID_OPERATION; |
| } |
| +GrGLvoid GR_GL_FUNCTION_TYPE debugGLFlushMappedBufferRange(GrGLenum target, |
| + GrGLintptr offset, |
| + GrGLsizeiptr length) { |
| + GrAlwaysAssert(GR_GL_ARRAY_BUFFER == target || |
| + GR_GL_ELEMENT_ARRAY_BUFFER == target); |
| + |
| + GrBufferObj *buffer = NULL; |
| + switch (target) { |
| + case GR_GL_ARRAY_BUFFER: |
| + buffer = GrDebugGL::getInstance()->getArrayBuffer(); |
| + break; |
| + case GR_GL_ELEMENT_ARRAY_BUFFER: |
| + buffer = GrDebugGL::getInstance()->getElementArrayBuffer(); |
| + break; |
| + default: |
| + SkFAIL("Unexpected target to glUnmapBuffer"); |
| + break; |
| + } |
| + |
|
robertphillips
2014/05/02 12:57:30
NULL != ?
|
| + if (buffer) { |
| + GrAlwaysAssert(buffer->getMapped()); |
| + GrAlwaysAssert(offset >= 0 && (offset + length) <= buffer->getMappedLength()); |
| + } else { |
| + GrAlwaysAssert(false); |
| + } |
| +} |
| + |
| + |
| GrGLvoid GR_GL_FUNCTION_TYPE debugGLGetBufferParameteriv(GrGLenum target, |
| GrGLenum value, |
| GrGLint* params) { |
| @@ -826,6 +877,7 @@ const GrGLInterface* GrGLCreateDebugInterface() { |
| functions->fEndQuery = noOpGLEndQuery; |
| functions->fFinish = noOpGLFinish; |
| functions->fFlush = noOpGLFlush; |
| + functions->fFlushMappedBufferRange = debugGLFlushMappedBufferRange; |
| functions->fFrontFace = noOpGLFrontFace; |
| functions->fGenerateMipmap = debugGLGenerateMipmap; |
| functions->fGenBuffers = debugGLGenBuffers; |
| @@ -850,6 +902,8 @@ const GrGLInterface* GrGLCreateDebugInterface() { |
| functions->fGenVertexArrays = debugGLGenVertexArrays; |
| functions->fLineWidth = noOpGLLineWidth; |
| functions->fLinkProgram = noOpGLLinkProgram; |
| + functions->fMapBuffer = debugGLMapBuffer; |
| + functions->fMapBufferRange = debugGLMapBufferRange; |
| functions->fPixelStorei = debugGLPixelStorei; |
| functions->fQueryCounter = noOpGLQueryCounter; |
| functions->fReadBuffer = noOpGLReadBuffer; |
| @@ -887,6 +941,7 @@ const GrGLInterface* GrGLCreateDebugInterface() { |
| functions->fUniformMatrix2fv = noOpGLUniformMatrix2fv; |
| functions->fUniformMatrix3fv = noOpGLUniformMatrix3fv; |
| functions->fUniformMatrix4fv = noOpGLUniformMatrix4fv; |
| + functions->fUnmapBuffer = debugGLUnmapBuffer; |
| functions->fUseProgram = debugGLUseProgram; |
| functions->fVertexAttrib4fv = noOpGLVertexAttrib4fv; |
| functions->fVertexAttribPointer = noOpGLVertexAttribPointer; |
| @@ -909,10 +964,9 @@ const GrGLInterface* GrGLCreateDebugInterface() { |
| functions->fBlitFramebuffer = noOpGLBlitFramebuffer; |
| functions->fResolveMultisampleFramebuffer = |
| noOpGLResolveMultisampleFramebuffer; |
| - functions->fMapBuffer = debugGLMapBuffer; |
| functions->fMatrixLoadf = noOpGLMatrixLoadf; |
| functions->fMatrixLoadIdentity = noOpGLMatrixLoadIdentity; |
| - functions->fUnmapBuffer = debugGLUnmapBuffer; |
| + |
| functions->fBindFragDataLocationIndexed = |
| noOpGLBindFragDataLocationIndexed; |