From 50919f5cfaa8cb840f307ca11431f09e7df43b19 Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 1 Aug 2022 20:38:02 +0100 Subject: [PATCH] Fix wrong API being used for cloned child GL contexts --- renderdoc/driver/gl/cgl_platform.cpp | 1 + renderdoc/driver/gl/egl_platform.cpp | 1 + renderdoc/driver/gl/gl_common.h | 2 ++ renderdoc/driver/gl/gl_driver.cpp | 8 +++++++- renderdoc/driver/gl/gl_driver.h | 2 +- renderdoc/driver/gl/glx_platform.cpp | 3 ++- renderdoc/driver/gl/wgl_platform.cpp | 3 ++- 7 files changed, 16 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/gl/cgl_platform.cpp b/renderdoc/driver/gl/cgl_platform.cpp index 51340cdc0..5fdf6e6a5 100644 --- a/renderdoc/driver/gl/cgl_platform.cpp +++ b/renderdoc/driver/gl/cgl_platform.cpp @@ -213,6 +213,7 @@ class CGLPlatform : public GLPlatform return ret; } + void SetDriverType(RDCDriver api) {} RDResult InitialiseAPI(GLWindowingData &replayContext, RDCDriver api, bool debug) { RDCASSERT(api == RDCDriver::OpenGL); diff --git a/renderdoc/driver/gl/egl_platform.cpp b/renderdoc/driver/gl/egl_platform.cpp index af69b01c4..710df587e 100644 --- a/renderdoc/driver/gl/egl_platform.cpp +++ b/renderdoc/driver/gl/egl_platform.cpp @@ -371,6 +371,7 @@ class EGLPlatform : public GLPlatform } bool PopulateForReplay() { return EGL.PopulateForReplay(); } + void SetDriverType(RDCDriver api) { m_API = api; } RDResult InitialiseAPI(GLWindowingData &replayContext, RDCDriver api, bool debug) { Display *xlibDisplay = RenderDoc::Inst().GetGlobalEnvironment().xlibDisplay; diff --git a/renderdoc/driver/gl/gl_common.h b/renderdoc/driver/gl/gl_common.h index 80da34eca..487280cca 100644 --- a/renderdoc/driver/gl/gl_common.h +++ b/renderdoc/driver/gl/gl_common.h @@ -324,6 +324,7 @@ struct GLPlatform virtual bool CanCreateGLContext() = 0; virtual bool CanCreateGLESContext() = 0; virtual bool PopulateForReplay() = 0; + virtual void SetDriverType(RDCDriver api) = 0; virtual RDResult InitialiseAPI(GLWindowingData &replayContext, RDCDriver api, bool debug) = 0; virtual void *GetReplayFunction(const char *funcname) = 0; }; @@ -349,6 +350,7 @@ class GLDummyPlatform : public GLPlatform virtual bool CanCreateGLContext() { return true; } virtual bool CanCreateGLESContext() { return true; } virtual bool PopulateForReplay() { return true; } + virtual void SetDriverType(RDCDriver api) {} virtual RDResult InitialiseAPI(GLWindowingData &replayContext, RDCDriver api, bool debug) { return ResultCode::Succeeded; diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 84017e3ca..95d76b15d 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -613,7 +613,7 @@ WrappedOpenGL::WrappedOpenGL(GLPlatform &platform) BuildGLExtensions(); BuildGLESExtensions(); // by default we assume OpenGL driver - SetDriverType(RDCDriver::OpenGL); + m_DriverType = RDCDriver::OpenGL; m_Replay = new GLReplay(this); @@ -978,6 +978,12 @@ WrappedOpenGL::~WrappedOpenGL() delete m_Replay; } +void WrappedOpenGL::SetDriverType(RDCDriver type) +{ + m_DriverType = type; + m_Platform.SetDriverType(m_DriverType); +} + ContextPair &WrappedOpenGL::GetCtx() { GLContextTLSData *ret = (GLContextTLSData *)Threading::GetTLSValue(m_CurCtxDataTLS); diff --git a/renderdoc/driver/gl/gl_driver.h b/renderdoc/driver/gl/gl_driver.h index cb17b4d7a..72ce4509b 100644 --- a/renderdoc/driver/gl/gl_driver.h +++ b/renderdoc/driver/gl/gl_driver.h @@ -623,7 +623,7 @@ public: CaptureState GetState() { return m_State; } GLReplay *GetReplay() { return m_Replay; } WriteSerialiser &GetSerialiser() { return m_ScratchSerialiser; } - void SetDriverType(RDCDriver type) { m_DriverType = type; } + void SetDriverType(RDCDriver type); bool isGLESMode() { return m_DriverType == RDCDriver::OpenGLES; } RDCDriver GetDriverType() { return m_DriverType; } ContextPair &GetCtx(); diff --git a/renderdoc/driver/gl/glx_platform.cpp b/renderdoc/driver/gl/glx_platform.cpp index 4986817d3..926ed7cf1 100644 --- a/renderdoc/driver/gl/glx_platform.cpp +++ b/renderdoc/driver/gl/glx_platform.cpp @@ -50,7 +50,7 @@ void *GetGLHandle() class GLXPlatform : public GLPlatform { - RDCDriver m_API = RDCDriver::OpenGLES; + RDCDriver m_API = RDCDriver::OpenGL; bool MakeContextCurrent(GLWindowingData data) { @@ -336,6 +336,7 @@ class GLXPlatform : public GLPlatform } bool PopulateForReplay() { return GLX.PopulateForReplay(); } + void SetDriverType(RDCDriver api) { m_API = api; } RDResult InitialiseAPI(GLWindowingData &replayContext, RDCDriver api, bool debug) { // force debug in development builds diff --git a/renderdoc/driver/gl/wgl_platform.cpp b/renderdoc/driver/gl/wgl_platform.cpp index 35b2dd2ed..f5fb3c01a 100644 --- a/renderdoc/driver/gl/wgl_platform.cpp +++ b/renderdoc/driver/gl/wgl_platform.cpp @@ -29,7 +29,7 @@ class WGLPlatform : public GLPlatform { - RDCDriver m_API = RDCDriver::OpenGLES; + RDCDriver m_API = RDCDriver::OpenGL; bool MakeContextCurrent(GLWindowingData data) { @@ -371,6 +371,7 @@ class WGLPlatform : public GLPlatform } bool PopulateForReplay() { return WGL.PopulateForReplay(); } + void SetDriverType(RDCDriver api) { m_API = api; } RDResult InitialiseAPI(GLWindowingData &replayContext, RDCDriver api, bool debug) { // force debug in development builds