diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 444b2f62d..13f5d1297 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -257,6 +257,7 @@ enum GLChunkType FRAMEBUFFER_TEX3D, FRAMEBUFFER_RENDBUF, FRAMEBUFFER_TEXLAYER, + FRAMEBUFFER_PARAM, READ_BUFFER, BIND_FRAMEBUFFER, DRAW_BUFFER, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 8846b468a..41ecf3af8 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -202,6 +202,7 @@ const char *GLChunkNames[] = "glFramebufferTexture3D", "glFramebufferRenderbuffer", "glFramebufferTextureLayer", + "glFramebufferParameteri", "glReadBuffer", "glBindFramebuffer", "glDrawBuffer", @@ -2027,6 +2028,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case FRAMEBUFFER_TEXLAYER: Serialise_glNamedFramebufferTextureLayerEXT(0, eGL_NONE, 0, 0, 0); break; + case FRAMEBUFFER_PARAM: + Serialise_glNamedFramebufferParameteriEXT(0, eGL_NONE, 0); + break; case READ_BUFFER: Serialise_glReadBuffer(eGL_NONE); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index ea61658e5..6353a4df8 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -438,6 +438,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)); IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)); IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTextureLayer(GLenum target, GLenum attachment, GLuint texture, GLint level, GLint layer)); + IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferParameteri(GLenum target, GLenum pname, GLint param)); IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers)); IMPLEMENT_FUNCTION_SERIALISED(void, glGenRenderbuffers(GLsizei n, GLuint *renderbuffers)); IMPLEMENT_FUNCTION_SERIALISED(void, glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)); @@ -1008,6 +1009,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer)); + IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param)); IMPLEMENT_FUNCTION_SERIALISED(void, glTextureBufferEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer)); IMPLEMENT_FUNCTION_SERIALISED(void, glTextureBufferRangeEXT(GLuint texture, GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size)); IMPLEMENT_FUNCTION_SERIALISED(void, glTextureImage1DEXT(GLuint texture, GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const void *pixels)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 66cfb122d..00d75f9f2 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -305,6 +305,7 @@ struct GLHookSet PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; + PFNGLFRAMEBUFFERPARAMETERIPROC glFramebufferParameteri; PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; @@ -611,6 +612,7 @@ struct GLHookSet PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glNamedFramebufferTexture3DEXT; PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glNamedFramebufferRenderbufferEXT; PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glNamedFramebufferTextureLayerEXT; + PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC glNamedFramebufferParameteriEXT; PFNGLTEXTUREBUFFEREXTPROC glTextureBufferEXT; PFNGLTEXTUREBUFFERRANGEEXTPROC glTextureBufferRangeEXT; PFNGLTEXTUREIMAGE1DEXTPROC glTextureImage1DEXT; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 3efae6237..bbeadc364 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -329,6 +329,7 @@ HookExtension(PFNGLFRAMEBUFFERTEXTURE3DPROC, glFramebufferTexture3D); \ HookExtension(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer); \ HookExtension(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer); \ + HookExtension(PFNGLFRAMEBUFFERPARAMETERIPROC, glFramebufferParameteri); \ HookExtension(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers); \ HookExtension(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers); \ HookExtension(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage); \ @@ -641,6 +642,7 @@ HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC, glNamedFramebufferTexture3DEXT); \ HookExtension(PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC, glNamedFramebufferRenderbufferEXT); \ HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC, glNamedFramebufferTextureLayerEXT); \ + HookExtension(PFNGLNAMEDFRAMEBUFFERPARAMETERIEXTPROC, glNamedFramebufferParameteriEXT); \ HookExtension(PFNGLTEXTUREBUFFEREXTPROC, glTextureBufferEXT); \ HookExtension(PFNGLTEXTUREBUFFERRANGEEXTPROC, glTextureBufferRangeEXT); \ HookExtension(PFNGLTEXTUREIMAGE1DEXTPROC, glTextureImage1DEXT); \ @@ -999,6 +1001,7 @@ HookWrapper6(void, glFramebufferTexture3D, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLint, zoffset); \ HookWrapper4(void, glFramebufferRenderbuffer, GLenum, target, GLenum, attachment, GLenum, renderbuffertarget, GLuint, renderbuffer); \ HookWrapper5(void, glFramebufferTextureLayer, GLenum, target, GLenum, attachment, GLuint, texture, GLint, level, GLint, layer); \ + HookWrapper3(void, glFramebufferParameteri, GLenum, target, GLenum, pname, GLint, param); \ HookWrapper2(void, glDeleteFramebuffers, GLsizei, n, const GLuint *, framebuffers); \ HookWrapper2(void, glGenRenderbuffers, GLsizei, n, GLuint *, renderbuffers); \ HookWrapper4(void, glRenderbufferStorage, GLenum, target, GLenum, internalformat, GLsizei, width, GLsizei, height); \ @@ -1305,6 +1308,7 @@ HookWrapper6(void, glNamedFramebufferTexture3DEXT, GLuint, framebuffer, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLint, zoffset); \ HookWrapper4(void, glNamedFramebufferRenderbufferEXT, GLuint, framebuffer, GLenum, attachment, GLenum, renderbuffertarget, GLuint, renderbuffer); \ HookWrapper5(void, glNamedFramebufferTextureLayerEXT, GLuint, framebuffer, GLenum, attachment, GLuint, texture, GLint, level, GLint, layer); \ + HookWrapper3(void, glNamedFramebufferParameteriEXT, GLuint, framebuffer, GLenum, pname, GLint, param); \ HookWrapper4(void, glTextureBufferEXT, GLuint, texture, GLenum, target, GLenum, internalformat, GLuint, buffer); \ HookWrapper6(void, glTextureBufferRangeEXT, GLuint, texture, GLenum, target, GLenum, internalformat, GLuint, buffer, GLintptr, offset, GLsizeiptr, size); \ HookWrapper9(void, glTextureImage1DEXT, GLuint, texture, GLenum, target, GLint, level, GLint, internalformat, GLsizei, width, GLint, border, GLenum, format, GLenum, type, const void *, pixels); \ diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 78313293e..84f426115 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -641,6 +641,65 @@ void WrappedOpenGL::glFramebufferTextureLayer(GLenum target, GLenum attachment, } } +bool WrappedOpenGL::Serialise_glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param) +{ + SERIALISE_ELEMENT(GLenum, PName, pname); + SERIALISE_ELEMENT(int32_t, Param, param); + SERIALISE_ELEMENT(ResourceId, fbid, (framebuffer == 0 ? ResourceId() : GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer)))); + + if(m_State == READING) + { + if(fbid != ResourceId()) + { + GLResource fbres = GetResourceManager()->GetLiveResource(fbid); + glNamedFramebufferParameteriEXT(fbres.name, PName, Param); + } + } + + return true; +} + +void WrappedOpenGL::glNamedFramebufferParameteriEXT(GLuint framebuffer, GLenum pname, GLint param) +{ + m_Real.glNamedFramebufferParameteriEXT(framebuffer, pname, param); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer)); + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_PARAM); + Serialise_glNamedFramebufferParameteriEXT(framebuffer, pname, param); + + record->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glFramebufferParameteri(GLenum target, GLenum pname, GLint param) +{ + m_Real.glFramebufferParameteri(target, pname, param); + + if(m_State >= WRITING) + { + GLResourceRecord *record = NULL; + + if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER) + { + if(m_DrawFramebufferRecord) record = m_DrawFramebufferRecord; + } + else + { + if(m_ReadFramebufferRecord) record = m_ReadFramebufferRecord; + } + + if(record == NULL) return; + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_PARAM); + Serialise_glNamedFramebufferParameteriEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name, pname, param); + + record->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glReadBuffer(GLenum mode) { SERIALISE_ELEMENT(GLenum, m, mode);