From 4062c81132e8f13f882f4c95571abfce31ddd41d Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 30 May 2014 23:40:28 +0100 Subject: [PATCH] glCullFace and glFrontFace --- renderdoc/driver/gl/gl_common.h | 2 + renderdoc/driver/gl/gl_context_driver.cpp | 50 +++++++++++++++++++++++ renderdoc/driver/gl/gl_driver.cpp | 8 ++++ renderdoc/driver/gl/gl_driver.h | 2 + renderdoc/driver/gl/gl_hookset.h | 2 + renderdoc/driver/gl/gl_hookset_defs.h | 22 ++++++---- renderdoc/driver/gl/gl_renderstate.cpp | 11 +++++ renderdoc/driver/gl/gl_renderstate.h | 3 ++ 8 files changed, 92 insertions(+), 8 deletions(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index cbdc15d14..42cbf23d2 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -121,8 +121,10 @@ enum GLChunkType CLEAR_DEPTH, CLEAR, CLEARBUFFERF, + CULL_FACE, ENABLE, DISABLE, + FRONT_FACE, BLEND_FUNC, BLEND_COLOR, BLEND_FUNC_SEP, diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index 7e603542b..a5a3d7882 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -336,6 +336,56 @@ void WrappedOpenGL::glEnable(GLenum cap) } } +bool WrappedOpenGL::Serialise_glFrontFace(GLenum mode) +{ + SERIALISE_ELEMENT(GLenum, m, mode); + + if(m_State <= EXECUTING) + { + m_Real.glFrontFace(m); + } + + return true; +} + +void WrappedOpenGL::glFrontFace(GLenum mode) +{ + m_Real.glFrontFace(mode); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(FRONT_FACE); + Serialise_glFrontFace(mode); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +bool WrappedOpenGL::Serialise_glCullFace(GLenum mode) +{ + SERIALISE_ELEMENT(GLenum, m, mode); + + if(m_State <= EXECUTING) + { + m_Real.glCullFace(m); + } + + return true; +} + +void WrappedOpenGL::glCullFace(GLenum mode) +{ + m_Real.glCullFace(mode); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(CULL_FACE); + Serialise_glCullFace(mode); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + void WrappedOpenGL::glHint(GLenum target, GLenum mode) { m_Real.glHint(target, mode); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 97420c222..b10b57f0c 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -78,8 +78,10 @@ const char *GLChunkNames[] = "glClearDepth", "glClear", "glClearBufferfv", + "glCullFace", "glEnable", "glDisable", + "glFrontFace", "glBlendFunc", "glBlendColor", "glBlendFuncSeparate", @@ -973,6 +975,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case CLEAR: Serialise_glClear(0); break; + case CULL_FACE: + Serialise_glCullFace(eGL_UNKNOWN_ENUM); + break; case CLEARBUFFERF: Serialise_glClearBufferfv(eGL_UNKNOWN_ENUM, 0, NULL); break; @@ -982,6 +987,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case ENABLE: Serialise_glEnable(eGL_UNKNOWN_ENUM); break; + case FRONT_FACE: + Serialise_glFrontFace(eGL_UNKNOWN_ENUM); + break; case BLEND_FUNC: glBlendFunc(eGL_UNKNOWN_ENUM, eGL_UNKNOWN_ENUM); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index e2f864bc6..c9bbb7451 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -274,9 +274,11 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glClear(GLbitfield mask)); IMPLEMENT_FUNCTION_SERIALISED(void, glClearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)); IMPLEMENT_FUNCTION_SERIALISED(void, glClearDepth(GLclampd depth)); + IMPLEMENT_FUNCTION_SERIALISED(void, glCullFace(GLenum cap)); IMPLEMENT_FUNCTION_SERIALISED(void, glDepthFunc(GLenum func)); IMPLEMENT_FUNCTION_SERIALISED(void, glDisable(GLenum cap)); IMPLEMENT_FUNCTION_SERIALISED(void, glEnable(GLenum cap)); + IMPLEMENT_FUNCTION_SERIALISED(void, glFrontFace(GLenum cap)); IMPLEMENT_FUNCTION_SERIALISED(GLenum, glGetError()); IMPLEMENT_FUNCTION_SERIALISED(void, glGetFloatv(GLenum pname, GLfloat *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetIntegerv(GLenum pname, GLint *params)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 25ba64600..537956eca 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -37,10 +37,12 @@ struct GLHookSet PFNGLCLEARPROC glClear; PFNGLCLEARCOLORPROC glClearColor; PFNGLCLEARDEPTHPROC glClearDepth; + PFNGLCULLFACEPROC glCullFace; PFNGLDEPTHFUNCPROC glDepthFunc; PFNGLDISABLEPROC glDisable; PFNGLDRAWARRAYSPROC glDrawArrays; PFNGLENABLEPROC glEnable; + PFNGLFRONTFACEPROC glFrontFace; PFNGLGENTEXTURESPROC glGenTextures; PFNGLDELETETEXTURESPROC glDeleteTextures; PFNGLGETERRORPROC glGetError; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index dab6e9162..596ffa67a 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -37,10 +37,12 @@ HookInit(glClear); \ HookInit(glClearColor); \ HookInit(glClearDepth); \ + HookInit(glCullFace); \ HookInit(glDepthFunc); \ HookInit(glDisable); \ HookInit(glDrawArrays); \ HookInit(glEnable); \ + HookInit(glFrontFace); \ HookInit(glGenTextures); \ HookInit(glDeleteTextures); \ HookInit(glGetError); \ @@ -123,9 +125,9 @@ HookExtension(PFNGLUSEPROGRAMPROC, glUseProgram); \ HookExtension(PFNGLGETPROGRAMIVPROC, glGetProgramiv); \ HookExtension(PFNGLGETPROGRAMINFOLOGPROC, glGetProgramInfoLog); \ - HookExtension(PFNGLGETPROGRAMINTERFACEIVPROC, glGetProgramInterfaceiv); \ - HookExtension(PFNGLGETPROGRAMRESOURCEIVPROC, glGetProgramResourceiv); \ - HookExtension(PFNGLGETPROGRAMRESOURCENAMEPROC, glGetProgramResourceName); \ + HookExtension(PFNGLGETPROGRAMINTERFACEIVPROC, glGetProgramInterfaceiv); \ + HookExtension(PFNGLGETPROGRAMRESOURCEIVPROC, glGetProgramResourceiv); \ + HookExtension(PFNGLGETPROGRAMRESOURCENAMEPROC, glGetProgramResourceName); \ HookExtension(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback); \ HookExtensionAlias(PFNGLDEBUGMESSAGECALLBACKPROC, glDebugMessageCallback, glDebugMessageCallbackARB); \ HookExtension(PFNGLGETOBJECTLABELPROC, glGetObjectLabel); \ @@ -172,10 +174,12 @@ HookExtension(PFNGLCLEARPROC, glClear); \ HookExtension(PFNGLCLEARCOLORPROC, glClearColor); \ HookExtension(PFNGLCLEARDEPTHPROC, glClearDepth); \ + HookExtension(PFNGLCULLFACEPROC, glCullFace); \ HookExtension(PFNGLDEPTHFUNCPROC, glDepthFunc); \ HookExtension(PFNGLDISABLEPROC, glDisable); \ HookExtension(PFNGLDRAWARRAYSPROC, glDrawArrays); \ HookExtension(PFNGLENABLEPROC, glEnable); \ + HookExtension(PFNGLFRONTFACEPROC, glFrontFace); \ HookExtension(PFNGLGENTEXTURESPROC, glGenTextures); \ HookExtension(PFNGLDELETETEXTURESPROC, glDeleteTextures); \ HookExtension(PFNGLGETERRORPROC, glGetError); \ @@ -225,10 +229,12 @@ HookWrapper1(void, glClear, GLbitfield, mask); \ HookWrapper4(void, glClearColor, GLfloat, red, GLfloat, green, GLfloat, blue, GLfloat, alpha); \ HookWrapper1(void, glClearDepth, GLdouble, depth); \ + HookWrapper1(void, glCullFace, GLenum, mode); \ HookWrapper1(void, glDepthFunc, GLenum, func); \ HookWrapper1(void, glDisable, GLenum, cap); \ HookWrapper3(void, glDrawArrays, GLenum, mode, GLint, first, GLsizei, count); \ HookWrapper1(void, glEnable, GLenum, cap); \ + HookWrapper1(void, glFrontFace, GLenum, mode); \ HookWrapper2(void, glGenTextures, GLsizei, n, GLuint *, textures); \ HookWrapper2(void, glDeleteTextures, GLsizei, n, const GLuint *, textures); \ HookWrapper0(GLenum, glGetError); \ @@ -295,7 +301,7 @@ HookWrapper3(void, glGetInteger64i_v, GLenum, target, GLuint, index, GLint64 *, data); \ HookWrapper1(GLenum, glCheckFramebufferStatus, GLenum, target); \ HookWrapper4(void, glBlendFuncSeparate, GLenum, sfactorRGB, GLenum, dfactorRGB, GLenum, sfactorAlpha, GLenum, dfactorAlpha); \ - HookWrapper5(void, glBlendFuncSeparatei, GLuint, buf, GLenum, sfactorRGB, GLenum, dfactorRGB, GLenum, sfactorAlpha, GLenum, dfactorAlpha); \ + HookWrapper5(void, glBlendFuncSeparatei, GLuint, buf, GLenum, srcRGB, GLenum, dstRGB, GLenum, srcAlpha, GLenum, dstAlpha); \ HookWrapper2(void, glBlendEquationSeparate, GLenum, modeRGB, GLenum, modeAlpha); \ HookWrapper3(void, glBlendEquationSeparatei, GLuint, buf, GLenum, modeRGB, GLenum, modeAlpha); \ HookWrapper1(GLuint, glCreateShader, GLenum, type); \ @@ -311,9 +317,9 @@ HookWrapper1(void, glUseProgram, GLuint, program); \ HookWrapper3(void, glGetProgramiv, GLuint, program, GLenum, pname, GLint *, params); \ HookWrapper4(void, glGetProgramInfoLog, GLuint, program, GLsizei, bufSize, GLsizei *, length, GLchar *, infoLog); \ - HookWrapper4(void, glGetProgramInterfaceiv, GLuint, program, GLenum, programInterface, GLenum, pname, GLint *, params); \ - HookWrapper8(void, glGetProgramResourceiv, GLuint, program, GLenum, programInterface, GLuint, index, GLsizei, propCount, const GLenum *, props, GLsizei, bufSize, GLsizei *, length, GLint *, params); \ - HookWrapper6(void, glGetProgramResourceName, GLuint, program, GLenum, programInterface, GLuint, index, GLsizei, bufSize, GLsizei *, length, GLchar *, name); \ + HookWrapper4(void, glGetProgramInterfaceiv, GLuint, program, GLenum, programInterface, GLenum, pname, GLint *, params); \ + HookWrapper8(void, glGetProgramResourceiv, GLuint, program, GLenum, programInterface, GLuint, index, GLsizei, propCount, const GLenum *, props, GLsizei, bufSize, GLsizei *, length, GLint *, params); \ + HookWrapper6(void, glGetProgramResourceName, GLuint, program, GLenum, programInterface, GLuint, index, GLsizei, bufSize, GLsizei *, length, GLchar *, name); \ HookWrapper2(void, glDebugMessageCallback, GLDEBUGPROC, callback, const void *, userParam); \ HookWrapper5(void, glGetObjectLabel, GLenum, identifier, GLuint, name, GLsizei, bufSize, GLsizei *, length, GLchar *, label); \ HookWrapper4(void, glObjectLabel, GLenum, identifier, GLuint, name, GLsizei, length, const GLchar *, label); \ @@ -344,7 +350,7 @@ HookWrapper3(void, glClearBufferfv, GLenum, buffer, GLint, drawbuffer, const GLfloat *, value); \ HookWrapper5(void, glViewportIndexedf, GLuint, index, GLfloat, x, GLfloat, y, GLfloat, w, GLfloat, h); \ HookWrapper2(void, glViewportIndexedfv, GLuint, index, const GLfloat *, v); \ - HookWrapper3(void, glViewportArrayv, GLuint, first, GLuint, count, const GLfloat *, v); \ + HookWrapper3(void, glViewportArrayv, GLuint, first, GLsizei, count, const GLfloat *, v); \ HookWrapper2(GLint, glGetUniformLocation, GLuint, program, const GLchar *, name); \ HookWrapper7(void, glGetActiveUniform, GLuint, program, GLuint, index, GLsizei, bufSize, GLsizei *, length, GLint *, size, GLenum *, type, GLchar *, name); \ HookWrapper3(void, glGetUniformfv, GLuint, program, GLint, location, GLfloat *, params); \ diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 4203ca242..dda89ebc1 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -95,6 +95,9 @@ void GLRenderState::FetchState() for(int i=0; i < ARRAY_COUNT(Viewports); i++) m_Real->glGetFloati_v(eGL_VIEWPORT, i, &Viewports[i].x); + + m_Real->glGetIntegerv(eGL_FRONT_FACE, (GLint *)&FrontFace); + m_Real->glGetIntegerv(eGL_CULL_FACE_MODE, (GLint *)&CullFace); } void GLRenderState::ApplyState() @@ -139,6 +142,9 @@ void GLRenderState::ApplyState() m_Real->glBlendColor(BlendColor[0], BlendColor[1], BlendColor[2], BlendColor[3]); m_Real->glViewportArrayv(0, ARRAY_COUNT(Viewports), &Viewports[0].x); + + m_Real->glFrontFace(FrontFace); + m_Real->glCullFace(CullFace); } void GLRenderState::Clear() @@ -153,6 +159,8 @@ void GLRenderState::Clear() RDCEraseEl(Blends); RDCEraseEl(BlendColor); RDCEraseEl(Viewports); + RDCEraseEl(FrontFace); + RDCEraseEl(CullFace); } void GLRenderState::Serialise(LogState state, GLResourceManager *rm) @@ -217,4 +225,7 @@ void GLRenderState::Serialise(LogState state, GLResourceManager *rm) m_pSerialiser->Serialise("GL_VIEWPORT.w", Viewports[i].width); m_pSerialiser->Serialise("GL_VIEWPORT.h", Viewports[i].height); } + + m_pSerialiser->Serialise("GL_FRONT_FACE", FrontFace); + m_pSerialiser->Serialise("GL_CULL_FACE_MODE", CullFace); } diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 5d5629d98..794a1091d 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -62,6 +62,9 @@ struct GLRenderState { float x, y, width, height; } Viewports[16]; + + GLenum FrontFace; + GLenum CullFace; // void Serialise(LogState state, GLResourceManager *rm);