From 272fa3d2b7d404acab8e1b68f39e8d22ce47f838 Mon Sep 17 00:00:00 2001 From: Baldur Karlsson Date: Tue, 17 Jun 2014 16:41:47 +0100 Subject: [PATCH] Add support for EXT_depth_bounds_test --- renderdoc/driver/gl/gl_common.h | 1 + renderdoc/driver/gl/gl_context_driver.cpp | 26 +++++++++++++++++++++++ renderdoc/driver/gl/gl_driver.cpp | 9 ++++++++ renderdoc/driver/gl/gl_driver.h | 2 ++ renderdoc/driver/gl/gl_hookset.h | 2 ++ renderdoc/driver/gl/gl_hookset_defs.h | 5 +++++ renderdoc/driver/gl/gl_renderstate.cpp | 11 ++++++++++ renderdoc/driver/gl/gl_renderstate.h | 5 +++++ 8 files changed, 61 insertions(+) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index e44a08790..bc332afc9 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -150,6 +150,7 @@ enum GLChunkType DEPTH_MASK, DEPTH_RANGE, DEPTH_RANGEARRAY, + DEPTH_BOUNDS, VIEWPORT, VIEWPORT_ARRAY, SCISSOR, diff --git a/renderdoc/driver/gl/gl_context_driver.cpp b/renderdoc/driver/gl/gl_context_driver.cpp index d6f73a6b2..f5e2a7380 100644 --- a/renderdoc/driver/gl/gl_context_driver.cpp +++ b/renderdoc/driver/gl/gl_context_driver.cpp @@ -381,6 +381,32 @@ void WrappedOpenGL::glDepthRangeArrayv(GLuint first, GLsizei count, const GLdoub } } +bool WrappedOpenGL::Serialise_glDepthBoundsEXT(GLclampd nearVal, GLclampd farVal) +{ + SERIALISE_ELEMENT(GLdouble, n, nearVal); + SERIALISE_ELEMENT(GLdouble, f, farVal); + + if(m_State <= EXECUTING) + { + m_Real.glDepthBoundsEXT(n, f); + } + + return true; +} + +void WrappedOpenGL::glDepthBoundsEXT(GLclampd nearVal, GLclampd farVal) +{ + m_Real.glDepthBoundsEXT(nearVal, farVal); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DEPTH_BOUNDS); + Serialise_glDepthBoundsEXT(nearVal, farVal); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glDisable(GLenum cap) { SERIALISE_ELEMENT(GLenum, c, cap); diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 04f571a49..06e4c0381 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -107,6 +107,7 @@ const char *GLChunkNames[] = "glDepthMask", "glDepthRange", "glDepthRangeArrayv", + "glDepthBoundsEXT", "glViewport", "glViewportArrayv", "glScissor", @@ -1157,6 +1158,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case DEPTH_RANGEARRAY: Serialise_glDepthRangeArrayv(0, 0, NULL); break; + case DEPTH_BOUNDS: + Serialise_glDepthBoundsEXT(0, 0); + break; case VIEWPORT: Serialise_glViewport(0, 0, 0, 0); break; @@ -1587,6 +1591,11 @@ void WrappedOpenGL::glGetFloatv(GLenum pname, GLfloat *params) m_Real.glGetFloatv(pname, params); } +void WrappedOpenGL::glGetDoublev(GLenum pname, GLdouble *params) +{ + m_Real.glGetDoublev(pname, params); +} + void WrappedOpenGL::glGetIntegerv(GLenum pname, GLint *params) { if(pname == GL_NUM_EXTENSIONS) diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 320d71925..eabc37663 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -286,6 +286,7 @@ class WrappedOpenGL 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, glDepthBoundsEXT(GLclampd nearVal, GLclampd farVal)); IMPLEMENT_FUNCTION_SERIALISED(void, glDisable(GLenum cap)); IMPLEMENT_FUNCTION_SERIALISED(void, glEnable(GLenum cap)); IMPLEMENT_FUNCTION_SERIALISED(void, glDisablei(GLenum cap, GLuint index)); @@ -295,6 +296,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glFinish()); IMPLEMENT_FUNCTION_SERIALISED(void, glFlush()); IMPLEMENT_FUNCTION_SERIALISED(void, glGetFloatv(GLenum pname, GLfloat *params)); + IMPLEMENT_FUNCTION_SERIALISED(void, glGetDoublev(GLenum pname, GLdouble *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetIntegerv(GLenum pname, GLint *params)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetBooleanv(GLenum pname, GLboolean *data)); IMPLEMENT_FUNCTION_SERIALISED(void, glGetIntegeri_v(GLenum pname, GLuint index, GLint *data)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 594770078..868a74250 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -57,6 +57,7 @@ struct GLHookSet PFNGLGETTEXIMAGEPROC glGetTexImage; PFNGLGETBOOLEANVPROC glGetBooleanv; PFNGLGETFLOATVPROC glGetFloatv; + PFNGLGETDOUBLEVPROC glGetDoublev; PFNGLGETINTEGERVPROC glGetIntegerv; PFNGLGETSTRINGPROC glGetString; PFNGLHINTPROC glHint; @@ -121,6 +122,7 @@ struct GLHookSet PFNGLDEPTHRANGEPROC glDepthRange; PFNGLDEPTHRANGEFPROC glDepthRangef; PFNGLDEPTHRANGEARRAYVPROC glDepthRangeArrayv; + PFNGLDEPTHBOUNDSEXTPROC glDepthBoundsEXT; PFNGLCREATESHADERPROC glCreateShader; PFNGLDELETESHADERPROC glDeleteShader; PFNGLSHADERSOURCEPROC glShaderSource; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 4ec5b7d02..d2f123cde 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -57,6 +57,7 @@ HookInit(glGetTexImage); \ HookInit(glGetBooleanv); \ HookInit(glGetFloatv); \ + HookInit(glGetDoublev); \ HookInit(glGetIntegerv); \ HookInit(glGetString); \ HookInit(glHint); \ @@ -132,6 +133,7 @@ HookExtension(PFNGLDEPTHRANGEPROC, glDepthRange); \ HookExtension(PFNGLDEPTHRANGEFPROC, glDepthRangef); \ HookExtension(PFNGLDEPTHRANGEARRAYVPROC, glDepthRangeArrayv); \ + HookExtension(PFNGLDEPTHBOUNDSEXTPROC, glDepthBoundsEXT); \ HookExtension(PFNGLCREATESHADERPROC, glCreateShader); \ HookExtension(PFNGLDELETESHADERPROC, glDeleteShader); \ HookExtension(PFNGLSHADERSOURCEPROC, glShaderSource); \ @@ -249,6 +251,7 @@ HookExtension(PFNGLGETTEXIMAGEPROC, glGetTexImage); \ HookExtension(PFNGLGETBOOLEANVPROC, glGetBooleanv); \ HookExtension(PFNGLGETFLOATVPROC, glGetFloatv); \ + HookExtension(PFNGLGETDOUBLEVPROC, glGetDoublev); \ HookExtension(PFNGLGETINTEGERVPROC, glGetIntegerv); \ HookExtension(PFNGLGETSTRINGPROC, glGetString); \ HookExtension(PFNGLHINTPROC, glHint); \ @@ -312,6 +315,7 @@ HookWrapper5(void, glGetTexImage, GLenum, target, GLint, level, GLenum, format, GLenum, type, void *, pixels); \ HookWrapper2(void, glGetBooleanv, GLenum, pname, GLboolean *, data); \ HookWrapper2(void, glGetFloatv, GLenum, pname, GLfloat *, data); \ + HookWrapper2(void, glGetDoublev, GLenum, pname, GLdouble *, data); \ HookWrapper2(void, glGetIntegerv, GLenum, pname, GLint *, data); \ HookWrapper1(const GLubyte *, glGetString, GLenum, name); \ HookWrapper2(void, glHint, GLenum, target, GLenum, mode); \ @@ -387,6 +391,7 @@ HookWrapper2(void, glDepthRange, GLdouble, nearVal, GLdouble, farVal); \ HookWrapper2(void, glDepthRangef, GLfloat, nearVal, GLfloat, farVal); \ HookWrapper3(void, glDepthRangeArrayv, GLuint, first, GLsizei, count, const GLdouble *, v); \ + HookWrapper2(void, glDepthBoundsEXT, GLclampd, nearVal, GLclampd, farVal); \ HookWrapper1(GLuint, glCreateShader, GLenum, type); \ HookWrapper1(void, glDeleteShader, GLuint, shader); \ HookWrapper4(void, glShaderSource, GLuint, shader, GLsizei, count, const GLchar *const*, string, const GLint *, length); \ diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index 1f2964dbe..66bfc9745 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -38,6 +38,7 @@ GLRenderState::~GLRenderState() void GLRenderState::FetchState() { // TODO check GL_MAX_* + // TODO check the extensions/core version for these is around m_Real->glGetIntegerv(eGL_ACTIVE_TEXTURE, (GLint *)&ActiveTexture); @@ -123,6 +124,8 @@ void GLRenderState::FetchState() for(GLuint i=0; i < (GLuint)ARRAY_COUNT(DepthRanges); i++) m_Real->glGetDoublei_v(eGL_DEPTH_RANGE, i, &DepthRanges[i].nearZ); + m_Real->glGetDoublev(eGL_DEPTH_BOUNDS_TEST_EXT, &DepthBounds.nearZ); + for(size_t i=0; i < ARRAY_COUNT(ColorMasks); i++) m_Real->glGetBooleanv(eGL_COLOR_WRITEMASK, &ColorMasks[i].red); @@ -203,6 +206,8 @@ void GLRenderState::ApplyState() double v[2] = { DepthRanges[i].nearZ, DepthRanges[i].farZ }; m_Real->glDepthRangeArrayv(i, 1, v); } + + m_Real->glDepthBoundsEXT(DepthBounds.nearZ, DepthBounds.farZ); for(GLuint i=0; i < (GLuint)ARRAY_COUNT(ColorMasks); i++) m_Real->glColorMaski(i, ColorMasks[i].red, ColorMasks[i].green, ColorMasks[i].blue, ColorMasks[i].alpha); @@ -235,6 +240,7 @@ void GLRenderState::Clear() RDCEraseEl(DepthWriteMask); RDCEraseEl(DepthClearValue); RDCEraseEl(DepthRanges); + RDCEraseEl(DepthBounds); RDCEraseEl(ColorMasks); RDCEraseEl(ColorClearValue); @@ -334,6 +340,11 @@ void GLRenderState::Serialise(LogState state, GLResourceManager *rm) m_pSerialiser->Serialise("GL_DEPTH_RANGE.far", DepthRanges[i].farZ); } + { + m_pSerialiser->Serialise("GL_DEPTH_BOUNDS_EXT.near", DepthBounds.nearZ); + m_pSerialiser->Serialise("GL_DEPTH_BOUNDS_EXT.far", DepthBounds.farZ); + } + for(size_t i=0; i < ARRAY_COUNT(ColorMasks); i++) m_pSerialiser->Serialise<4>("GL_COLOR_WRITEMASK", &ColorMasks[i].red); diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 4c2316adf..3b197c7e3 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -87,6 +87,11 @@ struct GLRenderState { double nearZ, farZ; } DepthRanges[16]; + + struct + { + double nearZ, farZ; + } DepthBounds; struct {