From c63f44f0aa2f79701cb4a9768618fae5d34433aa Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 5 Jan 2015 02:15:00 +0000 Subject: [PATCH] Make sure to destroy GL debug context and associated resources --- renderdoc/driver/gl/gl_debug.cpp | 65 ++++++++++++++++++++++++- renderdoc/driver/gl/gl_replay.cpp | 6 +++ renderdoc/driver/gl/gl_replay.h | 2 + renderdoc/driver/gl/gl_replay_linux.cpp | 2 + renderdoc/driver/gl/gl_replay_win32.cpp | 4 +- 5 files changed, 76 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/gl/gl_debug.cpp b/renderdoc/driver/gl/gl_debug.cpp index d2149af0d..9399598a4 100644 --- a/renderdoc/driver/gl/gl_debug.cpp +++ b/renderdoc/driver/gl/gl_debug.cpp @@ -28,6 +28,8 @@ #include "maths/matrix.h" #include "maths/camera.h" +#include "data/glsl/debuguniforms.h" + #include "serialise/string_utils.h" GLuint GLReplay::CreateCShaderProgram(const char *csSrc) @@ -67,6 +69,8 @@ GLuint GLReplay::CreateCShaderProgram(const char *csSrc) RDCERR("Link error: %s", buffer); } + gl.glDetachShader(ret, cs); + gl.glDeleteShader(cs); return ret; @@ -115,14 +119,15 @@ GLuint GLReplay::CreateShaderProgram(const char *vsSrc, const char *psSrc) gl.glLinkProgram(ret); + gl.glDetachShader(ret, vs); + gl.glDetachShader(ret, fs); + gl.glDeleteShader(vs); gl.glDeleteShader(fs); return ret; } -#include "data/glsl/debuguniforms.h" - void GLReplay::InitDebugData() { if(m_pDriver == NULL) return; @@ -130,6 +135,7 @@ void GLReplay::InitDebugData() { uint64_t id = MakeOutputWindow(NULL, true); + m_DebugID = id; m_DebugCtx = &m_OutputWindows[id]; MakeCurrentReplayContext(m_DebugCtx); @@ -317,6 +323,61 @@ void GLReplay::InitDebugData() DebugData.replayQuadProg = CreateShaderProgram(DebugData.blitvsSource.c_str(), DebugData.genericfsSource.c_str()); } +void GLReplay::DeleteDebugData() +{ + MakeCurrentReplayContext(m_DebugCtx); + + WrappedOpenGL &gl = *m_pDriver; + + gl.glDeleteProgram(DebugData.blitProg); + + for(int i=0; i < 3; i++) + gl.glDeleteProgram(DebugData.texDisplayProg[i]); + + gl.glDeleteProgram(DebugData.checkerProg); + gl.glDeleteProgram(DebugData.genericProg); + gl.glDeleteProgram(DebugData.meshProg); + + gl.glDeleteBuffers(1, &DebugData.outlineStripVB); + gl.glDeleteVertexArrays(1, &DebugData.outlineStripVAO); + + gl.glDeleteSamplers(1, &DebugData.linearSampler); + gl.glDeleteSamplers(1, &DebugData.pointSampler); + gl.glDeleteSamplers(1, &DebugData.pointNoMipSampler); + gl.glDeleteBuffers(ARRAY_COUNT(DebugData.UBOs), DebugData.UBOs); + gl.glDeleteFramebuffers(1, &DebugData.pickPixelFBO); + gl.glDeleteTextures(1, &DebugData.pickPixelTex); + + gl.glDeleteVertexArrays(1, &DebugData.emptyVAO); + + for(int t=1; t <= RESTYPE_TEXTYPEMAX; t++) + { + // float, uint, sint + for(int i=0; i < 3; i++) + { + int idx = t; + if(i == 1) idx |= TEXDISPLAY_UINT_TEX; + if(i == 2) idx |= TEXDISPLAY_SINT_TEX; + + gl.glDeleteProgram(DebugData.minmaxTileProgram[idx]); + gl.glDeleteProgram(DebugData.histogramProgram[idx]); + + if(t == 1) + gl.glDeleteProgram(DebugData.minmaxResultProgram[i]); + } + } + + gl.glDeleteBuffers(1, &DebugData.minmaxTileResult); + gl.glDeleteBuffers(1, &DebugData.minmaxResult); + gl.glDeleteBuffers(1, &DebugData.histogramBuf); + + MakeCurrentReplayContext(&m_ReplayCtx); + + gl.glDeleteVertexArrays(1, &DebugData.meshVAO); + + gl.glDeleteProgram(DebugData.replayQuadProg); +} + bool GLReplay::GetMinMax(ResourceId texid, uint32_t sliceFace, uint32_t mip, uint32_t sample, float *minval, float *maxval) { if(m_pDriver->m_Textures.find(texid) == m_pDriver->m_Textures.end()) diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 3970dccb0..43553bb3d 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -27,6 +27,8 @@ #include "gl_driver.h" #include "gl_resources.h" +#include "data/glsl/debuguniforms.h" + #include "serialise/string_utils.h" GLReplay::GLReplay() @@ -42,6 +44,10 @@ GLReplay::GLReplay() void GLReplay::Shutdown() { + DeleteDebugData(); + + DestroyOutputWindow(m_DebugID); + CloseReplayContext(); delete m_pDriver; diff --git a/renderdoc/driver/gl/gl_replay.h b/renderdoc/driver/gl/gl_replay.h index 4a691eb91..8f5a22b67 100644 --- a/renderdoc/driver/gl/gl_replay.h +++ b/renderdoc/driver/gl/gl_replay.h @@ -218,6 +218,7 @@ class GLReplay : public IReplayDriver } DebugData; void InitDebugData(); + void DeleteDebugData(); GLuint CreateShaderProgram(const char *vs, const char *ps); GLuint CreateCShaderProgram(const char *cs); @@ -226,6 +227,7 @@ class GLReplay : public IReplayDriver void CreateOutputWindowBackbuffer(OutputWindow &outwin); GLWindowingData m_ReplayCtx; + int64_t m_DebugID; OutputWindow *m_DebugCtx; void MakeCurrentReplayContext(GLWindowingData *ctx); diff --git a/renderdoc/driver/gl/gl_replay_linux.cpp b/renderdoc/driver/gl/gl_replay_linux.cpp index ad2405b3c..1fdc517d7 100644 --- a/renderdoc/driver/gl/gl_replay_linux.cpp +++ b/renderdoc/driver/gl/gl_replay_linux.cpp @@ -64,6 +64,7 @@ void GLReplay::CloseReplayContext() { if(glXDestroyCtxProc) { + glXMakeContextCurrentProc(m_ReplayCtx.dpy, None, None, NULL); glXDestroyCtxProc(m_ReplayCtx.dpy, m_ReplayCtx.ctx); } } @@ -170,6 +171,7 @@ void GLReplay::DestroyOutputWindow(uint64_t id) OutputWindow &outw = it->second; + glXMakeContextCurrentProc(outw.dpy, None, None, NULL); glXDestroyCtxProc(outw.dpy, outw.ctx); m_OutputWindows.erase(it); diff --git a/renderdoc/driver/gl/gl_replay_win32.cpp b/renderdoc/driver/gl/gl_replay_win32.cpp index 3318bca86..86f5ab99b 100644 --- a/renderdoc/driver/gl/gl_replay_win32.cpp +++ b/renderdoc/driver/gl/gl_replay_win32.cpp @@ -61,6 +61,7 @@ void GLReplay::CloseReplayContext() { if(wglDeleteRC) { + wglMakeCurrentProc(NULL, NULL); wglDeleteRC(m_ReplayCtx.ctx); ReleaseDC(m_ReplayCtx.wnd, m_ReplayCtx.DC); ::DestroyWindow(m_ReplayCtx.wnd); @@ -198,7 +199,8 @@ void GLReplay::DestroyOutputWindow(uint64_t id) return; OutputWindow &outw = it->second; - + + wglMakeCurrentProc(NULL, NULL); wglDeleteRC(outw.ctx); ReleaseDC(outw.wnd, outw.DC);