From da93a4e0a05db68554ffd1b5d39db375e32fb889 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 20 Dec 2014 09:36:35 +0000 Subject: [PATCH] Implement KHR advanced blend equation extensions --- renderdoc/driver/gl/gl_common.cpp | 1 + renderdoc/driver/gl/gl_common.h | 2 ++ renderdoc/driver/gl/gl_driver.cpp | 6 ++++++ renderdoc/driver/gl/gl_driver.h | 1 + renderdoc/driver/gl/gl_hookset.h | 1 + renderdoc/driver/gl/gl_hookset_defs.h | 4 ++-- renderdoc/driver/gl/gl_renderstate.cpp | 15 +++++++++++++ renderdoc/driver/gl/gl_renderstate.h | 1 + .../driver/gl/wrappers/gl_state_funcs.cpp | 21 +++++++++++++++++++ 9 files changed, 50 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.cpp b/renderdoc/driver/gl/gl_common.cpp index 6b63f5025..c4f1fac20 100644 --- a/renderdoc/driver/gl/gl_common.cpp +++ b/renderdoc/driver/gl/gl_common.cpp @@ -78,6 +78,7 @@ void DoVendorChecks(const GLHookSet &gl, GLWindowingData context) EXT_CHECK(ARB_clip_control); EXT_CHECK(ARB_enhanced_layouts); EXT_CHECK(EXT_polygon_offset_clamp); + EXT_CHECK(KHR_blend_equation_advanced_coherent); #undef EXT_CHECK } diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index e211b9aba..38ba48a85 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -98,6 +98,7 @@ enum ExtensionCheckEnum ExtensionSupported_ARB_enhanced_layouts = 0, ExtensionSupported_ARB_clip_control, ExtensionSupported_EXT_polygon_offset_clamp, + ExtensionSupported_KHR_blend_equation_advanced_coherent, ExtensionSupported_Count, }; extern bool ExtensionSupported[ExtensionSupported_Count]; @@ -265,6 +266,7 @@ enum GLChunkType BLEND_EQI, BLEND_EQ_SEP, BLEND_EQ_SEPI, + BLEND_BARRIER, LOGIC_OP, STENCIL_OP, STENCIL_OP_SEP, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index ac035e6a8..5763b7f34 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -160,6 +160,7 @@ const char *GLChunkNames[] = "glBlendEquationi", "glBlendEquationSeparate", "glBlendEquationSeparatei", + "glBlendBarrierKHR", "glLogicOp", "glStencilOp", "glStencilOpSeparate", @@ -463,6 +464,8 @@ WrappedOpenGL::WrappedOpenGL(const char *logfile, const GLHookSet &funcs) globalExts.push_back("GL_GREMEDY_string_marker"); globalExts.push_back("GL_GREMEDY_frame_terminator"); globalExts.push_back("GL_KHR_debug"); + globalExts.push_back("GL_KHR_blend_equation_advanced"); + globalExts.push_back("GL_KHR_blend_equation_advanced_coherent"); // we'll be sorting the implementation extension array, so make sure the // sorts are identical so we can do the intersection easily @@ -2206,6 +2209,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case BLEND_EQ_SEPI: Serialise_glBlendEquationSeparatei(0, eGL_NONE, eGL_NONE); break; + case BLEND_BARRIER: + Serialise_glBlendBarrierKHR(); + break; case LOGIC_OP: Serialise_glLogicOp(eGL_NONE); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 4c12d6af1..a36deeae4 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -376,6 +376,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glBlendEquationi(GLuint buf, GLenum mode)); IMPLEMENT_FUNCTION_SERIALISED(void, glBlendEquationSeparate(GLenum modeRGB, GLenum modeAlpha)); IMPLEMENT_FUNCTION_SERIALISED(void, glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum modeAlpha)); + IMPLEMENT_FUNCTION_SERIALISED(void, glBlendBarrierKHR()); IMPLEMENT_FUNCTION_SERIALISED(void, glLogicOp(GLenum opcode)); IMPLEMENT_FUNCTION_SERIALISED(void, glStencilFunc(GLenum func, GLint ref, GLuint mask)); IMPLEMENT_FUNCTION_SERIALISED(void, glStencilMask(GLuint mask)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 0e884163d..632f8c135 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -237,6 +237,7 @@ struct GLHookSet PFNGLBLENDEQUATIONIPROC glBlendEquationi; // aliases glBlendEquationiARB PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate; // aliases glBlendEquationSeparateARB PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei; // aliases glBlendEquationSeparateiARB + PFNGLBLENDBARRIERKHRPROC glBlendBarrierKHR; PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate; PFNGLSTENCILMASKSEPARATEPROC glStencilMaskSeparate; PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index b881c1dbf..fd752fc95 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -739,6 +739,7 @@ HookExtension(PFNGLREADNPIXELSPROC, glReadnPixels); \ HookExtensionAlias(PFNGLREADNPIXELSPROC, glReadnPixels, glReadnPixelsARB); \ HookExtension(PFNGLTEXTUREBARRIERPROC, glTextureBarrier); \ + HookExtension(PFNGLBLENDBARRIERKHRPROC, glBlendBarrierKHR); \ HookExtension(PFNGLDEPTHBOUNDSEXTPROC, glDepthBoundsEXT); \ HookExtension(PFNGLTEXTUREPARAMETERFEXTPROC, glTextureParameterfEXT); \ HookExtension(PFNGLTEXTUREPARAMETERFVEXTPROC, glTextureParameterfvEXT); \ @@ -1513,6 +1514,7 @@ HookWrapper4(void, glGetnUniformuiv, GLuint, program, GLint, location, GLsizei, bufSize, GLuint *, params); \ HookWrapper8(void, glReadnPixels, GLint, x, GLint, y, GLsizei, width, GLsizei, height, GLenum, format, GLenum, type, GLsizei, bufSize, void *, data); \ HookWrapper0(void, glTextureBarrier); \ + HookWrapper0(void, glBlendBarrierKHR); \ HookWrapper2(void, glDepthBoundsEXT, GLclampd, zmin, GLclampd, zmax); \ HookWrapper4(void, glTextureParameterfEXT, GLuint, texture, GLenum, target, GLenum, pname, GLfloat, param); \ HookWrapper4(void, glTextureParameterfvEXT, GLuint, texture, GLenum, target, GLenum, pname, const GLfloat *, params); \ @@ -2048,7 +2050,6 @@ HookWrapper1(void, glwindowpos3ivarb, const GLint *, v); \ HookWrapper3(void, glwindowpos3sarb, GLshort, x, GLshort, y, GLshort, z); \ HookWrapper1(void, glwindowpos3svarb, const GLshort *, v); \ - HookWrapper0(void, glblendbarrierkhr); \ HookWrapper2(void, glmultitexcoord1boes, GLenum, texture, GLbyte, s); \ HookWrapper2(void, glmultitexcoord1bvoes, GLenum, texture, const GLbyte *, coords); \ HookWrapper3(void, glmultitexcoord2boes, GLenum, texture, GLbyte, s, GLbyte, t); \ @@ -3743,7 +3744,6 @@ HandleUnsupported(PFNGLWINDOWPOS3IVARBPROC, glwindowpos3ivarb); \ HandleUnsupported(PFNGLWINDOWPOS3SARBPROC, glwindowpos3sarb); \ HandleUnsupported(PFNGLWINDOWPOS3SVARBPROC, glwindowpos3svarb); \ - HandleUnsupported(PFNGLBLENDBARRIERKHRPROC, glblendbarrierkhr); \ HandleUnsupported(PFNGLMULTITEXCOORD1BOESPROC, glmultitexcoord1boes); \ HandleUnsupported(PFNGLMULTITEXCOORD1BVOESPROC, glmultitexcoord1bvoes); \ HandleUnsupported(PFNGLMULTITEXCOORD2BOESPROC, glmultitexcoord2boes); \ diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 562e9ad65..042009bad 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -76,12 +76,21 @@ void GLRenderState::FetchState(void *ctx, WrappedOpenGL *gl) eGL_SAMPLE_MASK, eGL_STENCIL_TEST, eGL_TEXTURE_CUBE_MAP_SEAMLESS, + eGL_BLEND_ADVANCED_COHERENT_KHR, }; RDCCOMPILE_ASSERT(ARRAY_COUNT(pnames) == eEnabled_Count, "Wrong number of pnames"); for(GLuint i=0; i < eEnabled_Count; i++) + { + if(pnames[i] == eGL_BLEND_ADVANCED_COHERENT_KHR && !ExtensionSupported[ExtensionSupported_KHR_blend_equation_advanced_coherent]) + { + Enabled[i] = true; + continue; + } + Enabled[i] = (m_Real->glIsEnabled(pnames[i]) == GL_TRUE); + } } m_Real->glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint *)&ActiveTexture); @@ -340,12 +349,18 @@ void GLRenderState::ApplyState(void *ctx, WrappedOpenGL *gl) eGL_SAMPLE_MASK, eGL_STENCIL_TEST, eGL_TEXTURE_CUBE_MAP_SEAMLESS, + eGL_BLEND_ADVANCED_COHERENT_KHR, }; RDCCOMPILE_ASSERT(ARRAY_COUNT(pnames) == eEnabled_Count, "Wrong number of pnames"); for(GLuint i=0; i < eEnabled_Count; i++) + { + if(pnames[i] == eGL_BLEND_ADVANCED_COHERENT_KHR && !ExtensionSupported[ExtensionSupported_KHR_blend_equation_advanced_coherent]) + continue; + if(Enabled[i]) m_Real->glEnable(pnames[i]); else m_Real->glDisable(pnames[i]); + } } for(GLuint i=0; i < (GLuint)ARRAY_COUNT(Tex2D); i++) diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 36464578b..360b9410c 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -75,6 +75,7 @@ struct GLRenderState //eEnabled_ScissorTest, handled below with scissor values eEnabled_StencilTest, eEnabled_TexCubeSeamless, + eEnabled_BlendCoherent, eEnabled_Count, }; diff --git a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp index fa47db6eb..7f81d5dee 100644 --- a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp @@ -269,6 +269,27 @@ void WrappedOpenGL::glBlendEquationSeparatei(GLuint buf, GLenum modeRGB, GLenum } } +bool WrappedOpenGL::Serialise_glBlendBarrierKHR() +{ + if(m_State <= EXECUTING) + m_Real.glBlendBarrierKHR(); + + return true; +} + +void WrappedOpenGL::glBlendBarrierKHR() +{ + m_Real.glBlendBarrierKHR(); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(BLEND_BARRIER); + Serialise_glBlendBarrierKHR(); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glLogicOp(GLenum opcode) { SERIALISE_ELEMENT(GLenum, Op, opcode);