From 2349fe4c05111a9095e0f70ddbcf326b697e1451 Mon Sep 17 00:00:00 2001 From: michaelrgb Date: Fri, 24 Nov 2017 11:35:08 +0000 Subject: [PATCH] Android replay load EGL symbols from libEGL.so instead of RTLD_NEXT. For GLES only get symbols from eglGetProcAddress and not dlsym, to prevent getting GL symbols. --- renderdoc/driver/gl/gl_hooks_egl.cpp | 4 +++- renderdoc/driver/gl/gl_hooks_linux.cpp | 5 +++-- renderdoc/driver/gl/gl_hooks_linux_shared.cpp | 13 +++++++------ renderdoc/driver/gl/gl_hooks_linux_shared.h | 2 +- renderdoc/driver/gl/gl_replay_egl.cpp | 6 +++++- 5 files changed, 19 insertions(+), 11 deletions(-) diff --git a/renderdoc/driver/gl/gl_hooks_egl.cpp b/renderdoc/driver/gl/gl_hooks_egl.cpp index 28b8b96b7..46df746e0 100644 --- a/renderdoc/driver/gl/gl_hooks_egl.cpp +++ b/renderdoc/driver/gl/gl_hooks_egl.cpp @@ -426,7 +426,9 @@ bool EGLHook::PopulateHooks() { SetupHooks(); - return SharedPopulateHooks([](const char *funcName) { return (void *)eglGetProcAddress(funcName); }); + return SharedPopulateHooks( + false, // dlsym can return GL symbols during a GLES context + [](const char *funcName) { return (void *)eglGetProcAddress(funcName); }); } const GLHookSet &GetRealGLFunctionsEGL() diff --git a/renderdoc/driver/gl/gl_hooks_linux.cpp b/renderdoc/driver/gl/gl_hooks_linux.cpp index 648213faa..4b45f1a92 100644 --- a/renderdoc/driver/gl/gl_hooks_linux.cpp +++ b/renderdoc/driver/gl/gl_hooks_linux.cpp @@ -810,8 +810,9 @@ bool OpenGLHook::PopulateHooks() glXGetProcAddress((const GLubyte *)"glXCreateContextAttribsARB"); - return SharedPopulateHooks( - [](const char *funcName) { return (void *)glXGetProcAddress((const GLubyte *)funcName); }); + return SharedPopulateHooks(true, [](const char *funcName) { + return (void *)glXGetProcAddress((const GLubyte *)funcName); + }); } const GLHookSet &GetRealGLFunctions() diff --git a/renderdoc/driver/gl/gl_hooks_linux_shared.cpp b/renderdoc/driver/gl/gl_hooks_linux_shared.cpp index 7351ed383..4dc2f61e9 100644 --- a/renderdoc/driver/gl/gl_hooks_linux_shared.cpp +++ b/renderdoc/driver/gl/gl_hooks_linux_shared.cpp @@ -1037,14 +1037,15 @@ void *SharedLookupFuncPtr(const char *func, void *realFunc) return NULL; } -bool SharedPopulateHooks(void *(*lookupFunc)(const char *)) +bool SharedPopulateHooks(bool dlsymFirst, void *(*lookupFunc)(const char *)) { #undef HookInit -#define HookInit(function) \ - if(GL.function == NULL) \ - { \ - GL.function = (CONCAT(function, _hooktype))dlsym(libGLdlsymHandle, STRINGIZE(function)); \ - lookupFunc((const char *)STRINGIZE(function)); \ +#define HookInit(function) \ + if(GL.function == NULL) \ + { \ + if(dlsymFirst) \ + GL.function = (CONCAT(function, _hooktype))dlsym(libGLdlsymHandle, STRINGIZE(function)); \ + lookupFunc((const char *)STRINGIZE(function)); \ } // cheeky diff --git a/renderdoc/driver/gl/gl_hooks_linux_shared.h b/renderdoc/driver/gl/gl_hooks_linux_shared.h index 9feeea9c7..d304e53ca 100644 --- a/renderdoc/driver/gl/gl_hooks_linux_shared.h +++ b/renderdoc/driver/gl/gl_hooks_linux_shared.h @@ -31,7 +31,7 @@ void CloneDisplay(Display *dpy); #endif void *SharedLookupFuncPtr(const char *func, void *realFunc); -bool SharedPopulateHooks(void *(*lookupFunc)(const char *)); +bool SharedPopulateHooks(bool dlsymFirst, void *(*lookupFunc)(const char *)); extern GLHookSet GL; extern WrappedOpenGL *m_GLDriver; diff --git a/renderdoc/driver/gl/gl_replay_egl.cpp b/renderdoc/driver/gl/gl_replay_egl.cpp index 5885aadf3..e9b948163 100644 --- a/renderdoc/driver/gl/gl_replay_egl.cpp +++ b/renderdoc/driver/gl/gl_replay_egl.cpp @@ -27,6 +27,7 @@ #include #include "serialise/rdcfile.h" #include "gl_driver.h" +#include "gl_hooks_linux_shared.h" #include "gl_library_egl.h" #include "gl_resources.h" @@ -41,7 +42,10 @@ ReplayStatus GLES_CreateReplayDevice(RDCFile *rdc, IReplayDriver **driver) if(!egl.IsInitialized()) { - bool load_ok = egl.LoadSymbolsFrom(RTLD_NEXT); +#if ENABLED(RDOC_ANDROID) + libGLdlsymHandle = dlopen("libEGL.so", RTLD_NOW); +#endif + bool load_ok = egl.LoadSymbolsFrom(libGLdlsymHandle); if(!load_ok) {