From 86a87f091c61697d01ab534fa794f3911bc05252 Mon Sep 17 00:00:00 2001 From: valeriog Date: Tue, 14 Oct 2014 17:45:53 +0200 Subject: [PATCH] Differentiate between glDepthRangef and glDepthRange when capturing. This prevents a crash when the captured application doesn't retrieve the glDepthRange pointer, and uses glDepthRangef instead. --- renderdoc/driver/gl/gl_common.h | 1 + renderdoc/driver/gl/gl_driver.cpp | 4 ++++ .../driver/gl/wrappers/gl_state_funcs.cpp | 21 ++++++++++++++++++- 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index f547c8e26..f78414fbc 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -171,6 +171,7 @@ enum GLChunkType DEPTH_FUNC, DEPTH_MASK, DEPTH_RANGE, + DEPTH_RANGEF, DEPTH_RANGEARRAY, DEPTH_BOUNDS, PATCH_PARAMI, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index fdda8a713..b2c2aa726 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -121,6 +121,7 @@ const char *GLChunkNames[] = "glDepthFunc", "glDepthMask", "glDepthRange", + "glDepthRangef", "glDepthRangeArrayv", "glDepthBoundsEXT", "glPatchParameteri", @@ -1191,6 +1192,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case DEPTH_RANGE: Serialise_glDepthRange(0, 0); break; + case DEPTH_RANGEF: + Serialise_glDepthRangef(0, 0); + break; case DEPTH_RANGEARRAY: Serialise_glDepthRangeArrayv(0, 0, NULL); break; diff --git a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp index 2b76d0d6e..919b37954 100644 --- a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp @@ -506,9 +506,28 @@ void WrappedOpenGL::glDepthRange(GLdouble nearVal, GLdouble farVal) } } +bool WrappedOpenGL::Serialise_glDepthRangef(GLfloat nearVal, GLfloat farVal) +{ + SERIALISE_ELEMENT(GLfloat, n, nearVal); + SERIALISE_ELEMENT(GLfloat, f, farVal); + + if(m_State <= EXECUTING) + m_Real.glDepthRangef(n, f); + + return true; +} + void WrappedOpenGL::glDepthRangef(GLfloat nearVal, GLfloat farVal) { - glDepthRange(nearVal, farVal); + m_Real.glDepthRangef(nearVal, farVal); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(DEPTH_RANGEF); + Serialise_glDepthRangef(nearVal, farVal); + + m_ContextRecord->AddChunk(scope.Get()); + } } bool WrappedOpenGL::Serialise_glDepthRangeArrayv(GLuint first, GLsizei count, const GLdouble *v)