diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index e5f9d6d97..f9b2a8d35 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -736,6 +736,7 @@ void WrappedOpenGL::BuildGLESExtensions() m_GLESExtensions.push_back("GL_EXT_copy_image"); m_GLESExtensions.push_back("GL_EXT_debug_label"); m_GLESExtensions.push_back("GL_EXT_debug_marker"); + m_GLESExtensions.push_back("GL_EXT_discard_framebuffer"); m_GLESExtensions.push_back("GL_EXT_disjoint_timer_query"); m_GLESExtensions.push_back("GL_EXT_draw_buffers"); m_GLESExtensions.push_back("GL_EXT_draw_buffers_indexed"); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index a87a6ebfe..f7b96ae28 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -1056,6 +1056,9 @@ public: GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, + const GLenum *attachments)); + enum AttribType { Attrib_GLdouble = 0x01, diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 0b5ec9fe3..aae0ee6e7 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -609,6 +609,9 @@ struct GLHookSet // GLES: EXT_multisampled_render_to_texture PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC glFramebufferTexture2DMultisampleEXT; + // GLES: EXT_discard_framebuffer + PFNGLDISCARDFRAMEBUFFEREXTPROC glDiscardFramebufferEXT; + // ARB_shading_language_include PFNGLNAMEDSTRINGARBPROC glNamedStringARB; PFNGLDELETENAMEDSTRINGARBPROC glDeleteNamedStringARB; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 5b724ddcc..2a3c17d28 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -1159,6 +1159,7 @@ HookExtension(PFNGLPRIMITIVEBOUNDINGBOXOESPROC, glPrimitiveBoundingBox); \ HookExtensionAlias(PFNGLPRIMITIVEBOUNDINGBOXOESPROC, glPrimitiveBoundingBox, glPrimitiveBoundingBoxEXT); \ HookExtensionAlias(PFNGLPRIMITIVEBOUNDINGBOXOESPROC, glPrimitiveBoundingBox, glPrimitiveBoundingBoxOES); \ + HookExtension(PFNGLDISCARDFRAMEBUFFEREXTPROC, glDiscardFramebufferEXT); \ HookExtension(PFNGLFRAMEBUFFERTEXTURE2DMULTISAMPLEEXTPROC, glFramebufferTexture2DMultisampleEXT); \ HookExtension(PFNWGLDXSETRESOURCESHAREHANDLENVPROC, wglDXSetResourceShareHandleNV); \ HookExtension(PFNWGLDXOPENDEVICENVPROC, wglDXOpenDeviceNV); \ @@ -2013,6 +2014,7 @@ HookWrapper0(void, glFrameTerminatorGREMEDY); \ HookWrapper2(void, glStringMarkerGREMEDY, GLsizei, len, const void *, string); \ HookWrapper8(void, glPrimitiveBoundingBox, GLfloat, minX, GLfloat, minY, GLfloat, minZ, GLfloat, minW, GLfloat, maxX, GLfloat, maxY, GLfloat, maxZ, GLfloat, maxW); \ + HookWrapper3(void, glDiscardFramebufferEXT, GLenum, target, GLsizei, numAttachments, const GLenum *, attachments); \ HookWrapper6(void, glFramebufferTexture2DMultisampleEXT, GLenum, target, GLenum, attachment, GLenum, textarget, GLuint, texture, GLint, level, GLsizei, samples); \ HookWrapper2(BOOL, wglDXSetResourceShareHandleNV, void *, dxObject, HANDLE, shareHandle); \ HookWrapper1(HANDLE, wglDXOpenDeviceNV, void *, dxDevice); \ @@ -3612,7 +3614,6 @@ HookWrapper4(void, glbufferstorageext, GLenum, target, GLsizeiptr, size, const void *, data, GLbitfield, flags); \ HookWrapper5(void, glclearteximageext, GLuint, texture, GLint, level, GLenum, format, GLenum, type, const void *, data); \ HookWrapper11(void, glcleartexsubimageext, GLuint, texture, GLint, level, GLint, xoffset, GLint, yoffset, GLint, zoffset, GLsizei, width, GLsizei, height, GLsizei, depth, GLenum, format, GLenum, type, const void *, data); \ - HookWrapper3(void, gldiscardframebufferext, GLenum, target, GLsizei, numAttachments, const GLenum *, attachments); \ HookWrapper2(void, gldrawtransformfeedbackext, GLenum, mode, GLuint, id); \ HookWrapper3(void, gldrawtransformfeedbackinstancedext, GLenum, mode, GLuint, id, GLsizei, instancecount); \ HookWrapper2(void, glvertexattribdivisorext, GLuint, index, GLuint, divisor); \ @@ -5578,7 +5579,6 @@ HandleUnsupported(PFNGLBUFFERSTORAGEEXTPROC, glbufferstorageext); \ HandleUnsupported(PFNGLCLEARTEXIMAGEEXTPROC, glclearteximageext); \ HandleUnsupported(PFNGLCLEARTEXSUBIMAGEEXTPROC, glcleartexsubimageext); \ - HandleUnsupported(PFNGLDISCARDFRAMEBUFFEREXTPROC, gldiscardframebufferext); \ HandleUnsupported(PFNGLDRAWTRANSFORMFEEDBACKEXTPROC, gldrawtransformfeedbackext); \ HandleUnsupported(PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDEXTPROC, gldrawtransformfeedbackinstancedext); \ HandleUnsupported(PFNGLVERTEXATTRIBDIVISOREXTPROC, glvertexattribdivisorext); \ diff --git a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp index 9570df6c4..e173acd9a 100644 --- a/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_framebuffer_funcs.cpp @@ -1473,6 +1473,35 @@ void WrappedOpenGL::glInvalidateFramebuffer(GLenum target, GLsizei numAttachment } } +// note: glDiscardFramebufferEXT looks the same as glInvalidateFramebuffer. Could this be a plain +// alias? +void WrappedOpenGL::glDiscardFramebufferEXT(GLenum target, GLsizei numAttachments, + const GLenum *attachments) +{ + m_Real.glDiscardFramebufferEXT(target, numAttachments, attachments); + + if(m_State == WRITING_IDLE) + { + GLResourceRecord *record = NULL; + + if(target == eGL_DRAW_FRAMEBUFFER || target == eGL_FRAMEBUFFER) + { + if(GetCtxData().m_DrawFramebufferRecord) + record = GetCtxData().m_DrawFramebufferRecord; + } + else + { + if(GetCtxData().m_ReadFramebufferRecord) + record = GetCtxData().m_ReadFramebufferRecord; + } + + if(record) + { + record->MarkParentsDirty(GetResourceManager()); + } + } +} + void WrappedOpenGL::glInvalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, const GLenum *attachments) {