From 8dbdd97a2f7f3a41c2a5c8951b23f3dddfaac824 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sat, 8 Nov 2014 12:14:21 +0000 Subject: [PATCH] Implement glSampleCoverage --- renderdoc/driver/gl/gl_common.h | 1 + renderdoc/driver/gl/gl_driver.cpp | 4 +++ renderdoc/driver/gl/gl_driver.h | 1 + renderdoc/driver/gl/gl_hookset.h | 1 + renderdoc/driver/gl/gl_hookset_defs.h | 2 ++ renderdoc/driver/gl/gl_renderstate.cpp | 8 ++++++ renderdoc/driver/gl/gl_renderstate.h | 2 ++ .../driver/gl/wrappers/gl_state_funcs.cpp | 26 +++++++++++++++++++ 8 files changed, 45 insertions(+) diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 4b7bfd13d..fd8f268ae 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -173,6 +173,7 @@ enum GLChunkType COLOR_MASK, COLOR_MASKI, SAMPLE_MASK, + SAMPLE_COVERAGE, DEPTH_FUNC, DEPTH_MASK, DEPTH_RANGE, diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index b94c71b5a..a6cb35527 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -126,6 +126,7 @@ const char *GLChunkNames[] = "glColorMask", "glColorMaski", "glSampleMaski", + "glSampleCoverage", "glDepthFunc", "glDepthMask", "glDepthRange", @@ -1652,6 +1653,9 @@ void WrappedOpenGL::ProcessChunk(uint64_t offset, GLChunkType context) case SAMPLE_MASK: Serialise_glSampleMaski(0, 0); break; + case SAMPLE_COVERAGE: + Serialise_glSampleCoverage(0.0f, 0); + break; case DEPTH_FUNC: Serialise_glDepthFunc(eGL_NONE); break; diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index 8f22f3cb4..ae93bb0ad 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -344,6 +344,7 @@ class WrappedOpenGL IMPLEMENT_FUNCTION_SERIALISED(void, glColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)); IMPLEMENT_FUNCTION_SERIALISED(void, glColorMaski(GLuint buf, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)); IMPLEMENT_FUNCTION_SERIALISED(void, glSampleMaski(GLuint maskNumber, GLbitfield mask)); + IMPLEMENT_FUNCTION_SERIALISED(void, glSampleCoverage(GLfloat value, GLboolean invert)); 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)); diff --git a/renderdoc/driver/gl/gl_hookset.h b/renderdoc/driver/gl/gl_hookset.h index 241155b0f..0a0e0ab9d 100644 --- a/renderdoc/driver/gl/gl_hookset.h +++ b/renderdoc/driver/gl/gl_hookset.h @@ -228,6 +228,7 @@ struct GLHookSet PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate; PFNGLCOLORMASKIPROC glColorMaski; PFNGLSAMPLEMASKIPROC glSampleMaski; + PFNGLSAMPLECOVERAGEPROC glSampleCoverage; PFNGLDEPTHRANGEPROC glDepthRange; PFNGLDEPTHRANGEFPROC glDepthRangef; PFNGLDEPTHRANGEARRAYVPROC glDepthRangeArrayv; diff --git a/renderdoc/driver/gl/gl_hookset_defs.h b/renderdoc/driver/gl/gl_hookset_defs.h index 4a4d52018..4525020fa 100644 --- a/renderdoc/driver/gl/gl_hookset_defs.h +++ b/renderdoc/driver/gl/gl_hookset_defs.h @@ -245,6 +245,7 @@ HookExtension(PFNGLSTENCILOPSEPARATEPROC, glStencilOpSeparate); \ HookExtension(PFNGLCOLORMASKIPROC, glColorMaski); \ HookExtension(PFNGLSAMPLEMASKIPROC, glSampleMaski); \ + HookExtension(PFNGLSAMPLECOVERAGEPROC, glSampleCoverage); \ HookExtension(PFNGLDEPTHRANGEPROC, glDepthRange); \ HookExtension(PFNGLDEPTHRANGEFPROC, glDepthRangef); \ HookExtension(PFNGLDEPTHRANGEARRAYVPROC, glDepthRangeArrayv); \ @@ -842,6 +843,7 @@ HookWrapper4(void, glStencilOpSeparate, GLenum, face, GLenum, sfail, GLenum, dpfail, GLenum, dppass); \ HookWrapper5(void, glColorMaski, GLuint, index, GLboolean, r, GLboolean, g, GLboolean, b, GLboolean, a); \ HookWrapper2(void, glSampleMaski, GLuint, maskNumber, GLbitfield, mask); \ + HookWrapper2(void, glSampleCoverage, GLfloat, value, GLboolean, invert); \ HookWrapper2(void, glDepthRange, GLdouble, near, GLdouble, far); \ HookWrapper2(void, glDepthRangef, GLfloat, n, GLfloat, f); \ HookWrapper3(void, glDepthRangeArrayv, GLuint, first, GLsizei, count, const GLdouble *, v); \ diff --git a/renderdoc/driver/gl/gl_renderstate.cpp b/renderdoc/driver/gl/gl_renderstate.cpp index bd452d957..75b1b802f 100644 --- a/renderdoc/driver/gl/gl_renderstate.cpp +++ b/renderdoc/driver/gl/gl_renderstate.cpp @@ -39,6 +39,7 @@ GLRenderState::~GLRenderState() void GLRenderState::FetchState() { + GLint boolread = 0; // TODO check GL_MAX_* // TODO check the extensions/core version for these is around @@ -216,6 +217,8 @@ void GLRenderState::FetchState() m_Real->glGetBooleanv(eGL_COLOR_WRITEMASK, &ColorMasks[i].red); m_Real->glGetIntegeri_v(eGL_SAMPLE_MASK_VALUE, 0, (GLint *)&SampleMask[0]); + m_Real->glGetIntegerv(eGL_SAMPLE_COVERAGE_VALUE, (GLint *)&SampleCoverage); + m_Real->glGetIntegerv(eGL_SAMPLE_COVERAGE_INVERT, (GLint *)&boolread); SampleCoverageInvert = (boolread != 0); m_Real->glGetFloatv(eGL_COLOR_CLEAR_VALUE, &ColorClearValue.red); @@ -425,6 +428,7 @@ void GLRenderState::ApplyState() m_Real->glColorMaski(i, ColorMasks[i].red, ColorMasks[i].green, ColorMasks[i].blue, ColorMasks[i].alpha); m_Real->glSampleMaski(0, (GLbitfield)SampleMask[0]); + m_Real->glSampleCoverage(SampleCoverage, SampleCoverageInvert ? GL_TRUE : GL_FALSE); m_Real->glClearColor(ColorClearValue.red, ColorClearValue.green, ColorClearValue.blue, ColorClearValue.alpha); @@ -483,6 +487,8 @@ void GLRenderState::Clear() RDCEraseEl(StencilBack); RDCEraseEl(ColorMasks); RDCEraseEl(SampleMask); + RDCEraseEl(SampleCoverage); + RDCEraseEl(SampleCoverageInvert); RDCEraseEl(ColorClearValue); RDCEraseEl(Hints); @@ -681,6 +687,8 @@ void GLRenderState::Serialise(LogState state, void *ctx, WrappedOpenGL *gl) m_pSerialiser->Serialise<4>("GL_COLOR_WRITEMASK", &ColorMasks[i].red); m_pSerialiser->Serialise<2>("GL_SAMPLE_MASK_VALUE", &SampleMask[0]); + m_pSerialiser->Serialise("GL_SAMPLE_COVERAGE_VALUE", SampleCoverage); + m_pSerialiser->Serialise("GL_SAMPLE_COVERAGE_INVERT", SampleCoverageInvert); m_pSerialiser->Serialise<4>("GL_COLOR_CLEAR_VALUE", &ColorClearValue.red); diff --git a/renderdoc/driver/gl/gl_renderstate.h b/renderdoc/driver/gl/gl_renderstate.h index 93fe791c9..676e8565e 100644 --- a/renderdoc/driver/gl/gl_renderstate.h +++ b/renderdoc/driver/gl/gl_renderstate.h @@ -191,6 +191,8 @@ struct GLRenderState } ColorMasks[8]; uint32_t SampleMask[2]; + float SampleCoverage; + bool SampleCoverageInvert; struct { diff --git a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp index 20df567c8..7c01bf40d 100644 --- a/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_state_funcs.cpp @@ -897,6 +897,32 @@ void WrappedOpenGL::glSampleMaski(GLuint maskNumber, GLbitfield mask) } } +bool WrappedOpenGL::Serialise_glSampleCoverage(GLfloat value, GLboolean invert) +{ + SERIALISE_ELEMENT(float, Value, value); + SERIALISE_ELEMENT(bool, Invert, invert != 0); + + if(m_State <= EXECUTING) + { + m_Real.glSampleCoverage(Value, Invert ? GL_TRUE : GL_FALSE); + } + + return true; +} + +void WrappedOpenGL::glSampleCoverage(GLfloat value, GLboolean invert) +{ + m_Real.glSampleCoverage(value, invert); + + if(m_State == WRITING_CAPFRAME) + { + SCOPED_SERIALISE_CONTEXT(SAMPLE_COVERAGE); + Serialise_glSampleCoverage(value, invert); + + m_ContextRecord->AddChunk(scope.Get()); + } +} + bool WrappedOpenGL::Serialise_glPatchParameteri(GLenum pname, GLint value) { SERIALISE_ELEMENT(GLenum, PName, pname);