diff --git a/renderdoc/driver/gl/wrappers/gl_emulated.cpp b/renderdoc/driver/gl/wrappers/gl_emulated.cpp index edcbea80f..6fa1768fb 100644 --- a/renderdoc/driver/gl/wrappers/gl_emulated.cpp +++ b/renderdoc/driver/gl/wrappers/gl_emulated.cpp @@ -318,16 +318,30 @@ void APIENTRY _glGetNamedBufferParameterivEXT(GLuint buffer, GLenum pname, GLint internalGL->glGetBufferParameteriv(eGL_COPY_READ_BUFFER, pname, params); } +void APIENTRY _glGetBufferSubData(GLenum target, GLintptr offset, GLsizeiptr size, void *data) +{ + void *bufData = internalGL->glMapBufferRange(target, offset, size, eGL_MAP_READ_BIT); + if(!bufData) + { + RDCERR("glMapBufferRange failed to map buffer."); + return; + } + memcpy(data, bufData, (size_t)size); + internalGL->glUnmapBuffer(target); +} + void APIENTRY _glGetNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, void *data) { PushPopBuffer(eGL_COPY_READ_BUFFER, buffer); - internalGL->glGetBufferSubData(eGL_COPY_READ_BUFFER, offset, size, data); + _glGetBufferSubData(eGL_COPY_READ_BUFFER, offset, size, data); } void *APIENTRY _glMapNamedBufferEXT(GLuint buffer, GLenum access) { PushPopBuffer(eGL_COPY_READ_BUFFER, buffer); - return internalGL->glMapBuffer(eGL_COPY_READ_BUFFER, access); + GLint size; + internalGL->glGetBufferParameteriv(eGL_COPY_READ_BUFFER, eGL_BUFFER_SIZE, &size); + return internalGL->glMapBufferRange(eGL_COPY_READ_BUFFER, 0, size, eGL_MAP_READ_BIT); } void *APIENTRY _glMapNamedBufferRangeEXT(GLuint buffer, GLintptr offset, GLsizeiptr length, @@ -1235,6 +1249,12 @@ void EmulateRequiredExtensions(const GLHookSet *real, GLHookSet *hooks) EMULATE_FUNC(glGetInternalformativ); } + // APIs that are not available at all in GLES. + if(IsGLES) + { + EMULATE_FUNC(glGetBufferSubData); + } + // Emulate the EXT_dsa functions that we'll need. // Note that many functions are omitted from here, even if we support capturing them. The reason // being we only need to emulate functions that we'll use ourselves either to simplify