From 640ad6b7b2eb5ef3b4e243575db828bc93769572 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 31 May 2014 00:04:02 +0100 Subject: [PATCH] glBlitFramebuffer --- renderdoc/driver/gl/gl_common.h | 1 + renderdoc/driver/gl/gl_context_driver.cpp | 34 +++++++++++++++++++++++ renderdoc/driver/gl/gl_driver.cpp | 4 +++ renderdoc/driver/gl/gl_driver.h | 1 + renderdoc/driver/gl/gl_hookset.h | 1 + renderdoc/driver/gl/gl_hookset_defs.h | 2 ++ 6 files changed, 43 insertions(+) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 42cbf23d2..df1ad621e 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -144,6 +144,7 @@ enum GLChunkType GEN_FRAMEBUFFERS, FRAMEBUFFER_TEX, BIND_FRAMEBUFFER, + BLIT_FRAMEBUFFER, BIND_SAMPLER, diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index a5a3d7882..10fdb214d 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -503,6 +503,40 @@ void WrappedOpenGL::glBindFramebuffer(GLenum target, GLuint framebuffer) m_Real.glBindFramebuffer(target, framebuffer); } +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); + SERIALISE_ELEMENT(int32_t, sY0, srcY0); + SERIALISE_ELEMENT(int32_t, sX1, srcX1); + SERIALISE_ELEMENT(int32_t, sY1, srcY1); + SERIALISE_ELEMENT(int32_t, dX0, dstX0); + SERIALISE_ELEMENT(int32_t, dY0, dstY0); + SERIALISE_ELEMENT(int32_t, dX1, dstX1); + SERIALISE_ELEMENT(int32_t, dY1, dstY1); + SERIALISE_ELEMENT(uint32_t, msk, mask); + SERIALISE_ELEMENT(GLenum, flt, filter); + + if(m_State <= EXECUTING) + { + m_Real.glBlitFramebuffer(sX0, sY0, sX1, sY1, dX0, dY0, dX1, dY1, msk, flt); + } + + return true; +} + +void WrappedOpenGL::glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) +{ + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(BLIT_FRAMEBUFFER); + Serialise_glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + + m_ContextRecord->AddChunk(scope.Get()); + } + + m_Real.glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + #pragma endregion #pragma region Debugging annotation diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index b10b57f0c..1c014ae14 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -101,6 +101,7 @@ const char *GLChunkNames[] = "glGenFramebuffers", "glFramebufferTexture", "glBindFramebuffer", + "glBlitFramebuffer", "glBindSampler", @@ -961,6 +962,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case BIND_FRAMEBUFFER: Serialise_glBindFramebuffer(eGL_UNKNOWN_ENUM, 0); break; + case BLIT_FRAMEBUFFER: + Serialise_glBlitFramebuffer(0, 0, 0, 0, 0, 0, 0, 0, 0, eGL_UNKNOWN_ENUM); + break; case BIND_SAMPLER: Serialise_glBindSampler(0, 0); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index c9bbb7451..14607c4c5 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -321,6 +321,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glTexStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)); IMPLEMENT_FUNCTION_SERIALISED(void, glTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels)); IMPLEMENT_FUNCTION_SERIALISED(void, glGenerateMipmap(GLenum target)); + IMPLEMENT_FUNCTION_SERIALISED(void, glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetTexLevelParameteriv(GLenum target, GLint level, GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetTexLevelParameterfv(GLenum target, GLint level, GLenum pname, GLfloat *params)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 537956eca..d924f9f17 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -156,6 +156,7 @@ struct GLHookSet PFNGLUNIFORM3FVPROC glUniform3fv; PFNGLUNIFORM4FVPROC glUniform4fv; PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glDrawArraysInstancedBaseInstance; + PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer; // -- // ++ wgl diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 596ffa67a..88ec74eaa 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -168,6 +168,7 @@ HookExtension(PFNGLUNIFORM3FVPROC, glUniform3fv); \ HookExtension(PFNGLUNIFORM4FVPROC, glUniform4fv); \ HookExtension(PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC, glDrawArraysInstancedBaseInstance); \ + HookExtension(PFNGLBLITFRAMEBUFFERPROC, glBlitFramebuffer); \ HookExtension(PFNGLBINDTEXTUREPROC, glBindTexture); \ HookExtension(PFNGLBLENDFUNCPROC, glBlendFunc); \ HookExtension(PFNGLBLENDCOLORPROC, glBlendColor); \ @@ -359,6 +360,7 @@ HookWrapper3(void, glUniform3fv, GLint, location, GLsizei, count, const GLfloat *, value); \ HookWrapper3(void, glUniform4fv, GLint, location, GLsizei, count, const GLfloat *, value); \ HookWrapper5(void, glDrawArraysInstancedBaseInstance, GLenum, mode, GLint, first, GLsizei, count, GLsizei, instancecount, GLuint, baseinstance); \ + HookWrapper10(void, glBlitFramebuffer, GLint, srcX0, GLint, srcY0, GLint, srcX1, GLint, srcY1, GLint, dstX0, GLint, dstY0, GLint, dstX1, GLint, dstY1, GLbitfield, mask, GLenum, filter); \