diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index dfd8f226a..e44a08790 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -148,6 +148,7 @@ enum GLChunkType COLOR_MASKI, DEPTH_FUNC, DEPTH_MASK, + DEPTH_RANGE, DEPTH_RANGEARRAY, VIEWPORT, VIEWPORT_ARRAY, diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index 7611642d1..d6f73a6b2 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -323,6 +323,35 @@ void WrappedOpenGL::glDepthMask(GLboolean flag) } } +bool WrappedOpenGL::Serialise_glDepthRange(GLdouble nearVal, GLdouble farVal) +{ + SERIALISE_ELEMENT(GLdouble, n, nearVal); + SERIALISE_ELEMENT(GLdouble, f, farVal); + + if(m_State <= EXECUTING) + m_Real.glDepthRange(n, f); + + return true; +} + +void WrappedOpenGL::glDepthRange(GLdouble nearVal, GLdouble farVal) +{ + m_Real.glDepthRange(nearVal, farVal); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DEPTH_RANGE); + Serialise_glDepthRange(nearVal, farVal); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + +void WrappedOpenGL::glDepthRangef(GLfloat nearVal, GLfloat farVal) +{ + glDepthRange(nearVal, farVal); +} + bool WrappedOpenGL::Serialise_glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v) { SERIALISE_ELEMENT(uint32_t, idx, first); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index bc7a91c6c..04f571a49 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -105,6 +105,7 @@ const char *GLChunkNames[] = "glColorMaski", "glDepthFunc", "glDepthMask", + "glDepthRange", "glDepthRangeArrayv", "glViewport", "glViewportArrayv", @@ -1150,6 +1151,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case DEPTH_MASK: Serialise_glDepthMask(0); break; + case DEPTH_RANGE: + Serialise_glDepthRange(0, 0); + break; case DEPTH_RANGEARRAY: Serialise_glDepthRangeArrayv(0, 0, NULL); break; @@ -1615,6 +1619,11 @@ void WrappedOpenGL::glGetFloati_v(GLenum pname, GLuint index, GLfloat *data) m_Real.glGetFloati_v(pname, index, data); } +void WrappedOpenGL::glGetDoublei_v(GLenum pname, GLuint index, GLdouble *data) +{ + m_Real.glGetDoublei_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 5aa21733a..320d71925 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -283,6 +283,8 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glCullFace(GLenum cap)); IMPLEMENT_FUNCTION_SERIALISED(void, glDepthFunc(GLenum func)); IMPLEMENT_FUNCTION_SERIALISED(void, glDepthMask(GLboolean flag)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRange(GLdouble nearVal, GLdouble farVal)); + IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRangef(GLfloat nearVal, GLfloat farVal)); IMPLEMENT_FUNCTION_SERIALISED(void, glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)); IMPLEMENT_FUNCTION_SERIALISED(void, glDisable(GLenum cap)); IMPLEMENT_FUNCTION_SERIALISED(void, glEnable(GLenum cap)); @@ -297,6 +299,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glGetBooleanv(GLenum pname, GLboolean *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetIntegeri_v(GLenum pname, GLuint index, GLint *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetFloati_v(GLenum pname, GLuint index, GLfloat *data)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetDoublei_v(GLenum pname, GLuint index, GLdouble *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetBooleani_v(GLenum pname, GLuint index, GLboolean *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetInteger64i_v(GLenum target, GLuint index, GLint64 *data)); IMPLEMENT_FUNCTION_SERIALISED(const GLubyte *, glGetStringi(GLenum name, GLuint i)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 9e7c9be32..594770078 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -108,6 +108,7 @@ struct GLHookSet PFNGLGETBOOLEANI_VPROC glGetBooleani_v; PFNGLGETINTEGERI_VPROC glGetIntegeri_v; PFNGLGETFLOATI_VPROC glGetFloati_v; + PFNGLGETDOUBLEI_VPROC glGetDoublei_v; PFNGLGETINTEGER64I_VPROC glGetInteger64i_v; PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus; PFNGLBLENDCOLORPROC glBlendColor; @@ -117,6 +118,8 @@ struct GLHookSet PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate; PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei; PFNGLCOLORMASKIPROC glColorMaski; + PFNGLDEPTHRANGEPROC glDepthRange; + PFNGLDEPTHRANGEFPROC glDepthRangef; PFNGLDEPTHRANGEARRAYVPROC glDepthRangeArrayv; PFNGLCREATESHADERPROC glCreateShader; PFNGLDELETESHADERPROC glDeleteShader; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 90fea3ff3..4ec5b7d02 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -119,6 +119,7 @@ HookExtension(PFNGLGETBOOLEANI_VPROC, glGetBooleani_v); \ HookExtension(PFNGLGETINTEGERI_VPROC, glGetIntegeri_v); \ HookExtension(PFNGLGETFLOATI_VPROC, glGetFloati_v); \ + HookExtension(PFNGLGETDOUBLEI_VPROC, glGetDoublei_v); \ HookExtension(PFNGLGETINTEGER64I_VPROC, glGetInteger64i_v); \ HookExtension(PFNGLCHECKFRAMEBUFFERSTATUSPROC, glCheckFramebufferStatus); \ HookExtension(PFNGLBLENDCOLORPROC, glBlendColor); \ @@ -128,6 +129,8 @@ HookExtension(PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate); \ HookExtension(PFNGLBLENDEQUATIONSEPARATEIPROC, glBlendEquationSeparatei); \ HookExtension(PFNGLCOLORMASKIPROC, glColorMaski); \ + HookExtension(PFNGLDEPTHRANGEPROC, glDepthRange); \ + HookExtension(PFNGLDEPTHRANGEFPROC, glDepthRangef); \ HookExtension(PFNGLDEPTHRANGEARRAYVPROC, glDepthRangeArrayv); \ HookExtension(PFNGLCREATESHADERPROC, glCreateShader); \ HookExtension(PFNGLDELETESHADERPROC, glDeleteShader); \ @@ -371,6 +374,7 @@ HookWrapper3(void, glGetBooleani_v, GLenum, target, GLuint, index, GLboolean *, data); \ HookWrapper3(void, glGetIntegeri_v, GLenum, target, GLuint, index, GLint *, data); \ HookWrapper3(void, glGetFloati_v, GLenum, target, GLuint, index, GLfloat *, data); \ + HookWrapper3(void, glGetDoublei_v, GLenum, target, GLuint, index, GLdouble *, data); \ HookWrapper3(void, glGetInteger64i_v, GLenum, target, GLuint, index, GLint64 *, data); \ HookWrapper1(GLenum, glCheckFramebufferStatus, GLenum, target); \ HookWrapper4(void, glBlendColor, GLfloat, red, GLfloat, green, GLfloat, blue, GLfloat, alpha); \ @@ -380,6 +384,8 @@ HookWrapper2(void, glBlendEquationSeparate, GLenum, modeRGB, GLenum, modeAlpha); \ HookWrapper3(void, glBlendEquationSeparatei, GLuint, buf, GLenum, modeRGB, GLenum, modeAlpha); \ HookWrapper5(void, glColorMaski, GLuint, index, GLboolean, r, GLboolean, g, GLboolean, b, GLboolean, a); \ + HookWrapper2(void, glDepthRange, GLdouble, nearVal, GLdouble, farVal); \ + HookWrapper2(void, glDepthRangef, GLfloat, nearVal, GLfloat, farVal); \ HookWrapper3(void, glDepthRangeArrayv, GLuint, first, GLsizei, count, const GLdouble *, v); \ HookWrapper1(GLuint, glCreateShader, GLenum, type); \ HookWrapper1(void, glDeleteShader, GLuint, shader); \ diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 1b4a2e197..1f2964dbe 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -120,8 +120,8 @@ void GLRenderState::FetchState() m_Real->glGetBooleanv(eGL_DEPTH_WRITEMASK, &DepthWriteMask); m_Real->glGetFloatv(eGL_DEPTH_CLEAR_VALUE, &DepthClearValue); - for(size_t i=0; i < ARRAY_COUNT(DepthRanges); i++) - m_Real->glGetFloatv(eGL_DEPTH_RANGE, &DepthRanges[i].nearZ); + for(GLuint i=0; i < (GLuint)ARRAY_COUNT(DepthRanges); i++) + m_Real->glGetDoublei_v(eGL_DEPTH_RANGE, i, &DepthRanges[i].nearZ); for(size_t i=0; i < ARRAY_COUNT(ColorMasks); i++) m_Real->glGetBooleanv(eGL_COLOR_WRITEMASK, &ColorMasks[i].red); diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index f56a2f3f1..4c2316adf 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -85,7 +85,7 @@ struct GLRenderState float DepthClearValue; struct { - float nearZ, farZ; + double nearZ, farZ; } DepthRanges[16]; struct