From 0dc338e5630f8f0ad57c0b5253719d94e8937be0 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 30 May 2014 23:27:55 +0100 Subject: [PATCH] Serialise out viewports --- renderdoc/driver/gl/gl_common.h | 1 + renderdoc/driver/gl/gl_context_driver.cpp | 40 +++++++++++++++++++++++ renderdoc/driver/gl/gl_driver.cpp | 9 +++++ renderdoc/driver/gl/gl_driver.h | 4 +++ renderdoc/driver/gl/gl_hookset.h | 4 +++ renderdoc/driver/gl/gl_hookset_defs.h | 8 +++++ renderdoc/driver/gl/gl_renderstate.cpp | 14 ++++++++ renderdoc/driver/gl/gl_renderstate.h | 5 +++ 8 files changed, 85 insertions(+) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 735403044..cbdc15d14 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -131,6 +131,7 @@ enum GLChunkType BLEND_EQ_SEPI, DEPTH_FUNC, VIEWPORT, + VIEWPORT_ARRAY, USEPROGRAM, BINDVERTEXARRAY, UNIFORM_MATRIX, diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index 904467d1a..7e603542b 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -371,6 +371,46 @@ void WrappedOpenGL::glViewport(GLint x, GLint y, GLsizei width, GLsizei height) } } +bool WrappedOpenGL::Serialise_glViewportArrayv(GLuint index, GLuint count, const GLfloat *v) +{ + SERIALISE_ELEMENT(GLuint, idx, index); + SERIALISE_ELEMENT(GLuint, cnt, count); + SERIALISE_ELEMENT_ARR(GLfloat, views, v, cnt*4); + + if(m_State <= EXECUTING) + { + m_Real.glViewportArrayv(idx, cnt, views); + } + + delete[] views; + + return true; +} + +void WrappedOpenGL::glViewportArrayv(GLuint index, GLuint count, const GLfloat *v) +{ + m_Real.glViewportArrayv(index, count, v); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(VIEWPORT_ARRAY); + Serialise_glViewportArrayv(index, count, v); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h) +{ + const float v[4] = { x, y, w, h }; + glViewportArrayv(index, 1, v); +} + +void WrappedOpenGL::glViewportIndexedfv(GLuint index, const GLfloat *v) +{ + glViewportArrayv(index, 1, v); +} + void WrappedOpenGL::glPolygonMode(GLenum face, GLenum mode) { m_Real.glPolygonMode(face, mode); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index a4e6f1418..97420c222 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -88,6 +88,7 @@ const char *GLChunkNames[] = "glBlendEquationSeparatei", "glDepthFunc", "glViewport", + "glViewportArrayv", "glUseProgram", "glBindVertexArray", "glUniformMatrix*", @@ -1005,6 +1006,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case VIEWPORT: Serialise_glViewport(0, 0, 0, 0); break; + case VIEWPORT_ARRAY: + Serialise_glViewportArrayv(0, 0, 0); + break; case USEPROGRAM: Serialise_glUseProgram(0); break; @@ -1406,6 +1410,11 @@ void WrappedOpenGL::glGetIntegeri_v(GLenum pname, GLuint index, GLint *data) m_Real.glGetIntegeri_v(pname, index, data); } +void WrappedOpenGL::glGetFloati_v(GLenum pname, GLuint index, GLfloat *data) +{ + m_Real.glGetFloati_v(pname, index, data); +} + void WrappedOpenGL::glGetInteger64i_v(GLenum pname, GLuint index, GLint64 *data) { m_Real.glGetInteger64i_v(pname, index, data); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index e9d054e1c..e2f864bc6 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -281,6 +281,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glGetFloatv(GLenum pname, GLfloat *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetIntegerv(GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetIntegeri_v(GLenum target, GLuint index, GLint *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetFloati_v(GLenum target, GLuint index, GLfloat *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)); IMPLEMENT_FUNCTION_SERIALISED(const GLubyte *, glGetStringi(GLenum name, GLuint i)); IMPLEMENT_FUNCTION_SERIALISED(const GLubyte *, glGetString(GLenum name)); @@ -297,6 +298,9 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glBindSampler(GLuint unit, GLuint sampler)); IMPLEMENT_FUNCTION_SERIALISED(void, glSamplerParameteri(GLuint sampler, GLenum pname, GLint param)); IMPLEMENT_FUNCTION_SERIALISED(void, glViewport(GLint x, GLint y, GLsizei width, GLsizei height)); + IMPLEMENT_FUNCTION_SERIALISED(void, glViewportIndexedf(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h)); + IMPLEMENT_FUNCTION_SERIALISED(void, glViewportIndexedfv(GLuint index, const GLfloat *v)); + IMPLEMENT_FUNCTION_SERIALISED(void, glViewportArrayv(GLuint first, GLuint count, const GLfloat *v)); IMPLEMENT_FUNCTION_SERIALISED(void, glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels)); IMPLEMENT_FUNCTION_SERIALISED(void, glReadBuffer(GLenum mode)); IMPLEMENT_FUNCTION_SERIALISED(void, glGenFramebuffers(GLsizei n, GLuint *framebuffers)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 8713eef5d..25ba64600 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -92,6 +92,7 @@ struct GLHookSet PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv; PFNGLGETSTRINGIPROC glGetStringi; PFNGLGETINTEGERI_VPROC glGetIntegeri_v; + PFNGLGETFLOATI_VPROC glGetFloati_v; PFNGLGETINTEGER64I_VPROC glGetInteger64i_v; PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate; @@ -142,6 +143,9 @@ struct GLHookSet PFNGLBINDSAMPLERPROC glBindSampler; PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri; PFNGLCLEARBUFFERFVPROC glClearBufferfv; + PFNGLVIEWPORTINDEXEDFPROC glViewportIndexedf; + PFNGLVIEWPORTINDEXEDFVPROC glViewportIndexedfv; + PFNGLVIEWPORTARRAYVPROC glViewportArrayv; PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation; PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform; PFNGLGETUNIFORMFVPROC glGetUniformfv; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index afce2d57c..dab6e9162 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -103,6 +103,7 @@ HookExtension(PFNGLGETBUFFERPARAMETERIVPROC, glGetBufferParameteriv); \ HookExtension(PFNGLGETSTRINGIPROC, glGetStringi); \ HookExtension(PFNGLGETINTEGERI_VPROC, glGetIntegeri_v); \ + HookExtension(PFNGLGETFLOATI_VPROC, glGetFloati_v); \ HookExtension(PFNGLGETINTEGER64I_VPROC, glGetInteger64i_v); \ HookExtension(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus); \ HookExtension(PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate); \ @@ -154,6 +155,9 @@ HookExtension(PFNGLBINDSAMPLERPROC, glBindSampler); \ HookExtension(PFNGLSAMPLERPARAMETERIPROC, glSamplerParameteri); \ HookExtension(PFNGLCLEARBUFFERFVPROC, glClearBufferfv); \ + HookExtension(PFNGLVIEWPORTINDEXEDFPROC, glViewportIndexedf); \ + HookExtension(PFNGLVIEWPORTINDEXEDFVPROC, glViewportIndexedfv); \ + HookExtension(PFNGLVIEWPORTARRAYVPROC, glViewportArrayv); \ HookExtension(PFNGLGETUNIFORMLOCATIONPROC, glGetUniformLocation); \ HookExtension(PFNGLGETACTIVEUNIFORMPROC, glGetActiveUniform); \ HookExtension(PFNGLGETUNIFORMFVPROC, glGetUniformfv); \ @@ -287,6 +291,7 @@ HookWrapper3(void, glGetBufferParameteriv, GLenum, target, GLenum, pname, GLint *, params); \ HookWrapper2(const GLubyte *, glGetStringi, GLenum, name, GLuint, index); \ HookWrapper3(void, glGetIntegeri_v, GLenum, target, GLuint, index, GLint *, data); \ + HookWrapper3(void, glGetFloati_v, GLenum, target, GLuint, index, GLfloat *, data); \ 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); \ @@ -337,6 +342,9 @@ HookWrapper2(void, glBindSampler, GLuint, unit, GLuint, sampler); \ HookWrapper3(void, glSamplerParameteri, GLuint, sampler, GLenum, pname, GLint, param); \ 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); \ 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 ee0521294..4203ca242 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -92,6 +92,9 @@ void GLRenderState::FetchState() } m_Real->glGetFloatv(eGL_BLEND_COLOR, &BlendColor[0]); + + for(int i=0; i < ARRAY_COUNT(Viewports); i++) + m_Real->glGetFloati_v(eGL_VIEWPORT, i, &Viewports[i].x); } void GLRenderState::ApplyState() @@ -134,6 +137,8 @@ void GLRenderState::ApplyState() } m_Real->glBlendColor(BlendColor[0], BlendColor[1], BlendColor[2], BlendColor[3]); + + m_Real->glViewportArrayv(0, ARRAY_COUNT(Viewports), &Viewports[0].x); } void GLRenderState::Clear() @@ -147,6 +152,7 @@ void GLRenderState::Clear() RDCEraseEl(UniformBinding); RDCEraseEl(Blends); RDCEraseEl(BlendColor); + RDCEraseEl(Viewports); } void GLRenderState::Serialise(LogState state, GLResourceManager *rm) @@ -203,4 +209,12 @@ void GLRenderState::Serialise(LogState state, GLResourceManager *rm) } m_pSerialiser->Serialise<4>("GL_BLEND_COLOR", BlendColor); + + for(int i=0; i < ARRAY_COUNT(Viewports); i++) + { + m_pSerialiser->Serialise("GL_VIEWPORT.x", Viewports[i].x); + m_pSerialiser->Serialise("GL_VIEWPORT.y", Viewports[i].y); + m_pSerialiser->Serialise("GL_VIEWPORT.w", Viewports[i].width); + m_pSerialiser->Serialise("GL_VIEWPORT.h", Viewports[i].height); + } } diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 5c8e92b7e..5d5629d98 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -57,6 +57,11 @@ struct GLRenderState GLenum DestinationRGB, DestinationAlpha; } Blends[8]; float BlendColor[4]; + + struct Viewport + { + float x, y, width, height; + } Viewports[16]; // void Serialise(LogState state, GLResourceManager *rm);