diff --git a/renderdoc/driver/gl/egl_hooks.cpp b/renderdoc/driver/gl/egl_hooks.cpp index 4f3bc7af6..d97b96e28 100644 --- a/renderdoc/driver/gl/egl_hooks.cpp +++ b/renderdoc/driver/gl/egl_hooks.cpp @@ -520,6 +520,8 @@ EGL_PASSTHRU_0(EGLContext, eglGetCurrentContext) static void EGLHooked(void *handle) { + RDCDEBUG("EGL library hooked"); + // store the handle for any pass-through implementations that need to look up their onward // pointers eglhook.handle = handle; diff --git a/renderdoc/driver/gl/glx_hooks.cpp b/renderdoc/driver/gl/glx_hooks.cpp index 1cfe05a13..1f1fb63b2 100644 --- a/renderdoc/driver/gl/glx_hooks.cpp +++ b/renderdoc/driver/gl/glx_hooks.cpp @@ -618,8 +618,10 @@ GLX_PASSTHRU_3(GLXPbuffer, glXCreatePbuffer, Display *, dpy, GLXFBConfig, config attrib_list); GLX_PASSTHRU_2(void, glXDestroyPbuffer, Display *, dpy, GLXPbuffer, pbuf); -static void GLHooked(void *handle) +static void GLXHooked(void *handle) { + RDCDEBUG("GLX library hooked"); + // store the handle for any pass-through implementations that need to look up their onward // pointers glxhook.handle = handle; @@ -633,6 +635,18 @@ static void GLHooked(void *handle) GLX_NONHOOKED_SYMBOLS(GLX_FETCH) #undef GLX_FETCH +// fetch any functions that weren't directly exported +#define GPA_FUNC(func) \ + if(!GLX.func && GLX.glXGetProcAddressARB) \ + GLX.func = (CONCAT(PFN_, func))GLX.glXGetProcAddressARB((const GLubyte *)STRINGIZE(func)); \ + \ + if(!GLX.func && GLX.glXGetProcAddress) \ + GLX.func = (CONCAT(PFN_, func))GLX.glXGetProcAddress((const GLubyte *)STRINGIZE(func)); + + GLX_HOOKED_SYMBOLS(GPA_FUNC) + GLX_NONHOOKED_SYMBOLS(GPA_FUNC) +#undef GPA_FUNC + // Now that libGL is loaded, we can immediately fill out any missing functions that weren't // library hooked by calling eglGetProcAddress. GL.PopulateWithCallback([](const char *funcName) -> void * { @@ -657,8 +671,8 @@ void GLXHook::RegisterHooks() RDCLOG("Registering GLX hooks"); // register library hooks - LibraryHooks::RegisterLibraryHook("libGL.so", &GLHooked); - LibraryHooks::RegisterLibraryHook("libGL.so.1", &GLHooked); + LibraryHooks::RegisterLibraryHook("libGL.so", &GLXHooked); + LibraryHooks::RegisterLibraryHook("libGL.so.1", &GLXHooked); // register EGL hooks #define GLX_REGISTER(func) \ diff --git a/renderdoc/driver/gl/glx_platform.cpp b/renderdoc/driver/gl/glx_platform.cpp index 6cb1b0a28..aedde8ee3 100644 --- a/renderdoc/driver/gl/glx_platform.cpp +++ b/renderdoc/driver/gl/glx_platform.cpp @@ -435,7 +435,6 @@ GLPlatform &GetGLPlatform() bool GLXDispatchTable::PopulateForReplay() { RDCASSERT(RenderDoc::Inst().IsReplayApp()); - GetGLHandle(); void *handle = GetGLHandle(); diff --git a/renderdoc/driver/gl/wgl_hooks.cpp b/renderdoc/driver/gl/wgl_hooks.cpp index 6d070816b..f3221a4e9 100644 --- a/renderdoc/driver/gl/wgl_hooks.cpp +++ b/renderdoc/driver/gl/wgl_hooks.cpp @@ -518,6 +518,8 @@ static PROC WINAPI wglGetProcAddress_hooked(const char *func) static void WGLHooked(void *handle) { + RDCDEBUG("WGL library hooked"); + // as a hook callback this is only called while capturing RDCASSERT(!RenderDoc::Inst().IsReplayApp());