diff --git a/renderdoc/driver/gl/egl_hooks.cpp b/renderdoc/driver/gl/egl_hooks.cpp index de037bdb5..0061cc2cf 100644 --- a/renderdoc/driver/gl/egl_hooks.cpp +++ b/renderdoc/driver/gl/egl_hooks.cpp @@ -535,6 +535,12 @@ static void EGLHooked(void *handle) EGL_NONHOOKED_SYMBOLS(EGL_FETCH) #undef EGL_FETCH +#if ENABLED(RDOC_WIN32) + // On windows we completely erase all GL function pointers. These might point into opengl32.dll + // which is not what we want to call when we're using a libEGL emulator + RDCEraseEl(GL); +#endif + // Now that libEGL is loaded, we can immediately fill out any missing functions that weren't // library hooked by calling eglGetProcAddress. GL.PopulateWithCallback([](const char *funcName) { diff --git a/renderdoc/driver/gl/wgl_hooks.cpp b/renderdoc/driver/gl/wgl_hooks.cpp index 1d5681f08..6d070816b 100644 --- a/renderdoc/driver/gl/wgl_hooks.cpp +++ b/renderdoc/driver/gl/wgl_hooks.cpp @@ -534,6 +534,11 @@ void WGLHook::RegisterHooks() { RDCLOG("Registering WGL hooks"); + // we load GL here to ensure that it is loaded by the time that we end hook registration and apply + // any callbacks. That ensures that it doesn't get loaded later e.g. while we're in the middle of + // loading libEGL, and break due to recursive calls. + LoadLibraryA("opengl32.dll"); + LibraryHooks::RegisterLibraryHook("opengl32.dll", &WGLHooked); LibraryHooks::RegisterLibraryHook("gdi32.dll", NULL); LibraryHooks::RegisterLibraryHook("user32.dll", NULL);