diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 7d5a91699..ca59edf2e 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -160,6 +160,7 @@ enum GLChunkType FRAMEBUFFER_TEX, READ_BUFFER, BIND_FRAMEBUFFER, + DRAW_BUFFERS, BLIT_FRAMEBUFFER, GEN_SAMPLERS, diff --git a/renderdoc/driver/gl/gl_device_driver.cpp b/renderdoc/driver/gl/gl_device_driver.cpp index 342a0f994..866a1d50a 100644 --- a/renderdoc/driver/gl/gl_device_driver.cpp +++ b/renderdoc/driver/gl/gl_device_driver.cpp @@ -825,6 +825,34 @@ void WrappedOpenGL::glBindFramebuffer(GLenum target, GLuint framebuffer) m_Real.glBindFramebuffer(target, framebuffer); } +bool WrappedOpenGL::Serialise_glDrawBuffers(GLsizei n, const GLenum *bufs) +{ + SERIALISE_ELEMENT(uint32_t, num, n); + SERIALISE_ELEMENT_ARR(GLenum, buffers, bufs, num); + + if(m_State < WRITING) + { + m_Real.glDrawBuffers(num, buffers); + } + + delete[] buffers; + + return true; +} + +void WrappedOpenGL::glDrawBuffers(GLsizei n, const GLenum *bufs) +{ + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DRAW_BUFFERS); + Serialise_glDrawBuffers(n, bufs); + + m_ContextRecord->AddChunk(scope.Get()); + } + + m_Real.glDrawBuffers(n, bufs); +} + bool WrappedOpenGL::Serialise_glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) { SERIALISE_ELEMENT(int32_t, sX0, srcX0); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 2ea946027..35084bafa 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -117,6 +117,7 @@ const char *GLChunkNames[] = "glFramebufferTexture", "glReadBuffer", "glBindFramebuffer", + "glDrawBuffers", "glBlitFramebuffer", "glGenSamplers", @@ -999,6 +1000,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case FRAMEBUFFER_TEX: Serialise_glFramebufferTexture(eGL_UNKNOWN_ENUM, eGL_UNKNOWN_ENUM, 0, 0); break; + case DRAW_BUFFERS: + Serialise_glDrawBuffers(0, NULL); + break; case BLIT_FRAMEBUFFER: Serialise_glBlitFramebuffer(0, 0, 0, 0, 0, 0, 0, 0, 0, eGL_UNKNOWN_ENUM); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 40ef27d95..ab207c6b5 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -330,6 +330,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)); IMPLEMENT_FUNCTION_SERIALISED(void, glReadBuffer(GLenum mode)); IMPLEMENT_FUNCTION_SERIALISED(void, glGenFramebuffers(GLsizei n, GLuint *framebuffers)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDrawBuffers(GLsizei n, const GLenum *bufs)); IMPLEMENT_FUNCTION_SERIALISED(void, glBindFramebuffer(GLenum target, GLuint framebuffer)); IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTexture(GLenum target, GLenum attachment, GLuint texture, GLint level)); IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index c151b6a0a..08cb24560 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -136,6 +136,7 @@ struct GLHookSet PFNGLDISABLEIPROC glDisablei; PFNGLGENBUFFERSPROC glGenBuffers; PFNGLBINDBUFFERPROC glBindBuffer; + PFNGLDRAWBUFFERSPROC glDrawBuffers; PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index d0208a3f6..47882a700 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -148,6 +148,7 @@ HookExtension(PFNGLDISABLEIPROC, glDisablei); \ HookExtension(PFNGLGENBUFFERSPROC, glGenBuffers); \ HookExtension(PFNGLBINDBUFFERPROC, glBindBuffer); \ + HookExtension(PFNGLDRAWBUFFERSPROC, glDrawBuffers); \ HookExtension(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers); \ HookExtension(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer); \ HookExtension(PFNGLFRAMEBUFFERTEXTUREPROC, glFramebufferTexture); \ @@ -385,6 +386,7 @@ HookWrapper2(void, glDisablei, GLenum, target, GLuint, index); \ HookWrapper2(void, glGenBuffers, GLsizei, n, GLuint *, buffers); \ HookWrapper2(void, glBindBuffer, GLenum, target, GLuint, buffer); \ + HookWrapper2(void, glDrawBuffers, GLsizei, n, const GLenum *, bufs); \ HookWrapper2(void, glGenFramebuffers, GLsizei, n, GLuint *, framebuffers); \ HookWrapper2(void, glBindFramebuffer, GLenum, target, GLuint, framebuffer); \ HookWrapper4(void, glFramebufferTexture, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level); \