diff --git a/renderdoc/driver/gl/gl_hooks_egl.cpp b/renderdoc/driver/gl/gl_hooks_egl.cpp index afabbfc41..ac6f64609 100644 --- a/renderdoc/driver/gl/gl_hooks_egl.cpp +++ b/renderdoc/driver/gl/gl_hooks_egl.cpp @@ -327,7 +327,7 @@ __attribute__((visibility("default"))) EGLBoolean eglMakeCurrent(EGLDisplay disp { eglhooks.m_Contexts.insert(ctx); - eglhooks.PopulateHooks(); + SharedCheckContext(); } GLWindowingData data; @@ -435,7 +435,7 @@ bool EGLHook::CreateHooks(const char *libName) return true; } - bool success = SetupHooks(); + bool success = PopulateHooks(); if(!success) return false; @@ -449,6 +449,9 @@ bool EGLHook::PopulateHooks() { SetupHooks(); + if(m_PopulatedHooks) + return true; + // dlsym can return GL symbols during a GLES context bool dlsymFirst = false; @@ -457,12 +460,14 @@ bool EGLHook::PopulateHooks() dlsymFirst = true; #endif - return SharedPopulateHooks(dlsymFirst, [](const char *funcName) { + m_PopulatedHooks = SharedPopulateHooks(dlsymFirst, [](const char *funcName) { // on some android devices we need to hook dlsym, but eglGetProcAddress might call dlsym so we // need to ensure we return the 'real' pointers PosixScopedSuppressHooking suppress; return (void *)eglGetProcAddress(funcName); }); + + return m_PopulatedHooks; } const GLHookSet &GetRealGLFunctionsEGL() diff --git a/renderdoc/driver/gl/gl_hooks_linux.cpp b/renderdoc/driver/gl/gl_hooks_linux.cpp index ab202b50d..19ebbcb2a 100644 --- a/renderdoc/driver/gl/gl_hooks_linux.cpp +++ b/renderdoc/driver/gl/gl_hooks_linux.cpp @@ -647,6 +647,8 @@ __attribute__((visibility("default"))) Bool glXMakeCurrent(Display *dpy, GLXDraw glhooks.m_Contexts.insert(ctx); glhooks.PopulateHooks(); + + SharedCheckContext(); } GLWindowingData data; @@ -674,6 +676,8 @@ __attribute__((visibility("default"))) Bool glXMakeContextCurrent(Display *dpy, glhooks.m_Contexts.insert(ctx); glhooks.PopulateHooks(); + + SharedCheckContext(); } GLWindowingData data; diff --git a/renderdoc/driver/gl/gl_hooks_linux_shared.cpp b/renderdoc/driver/gl/gl_hooks_linux_shared.cpp index 62f37328c..d711effe2 100644 --- a/renderdoc/driver/gl/gl_hooks_linux_shared.cpp +++ b/renderdoc/driver/gl/gl_hooks_linux_shared.cpp @@ -1252,14 +1252,18 @@ bool SharedPopulateHooks(bool dlsymFirst, void *(*lookupFunc)(const char *)) DLLExportHooks(); HookCheckGLExtensions(); + + return true; +} + +void SharedCheckContext() +{ CheckExtensions(GL); // see gl_emulated.cpp glEmulate::EmulateUnsupportedFunctions(&GL); glEmulate::EmulateRequiredExtensions(&GL); - - return true; } void PosixHookFunctions() diff --git a/renderdoc/driver/gl/gl_hooks_linux_shared.h b/renderdoc/driver/gl/gl_hooks_linux_shared.h index d9e459e23..9b742096c 100644 --- a/renderdoc/driver/gl/gl_hooks_linux_shared.h +++ b/renderdoc/driver/gl/gl_hooks_linux_shared.h @@ -32,6 +32,7 @@ void CloneDisplay(Display *dpy); void *SharedLookupFuncPtr(const char *func, void *realFunc); bool SharedPopulateHooks(bool dlsymFirst, void *(*lookupFunc)(const char *)); +void SharedCheckContext(); void PosixHookFunctions(); extern GLHookSet GL;