From 23a748eca9b0660865d4e10f3a081d38f1973ef6 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 8 Nov 2014 13:46:26 +0000 Subject: [PATCH] Add renderbuffer support --- renderdoc/driver/gl/gl_common.h | 7 + renderdoc/driver/gl/gl_driver.cpp | 27 ++ renderdoc/driver/gl/gl_driver.h | 15 +- renderdoc/driver/gl/gl_hookset.h | 11 + renderdoc/driver/gl/gl_hookset_defs.h | 22 + renderdoc/driver/gl/gl_resources.h | 22 +- .../gl/wrappers/gl_framebuffer_funcs.cpp | 392 ++++++++++++++++++ 7 files changed, 485 insertions(+), 11 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 680877111..012a7bd7f 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -215,7 +215,10 @@ enum GLChunkType GEN_FRAMEBUFFERS, FRAMEBUFFER_TEX, + FRAMEBUFFER_TEX1D, FRAMEBUFFER_TEX2D, + FRAMEBUFFER_TEX3D, + FRAMEBUFFER_RENDBUF, FRAMEBUFFER_TEXLAYER, READ_BUFFER, BIND_FRAMEBUFFER, @@ -223,6 +226,10 @@ enum GLChunkType DRAW_BUFFERS, BLIT_FRAMEBUFFER, + GEN_RENDERBUFFERS, + RENDERBUFFER_STORAGE, + RENDERBUFFER_STORAGEMS, + GEN_SAMPLERS, SAMPLER_PARAMETERI, SAMPLER_PARAMETERF, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index da70c80d0..b816eb200 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -168,7 +168,10 @@ const char *GLChunkNames[] = "glGenFramebuffers", "glFramebufferTexture", + "glFramebufferTexture1D", "glFramebufferTexture2D", + "glFramebufferTexture3D", + "glFramebufferRenderbuffer", "glFramebufferTextureLayer", "glReadBuffer", "glBindFramebuffer", @@ -176,6 +179,10 @@ const char *GLChunkNames[] = "glDrawBuffers", "glBlitFramebuffer", + "glGenRenderbuffers", + "glRenderbufferStorage", + "glRenderbufferStorageMultisample", + "glGenSamplers", "glSamplerParameteri", "glSamplerParameterf", @@ -294,6 +301,7 @@ WrappedOpenGL::WrappedOpenGL(const wchar_t *logfile, const GLHookSet &funcs) m_VertexArrayRecord = NULL; m_DrawFramebufferRecord = NULL; m_ReadFramebufferRecord = NULL; + m_Renderbuffer = ResourceId(); m_TextureUnit = 0; m_Program = 0; @@ -1784,9 +1792,18 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case FRAMEBUFFER_TEX: Serialise_glNamedFramebufferTextureEXT(0, eGL_NONE, 0, 0); break; + case FRAMEBUFFER_TEX1D: + Serialise_glNamedFramebufferTexture1DEXT(0, eGL_NONE, eGL_NONE, 0, 0); + break; case FRAMEBUFFER_TEX2D: Serialise_glNamedFramebufferTexture2DEXT(0, eGL_NONE, eGL_NONE, 0, 0); break; + case FRAMEBUFFER_TEX3D: + Serialise_glNamedFramebufferTexture3DEXT(0, eGL_NONE, eGL_NONE, 0, 0, 0); + break; + case FRAMEBUFFER_RENDBUF: + Serialise_glNamedFramebufferRenderbufferEXT(0, eGL_NONE, eGL_NONE, 0); + break; case FRAMEBUFFER_TEXLAYER: Serialise_glNamedFramebufferTextureLayerEXT(0, eGL_NONE, 0, 0, 0); break; @@ -1806,6 +1823,16 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) Serialise_glBlitFramebuffer(0, 0, 0, 0, 0, 0, 0, 0, 0, eGL_NONE); break; + case GEN_RENDERBUFFERS: + Serialise_glGenRenderbuffers(0, NULL); + break; + case RENDERBUFFER_STORAGE: + Serialise_glRenderbufferStorage(eGL_NONE, eGL_NONE, 0, 0); + break; + case RENDERBUFFER_STORAGEMS: + Serialise_glRenderbufferStorageMultisample(eGL_NONE, 0, eGL_NONE, 0, 0); + break; + case GEN_SAMPLERS: Serialise_glGenSamplers(0, NULL); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 51f967e99..c1fef021d 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -115,6 +115,7 @@ class WrappedOpenGL GLResourceRecord *m_VertexArrayRecord; GLResourceRecord *m_DrawFramebufferRecord; GLResourceRecord *m_ReadFramebufferRecord; + ResourceId m_Renderbuffer; GLint m_TextureUnit; GLuint m_Program; @@ -179,12 +180,13 @@ class WrappedOpenGL struct TextureData { - TextureData() : width(0), height(0), depth(0), creationFlags(0), internalFormat(eGL_NONE) {} + TextureData() : width(0), height(0), depth(0), creationFlags(0), internalFormat(eGL_NONE), renderbuffer(false) {} GLResource resource; GLenum curType; GLint width, height, depth; uint32_t creationFlags; GLenum internalFormat; + bool renderbuffer; }; map m_Textures; @@ -410,9 +412,17 @@ class WrappedOpenGL 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, glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)); IMPLEMENT_FUNCTION_SERIALISED(void, glFramebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)); + 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, 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)); + IMPLEMENT_FUNCTION_SERIALISED(void, glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers)); + IMPLEMENT_FUNCTION_SERIALISED(void, glBindRenderbuffer(GLenum target, GLuint renderbuffer)); GLenum glCheckFramebufferStatus(GLenum target); @@ -947,7 +957,10 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glNamedBufferSubDataEXT(GLuint buffer, GLintptr offset, GLsizeiptr size, const void *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedCopyBufferSubDataEXT(GLuint readBuffer, GLuint writeBuffer, GLintptr readOffset, GLintptr writeOffset, GLsizeiptr size)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTextureEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level)); + IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)); IMPLEMENT_FUNCTION_SERIALISED(void, glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level)); + 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, 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 4e403efbf..c0d79d7be 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -283,9 +283,17 @@ struct GLHookSet PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers; PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer; PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture; + PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D; PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D; + PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D; + PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer; PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer; PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers; + PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers; + PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage; + PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample; + PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers; + PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer; PFNGLFENCESYNCPROC glFenceSync; PFNGLCLIENTWAITSYNCPROC glClientWaitSync; PFNGLWAITSYNCPROC glWaitSync; @@ -556,7 +564,10 @@ struct GLHookSet PFNGLNAMEDBUFFERSUBDATAEXTPROC glNamedBufferSubDataEXT; PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC glNamedCopyBufferSubDataEXT; PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC glNamedFramebufferTextureEXT; + PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC glNamedFramebufferTexture1DEXT; PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC glNamedFramebufferTexture2DEXT; + PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC glNamedFramebufferTexture3DEXT; + PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC glNamedFramebufferRenderbufferEXT; PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC glNamedFramebufferTextureLayerEXT; PFNGLTEXTUREBUFFERRANGEEXTPROC glTextureBufferRangeEXT; PFNGLTEXTUREIMAGE1DEXTPROC glTextureImage1DEXT; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 114292200..60e79efc0 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -302,9 +302,17 @@ HookExtension(PFNGLGENFRAMEBUFFERSPROC, glGenFramebuffers); \ HookExtension(PFNGLBINDFRAMEBUFFERPROC, glBindFramebuffer); \ HookExtension(PFNGLFRAMEBUFFERTEXTUREPROC, glFramebufferTexture); \ + HookExtension(PFNGLFRAMEBUFFERTEXTURE1DPROC, glFramebufferTexture1D); \ HookExtension(PFNGLFRAMEBUFFERTEXTURE2DPROC, glFramebufferTexture2D); \ + HookExtension(PFNGLFRAMEBUFFERTEXTURE3DPROC, glFramebufferTexture3D); \ + HookExtension(PFNGLFRAMEBUFFERRENDERBUFFERPROC, glFramebufferRenderbuffer); \ HookExtension(PFNGLFRAMEBUFFERTEXTURELAYERPROC, glFramebufferTextureLayer); \ HookExtension(PFNGLDELETEFRAMEBUFFERSPROC, glDeleteFramebuffers); \ + HookExtension(PFNGLGENRENDERBUFFERSPROC, glGenRenderbuffers); \ + HookExtension(PFNGLRENDERBUFFERSTORAGEPROC, glRenderbufferStorage); \ + HookExtension(PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC, glRenderbufferStorageMultisample); \ + HookExtension(PFNGLDELETERENDERBUFFERSPROC, glDeleteRenderbuffers); \ + HookExtension(PFNGLBINDRENDERBUFFERPROC, glBindRenderbuffer); \ HookExtension(PFNGLFENCESYNCPROC, glFenceSync); \ HookExtension(PFNGLCLIENTWAITSYNCPROC, glClientWaitSync); \ HookExtension(PFNGLWAITSYNCPROC, glWaitSync); \ @@ -575,7 +583,10 @@ HookExtension(PFNGLNAMEDBUFFERSUBDATAEXTPROC, glNamedBufferSubDataEXT); \ HookExtension(PFNGLNAMEDCOPYBUFFERSUBDATAEXTPROC, glNamedCopyBufferSubDataEXT); \ HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTUREEXTPROC, glNamedFramebufferTextureEXT); \ + HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURE1DEXTPROC, glNamedFramebufferTexture1DEXT); \ HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURE2DEXTPROC, glNamedFramebufferTexture2DEXT); \ + HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURE3DEXTPROC, glNamedFramebufferTexture3DEXT); \ + HookExtension(PFNGLNAMEDFRAMEBUFFERRENDERBUFFEREXTPROC, glNamedFramebufferRenderbufferEXT); \ HookExtension(PFNGLNAMEDFRAMEBUFFERTEXTURELAYEREXTPROC, glNamedFramebufferTextureLayerEXT); \ HookExtension(PFNGLTEXTUREBUFFERRANGEEXTPROC, glTextureBufferRangeEXT); \ HookExtension(PFNGLTEXTUREIMAGE1DEXTPROC, glTextureImage1DEXT); \ @@ -906,9 +917,17 @@ 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); \ + HookWrapper5(void, glFramebufferTexture1D, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \ HookWrapper5(void, glFramebufferTexture2D, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \ + 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); \ 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); \ + HookWrapper5(void, glRenderbufferStorageMultisample, GLenum, target, GLsizei, samples, GLenum, internalformat, GLsizei, width, GLsizei, height); \ + HookWrapper2(void, glDeleteRenderbuffers, GLsizei, n, const GLuint *, renderbuffers); \ + HookWrapper2(void, glBindRenderbuffer, GLenum, target, GLuint, renderbuffer); \ HookWrapper2(GLsync, glFenceSync, GLenum, condition, GLbitfield, flags); \ HookWrapper3(GLenum, glClientWaitSync, GLsync, sync, GLbitfield, flags, GLuint64, timeout); \ HookWrapper3(void, glWaitSync, GLsync, sync, GLbitfield, flags, GLuint64, timeout); \ @@ -1179,7 +1198,10 @@ HookWrapper4(void, glNamedBufferSubDataEXT, GLuint, buffer, GLintptr, offset, GLsizeiptr, size, const void *, data); \ HookWrapper5(void, glNamedCopyBufferSubDataEXT, GLuint, readBuffer, GLuint, writeBuffer, GLintptr, readOffset, GLintptr, writeOffset, GLsizeiptr, size); \ HookWrapper4(void, glNamedFramebufferTextureEXT, GLuint, framebuffer, GLenum, attachment, GLuint, texture, GLint, level); \ + HookWrapper5(void, glNamedFramebufferTexture1DEXT, GLuint, framebuffer, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \ HookWrapper5(void, glNamedFramebufferTexture2DEXT, GLuint, framebuffer, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level); \ + 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); \ 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/gl_resources.h b/renderdoc/driver/gl/gl_resources.h index beadb9ccc..986a7dc2a 100644 --- a/renderdoc/driver/gl/gl_resources.h +++ b/renderdoc/driver/gl/gl_resources.h @@ -44,6 +44,7 @@ enum GLNamespace eResTexture, eResSampler, eResFramebuffer, + eResRenderbuffer, eResBuffer, eResVertexArray, eResShader, @@ -93,16 +94,17 @@ struct GLResource // For correctness we'd need to check if the context is shared and if so move up to a 'parent' // so the context value ends up being identical for objects being shared, but can be different // for objects in non-shared contexts -inline GLResource TextureRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResTexture, i); } -inline GLResource SamplerRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSampler, i); } -inline GLResource FramebufferRes(void *ctx, GLuint i) { return GLResource(ctx, eResFramebuffer, i); } -inline GLResource BufferRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResBuffer, i); } -inline GLResource VertexArrayRes(void *ctx, GLuint i) { return GLResource(ctx, eResVertexArray, i); } -inline GLResource ShaderRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResShader, i); } -inline GLResource ProgramRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResProgram, i); } -inline GLResource ProgramPipeRes(void *ctx, GLuint i) { return GLResource(ctx, eResProgramPipe, i); } -inline GLResource QueryRes(void *ctx, GLuint i) { return GLResource(ctx, eResQuery, i); } -inline GLResource SyncRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSync, i); } +inline GLResource TextureRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResTexture, i); } +inline GLResource SamplerRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSampler, i); } +inline GLResource FramebufferRes(void *ctx, GLuint i) { return GLResource(ctx, eResFramebuffer, i); } +inline GLResource RenderbufferRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResRenderbuffer, i); } +inline GLResource BufferRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResBuffer, i); } +inline GLResource VertexArrayRes(void *ctx, GLuint i) { return GLResource(ctx, eResVertexArray, i); } +inline GLResource ShaderRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResShader, i); } +inline GLResource ProgramRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResProgram, i); } +inline GLResource ProgramPipeRes(void *ctx, GLuint i) { return GLResource(ctx, eResProgramPipe, i); } +inline GLResource QueryRes(void *ctx, GLuint i) { return GLResource(ctx, eResQuery, i); } +inline GLResource SyncRes(void *ctx, GLuint i) { (void)ctx; return GLResource(NULL, eResSync, i); } struct GLResourceRecord : public ResourceRecord { diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 03142617c..76256f197 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -151,6 +151,82 @@ void WrappedOpenGL::glFramebufferTexture(GLenum target, GLenum attachment, GLuin } } +bool WrappedOpenGL::Serialise_glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) +{ + SERIALISE_ELEMENT(GLenum, Attach, attachment); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + SERIALISE_ELEMENT(GLenum, TexTarget, textarget); + SERIALISE_ELEMENT(int32_t, Level, level); + SERIALISE_ELEMENT(ResourceId, fbid, (framebuffer == 0 ? ResourceId() : GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer)))); + + if(m_State < WRITING) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + if(fbid == ResourceId()) + { + glNamedFramebufferTexture1DEXT(0, Attach, TexTarget, res.name, Level); + } + else + { + GLResource fbres = GetResourceManager()->GetLiveResource(fbid); + glNamedFramebufferTexture1DEXT(fbres.name, Attach, TexTarget, res.name, Level); + } + + if(m_State == READING) + { + m_Textures[GetResourceManager()->GetLiveID(id)].creationFlags |= eTextureCreate_RTV; + } + } + + return true; +} + +void WrappedOpenGL::glNamedFramebufferTexture1DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) +{ + m_Real.glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer)); + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX1D); + Serialise_glNamedFramebufferTexture1DEXT(framebuffer, attachment, textarget, texture, level); + + if(m_State == WRITING_IDLE) + record->AddChunk(scope.Get()); + else + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glFramebufferTexture1D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) +{ + m_Real.glFramebufferTexture1D(target, attachment, textarget, texture, level); + + if(m_State >= WRITING) + { + GLResourceRecord *record = m_DeviceRecord; + + if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER) + { + if(m_DrawFramebufferRecord) record = m_DrawFramebufferRecord; + } + else + { + if(m_ReadFramebufferRecord) record = m_ReadFramebufferRecord; + } + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX1D); + Serialise_glNamedFramebufferTexture1DEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name, + attachment, textarget, texture, level); + + if(m_State == WRITING_IDLE) + record->AddChunk(scope.Get()); + else + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glNamedFramebufferTexture2DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { SERIALISE_ELEMENT(GLenum, Attach, attachment); @@ -227,6 +303,158 @@ void WrappedOpenGL::glFramebufferTexture2D(GLenum target, GLenum attachment, GLe } } +bool WrappedOpenGL::Serialise_glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) +{ + SERIALISE_ELEMENT(GLenum, Attach, attachment); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(TextureRes(GetCtx(), texture))); + SERIALISE_ELEMENT(GLenum, TexTarget, textarget); + SERIALISE_ELEMENT(int32_t, Level, level); + SERIALISE_ELEMENT(int32_t, Zoffset, zoffset); + SERIALISE_ELEMENT(ResourceId, fbid, (framebuffer == 0 ? ResourceId() : GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer)))); + + if(m_State < WRITING) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + if(fbid == ResourceId()) + { + glNamedFramebufferTexture3DEXT(0, Attach, TexTarget, res.name, Level, Zoffset); + } + else + { + GLResource fbres = GetResourceManager()->GetLiveResource(fbid); + glNamedFramebufferTexture3DEXT(fbres.name, Attach, TexTarget, res.name, Level, Zoffset); + } + + if(m_State == READING) + { + m_Textures[GetResourceManager()->GetLiveID(id)].creationFlags |= eTextureCreate_RTV; + } + } + + return true; +} + +void WrappedOpenGL::glNamedFramebufferTexture3DEXT(GLuint framebuffer, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) +{ + m_Real.glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer)); + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX3D); + Serialise_glNamedFramebufferTexture3DEXT(framebuffer, attachment, textarget, texture, level, zoffset); + + if(m_State == WRITING_IDLE) + record->AddChunk(scope.Get()); + else + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glFramebufferTexture3D(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset) +{ + m_Real.glFramebufferTexture3D(target, attachment, textarget, texture, level, zoffset); + + if(m_State >= WRITING) + { + GLResourceRecord *record = m_DeviceRecord; + + if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER) + { + if(m_DrawFramebufferRecord) record = m_DrawFramebufferRecord; + } + else + { + if(m_ReadFramebufferRecord) record = m_ReadFramebufferRecord; + } + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_TEX3D); + Serialise_glNamedFramebufferTexture3DEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name, + attachment, textarget, texture, level, zoffset); + + if(m_State == WRITING_IDLE) + record->AddChunk(scope.Get()); + else + m_ContextRecord->AddChunk(scope.Get()); + } +} +bool WrappedOpenGL::Serialise_glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) +{ + SERIALISE_ELEMENT(ResourceId, fbid, (framebuffer == 0 ? ResourceId() : GetResourceManager()->GetID(FramebufferRes(GetCtx(), framebuffer)))); + SERIALISE_ELEMENT(GLenum, Attach, attachment); + SERIALISE_ELEMENT(GLenum, RendBufTarget, renderbuffertarget); + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer))); + + if(m_State < WRITING) + { + GLResource res = GetResourceManager()->GetLiveResource(id); + if(fbid == ResourceId()) + { + glNamedFramebufferRenderbufferEXT(0, Attach, RendBufTarget, res.name); + } + else + { + GLResource fbres = GetResourceManager()->GetLiveResource(fbid); + glNamedFramebufferRenderbufferEXT(fbres.name, Attach, RendBufTarget, res.name); + } + + if(m_State == READING) + { + m_Textures[GetResourceManager()->GetLiveID(id)].creationFlags |= eTextureCreate_RTV; + m_Textures[GetResourceManager()->GetLiveID(id)].renderbuffer = true; + } + } + + return true; +} + +void WrappedOpenGL::glNamedFramebufferRenderbufferEXT(GLuint framebuffer, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) +{ + m_Real.glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(FramebufferRes(GetCtx(), framebuffer)); + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_RENDBUF); + Serialise_glNamedFramebufferRenderbufferEXT(framebuffer, attachment, renderbuffertarget, renderbuffer); + + if(m_State == WRITING_IDLE) + record->AddChunk(scope.Get()); + else + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glFramebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) +{ + m_Real.glFramebufferRenderbuffer(target, attachment, renderbuffertarget, renderbuffer); + + if(m_State >= WRITING) + { + GLResourceRecord *record = m_DeviceRecord; + + if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER) + { + if(m_DrawFramebufferRecord) record = m_DrawFramebufferRecord; + } + else + { + if(m_ReadFramebufferRecord) record = m_ReadFramebufferRecord; + } + + SCOPED_SERIALISE_CONTEXT(FRAMEBUFFER_RENDBUF); + Serialise_glNamedFramebufferRenderbufferEXT(GetResourceManager()->GetCurrentResource(record->GetResourceID()).name, + attachment, renderbuffertarget, renderbuffer); + + if(m_State == WRITING_IDLE) + record->AddChunk(scope.Get()); + else + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glNamedFramebufferTextureLayerEXT(GLuint framebuffer, GLenum attachment, GLuint texture, GLint level, GLint layer) { SERIALISE_ELEMENT(GLenum, Attach, attachment); @@ -531,3 +759,167 @@ void WrappedOpenGL::glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers) for(GLsizei i=0; i < n; i++) GetResourceManager()->UnregisterResource(FramebufferRes(GetCtx(), framebuffers[i])); } + +bool WrappedOpenGL::Serialise_glGenRenderbuffers(GLsizei n, GLuint* renderbuffers) +{ + SERIALISE_ELEMENT(ResourceId, id, GetResourceManager()->GetID(RenderbufferRes(GetCtx(), *renderbuffers))); + + if(m_State == READING) + { + GLuint real = 0; + m_Real.glGenRenderbuffers(1, &real); + m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, real); + + GLResource res = RenderbufferRes(GetCtx(), real); + + ResourceId live = m_ResourceManager->RegisterResource(res); + GetResourceManager()->AddLiveResource(id, res); + } + + return true; +} + +void WrappedOpenGL::glGenRenderbuffers(GLsizei n, GLuint *renderbuffers) +{ + m_Real.glGenRenderbuffers(n, renderbuffers); + + for(GLsizei i=0; i < n; i++) + { + GLResource res = RenderbufferRes(GetCtx(), renderbuffers[i]); + ResourceId id = GetResourceManager()->RegisterResource(res); + + if(m_State >= WRITING) + { + Chunk *chunk = NULL; + + { + SCOPED_SERIALISE_CONTEXT(GEN_RENDERBUFFERS); + Serialise_glGenRenderbuffers(1, renderbuffers+i); + + chunk = scope.Get(); + } + + GLResourceRecord *record = GetResourceManager()->AddResourceRecord(id); + RDCASSERT(record); + + record->AddChunk(chunk); + } + else + { + GetResourceManager()->AddLiveResource(id, res); + } + } +} + +void WrappedOpenGL::glBindRenderbuffer(GLenum target, GLuint renderbuffer) +{ + // don't need to serialise this, as the GL_RENDERBUFFER target does nothing + // aside from create names (after glGen), and provide as a selector for glRenderbufferStorage* + // which we do ourselves. We just need to know the current renderbuffer ID + m_Renderbuffer = GetResourceManager()->GetID(RenderbufferRes(GetCtx(), renderbuffer)); + + m_Real.glBindRenderbuffer(target, renderbuffer); +} + +void WrappedOpenGL::glDeleteRenderbuffers(GLsizei n, const GLuint *renderbuffers) +{ + m_Real.glDeleteRenderbuffers(n, renderbuffers); + + for(GLsizei i=0; i < n; i++) + GetResourceManager()->UnregisterResource(RenderbufferRes(GetCtx(), renderbuffers[i])); +} + +bool WrappedOpenGL::Serialise_glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +{ + SERIALISE_ELEMENT(ResourceId, id, m_Renderbuffer); + SERIALISE_ELEMENT(GLenum, Format, internalformat); + SERIALISE_ELEMENT(uint32_t, Width, width); + SERIALISE_ELEMENT(uint32_t, Height, height); + + if(m_State == READING) + { + ResourceId liveId = GetResourceManager()->GetLiveID(id); + m_Textures[liveId].width = Width; + m_Textures[liveId].height = Height; + m_Textures[liveId].depth = 1; + m_Textures[liveId].curType = eGL_RENDERBUFFER; + m_Textures[liveId].internalFormat = Format; + + m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, GetResourceManager()->GetLiveResource(id).name); + m_Real.glRenderbufferStorage(eGL_RENDERBUFFER, Format, Width, Height); + } + + return true; +} + +void WrappedOpenGL::glRenderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height) +{ + m_Real.glRenderbufferStorage(target, internalformat, width, height); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(m_Renderbuffer); + RDCASSERT(record); + + SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGE); + Serialise_glRenderbufferStorage(eGL_RENDERBUFFER, internalformat, width, height); + + record->AddChunk(scope.Get()); + } + else + { + m_Textures[m_Renderbuffer].width = width; + m_Textures[m_Renderbuffer].height = height; + m_Textures[m_Renderbuffer].depth = 1; + m_Textures[m_Renderbuffer].curType = eGL_RENDERBUFFER; + m_Textures[m_Renderbuffer].internalFormat = internalformat; + } +} + +bool WrappedOpenGL::Serialise_glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) +{ + SERIALISE_ELEMENT(GLenum, Format, internalformat); + SERIALISE_ELEMENT(uint32_t, Samples, samples); + SERIALISE_ELEMENT(uint32_t, Width, width); + SERIALISE_ELEMENT(uint32_t, Height, height); + SERIALISE_ELEMENT(ResourceId, id, m_Renderbuffer); + + if(m_State == READING) + { + ResourceId liveId = GetResourceManager()->GetLiveID(id); + m_Textures[liveId].width = Width; + m_Textures[liveId].height = Height; + m_Textures[liveId].depth = 1; + m_Textures[liveId].curType = eGL_RENDERBUFFER; + m_Textures[liveId].internalFormat = Format; + + m_Real.glBindRenderbuffer(eGL_RENDERBUFFER, GetResourceManager()->GetLiveResource(id).name); + m_Real.glRenderbufferStorageMultisample(eGL_RENDERBUFFER, Samples, Format, Width, Height); + } + + return true; +} + +void WrappedOpenGL::glRenderbufferStorageMultisample(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height) +{ + m_Real.glRenderbufferStorageMultisample(target, samples, internalformat, width, height); + + if(m_State >= WRITING) + { + GLResourceRecord *record = GetResourceManager()->GetResourceRecord(m_Renderbuffer); + RDCASSERT(record); + + SCOPED_SERIALISE_CONTEXT(RENDERBUFFER_STORAGEMS); + Serialise_glRenderbufferStorageMultisample(eGL_RENDERBUFFER, samples, internalformat, width, height); + + record->AddChunk(scope.Get()); + } + else + { + m_Textures[m_Renderbuffer].width = width; + m_Textures[m_Renderbuffer].height = height; + m_Textures[m_Renderbuffer].depth = 1; + m_Textures[m_Renderbuffer].curType = eGL_RENDERBUFFER; + m_Textures[m_Renderbuffer].internalFormat = internalformat; + } +}