From 5cda6a8d65df102d63e6c4ca7aad015bf518b6b8 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 31 Jan 2018 22:08:16 +0000 Subject: [PATCH] Refactor hook populating out to separate from context checking * On EGL we want to populate our hooks immediately so we have them ready before anything is used, and it's valid because eglGetProcAddress is spec'd to return function pointers that can be used with any context. * Then later when we have a context we can check extensions and emulate. --- renderdoc/driver/gl/gl_hooks_egl.cpp | 11 ++++++++--- renderdoc/driver/gl/gl_hooks_linux.cpp | 4 ++++ renderdoc/driver/gl/gl_hooks_linux_shared.cpp | 8 ++++++-- renderdoc/driver/gl/gl_hooks_linux_shared.h | 1 + 4 files changed, 19 insertions(+), 5 deletions(-) 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;