From 7f533b6b297619c9bdbdddab9e39824969f0f890 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 28 Nov 2018 16:50:41 +0000 Subject: [PATCH] Refresh window parameters on SwapBuffers as well as MakeCurrent * There's no guarantee that MakeCurrent will always be called after a resize, the same context could be activated then left active. --- renderdoc/driver/gl/egl_hooks.cpp | 58 ++++++++++++++++-------- renderdoc/driver/gl/glx_dispatch_table.h | 2 + renderdoc/driver/gl/glx_hooks.cpp | 10 ++++ renderdoc/driver/gl/wgl_hooks.cpp | 32 +++++++++---- 4 files changed, 73 insertions(+), 29 deletions(-) diff --git a/renderdoc/driver/gl/egl_hooks.cpp b/renderdoc/driver/gl/egl_hooks.cpp index 0e46af6c1..3471c5992 100644 --- a/renderdoc/driver/gl/egl_hooks.cpp +++ b/renderdoc/driver/gl/egl_hooks.cpp @@ -72,6 +72,34 @@ public: return false; } + void RefreshWindowParameters(const GLWindowingData &data) + { + EGLDisplay display = data.egl_dpy; + EGLContext ctx = data.egl_ctx; + EGLSurface draw = data.egl_wnd; + + if(ctx && draw) + { + GLInitParams ¶ms = driver.GetInitParams(data); + + int height, width; + EGL.QuerySurface(display, draw, EGL_HEIGHT, &height); + EGL.QuerySurface(display, draw, EGL_WIDTH, &width); + + int colorspace = 0; + EGL.QuerySurface(display, draw, EGL_GL_COLORSPACE, &colorspace); + // GL_SRGB8_ALPHA8 is specified as color-renderable, unlike GL_SRGB8. + bool isSRGB = params.colorBits == 32 && colorspace == EGL_GL_COLORSPACE_SRGB; + + bool isYFlipped = IsYFlipped(display, draw); + + params.width = width; + params.height = height; + params.isSRGB = isSRGB; + params.isYFlipped = isYFlipped; + } + } + } eglhook; HOOK_EXPORT EGLDisplay EGLAPIENTRY eglGetDisplay_renderdoc_hooked(EGLNativeDisplayType display) @@ -300,26 +328,7 @@ HOOK_EXPORT EGLBoolean EGLAPIENTRY eglMakeCurrent_renderdoc_hooked(EGLDisplay di eglhook.driver.ActivateContext(data); - if(ctx && draw) - { - GLInitParams ¶ms = eglhook.driver.GetInitParams(data); - - int height, width; - EGL.QuerySurface(display, draw, EGL_HEIGHT, &height); - EGL.QuerySurface(display, draw, EGL_WIDTH, &width); - - int colorspace = 0; - EGL.QuerySurface(display, draw, EGL_GL_COLORSPACE, &colorspace); - // GL_SRGB8_ALPHA8 is specified as color-renderable, unlike GL_SRGB8. - bool isSRGB = params.colorBits == 32 && colorspace == EGL_GL_COLORSPACE_SRGB; - - bool isYFlipped = eglhook.IsYFlipped(display, draw); - - params.width = width; - params.height = height; - params.isSRGB = isSRGB; - params.isYFlipped = isYFlipped; - } + eglhook.RefreshWindowParameters(data); } return ret; @@ -339,7 +348,16 @@ HOOK_EXPORT EGLBoolean EGLAPIENTRY eglSwapBuffers_renderdoc_hooked(EGLDisplay dp eglhook.driver.SetDriverType(RDCDriver::OpenGLES); if(!eglhook.driver.UsesVRFrameMarkers()) + { + GLWindowingData data; + data.egl_dpy = dpy; + data.egl_wnd = surface; + data.egl_ctx = EGL.GetCurrentContext(); + + eglhook.RefreshWindowParameters(data); + eglhook.driver.SwapBuffers(surface); + } return EGL.SwapBuffers(dpy, surface); } diff --git a/renderdoc/driver/gl/glx_dispatch_table.h b/renderdoc/driver/gl/glx_dispatch_table.h index b81738ee0..0f3b86916 100644 --- a/renderdoc/driver/gl/glx_dispatch_table.h +++ b/renderdoc/driver/gl/glx_dispatch_table.h @@ -37,6 +37,7 @@ typedef int (*PFN_glXQueryContext)(Display *dpy, GLXContext ctx, int attribute, typedef Bool (*PFN_glXIsDirect)(Display *dpy, GLXContext ctx); typedef __GLXextFuncPtr (*PFN_glXGetProcAddress)(const GLubyte *); typedef __GLXextFuncPtr (*PFN_glXGetProcAddressARB)(const GLubyte *); +typedef GLXContext (*PFN_glXGetCurrentContext)(); typedef const char *(*PFN_glXQueryExtensionsString)(Display *dpy, int screen); typedef PFNGLXGETVISUALFROMFBCONFIGPROC PFN_glXGetVisualFromFBConfig; typedef PFNGLXMAKECONTEXTCURRENTPROC PFN_glXMakeContextCurrent; @@ -74,6 +75,7 @@ typedef void (*PFN_glEnd)(); FUNC(glXDestroyWindow); #define GLX_NONHOOKED_SYMBOLS(FUNC) \ + FUNC(glXGetCurrentContext); \ FUNC(glXGetConfig); \ FUNC(glXQueryContext); \ FUNC(glXIsDirect); \ diff --git a/renderdoc/driver/gl/glx_hooks.cpp b/renderdoc/driver/gl/glx_hooks.cpp index 533e55784..b15d697f7 100644 --- a/renderdoc/driver/gl/glx_hooks.cpp +++ b/renderdoc/driver/gl/glx_hooks.cpp @@ -435,6 +435,16 @@ HOOK_EXPORT void glXSwapBuffers_renderdoc_hooked(Display *dpy, GLXDrawable drawa SCOPED_LOCK(glLock); + { + GLWindowingData data; + data.dpy = dpy; + data.wnd = drawable; + data.ctx = GLX.glXGetCurrentContext(); + data.cfg = NULL; + + glxhook.UpdateWindowSize(data, dpy, drawable); + } + glxhook.driver.SwapBuffers((void *)drawable); GLX.glXSwapBuffers(dpy, drawable); diff --git a/renderdoc/driver/gl/wgl_hooks.cpp b/renderdoc/driver/gl/wgl_hooks.cpp index a878e6ec6..210ed5f2a 100644 --- a/renderdoc/driver/gl/wgl_hooks.cpp +++ b/renderdoc/driver/gl/wgl_hooks.cpp @@ -47,6 +47,7 @@ public: std::set contexts; + void RefreshWindowParameters(const GLWindowingData &data); void ProcessSwapBuffers(HDC dc); void PopulateFromContext(HDC dc, HGLRC rc); GLInitParams GetInitParamsForDC(HDC dc); @@ -137,6 +138,19 @@ GLInitParams WGLHook::GetInitParamsForDC(HDC dc) return ret; } +void WGLHook::RefreshWindowParameters(const GLWindowingData &data) +{ + if(haveContextCreation && data.ctx && data.wnd) + { + RECT r; + GetClientRect(data.wnd, &r); + + GLInitParams ¶ms = driver.GetInitParams(data); + params.width = r.right - r.left; + params.height = r.bottom - r.top; + } +} + void WGLHook::ProcessSwapBuffers(HDC dc) { HWND w = WindowFromDC(dc); @@ -145,6 +159,13 @@ void WGLHook::ProcessSwapBuffers(HDC dc) if(w != NULL && haveContextCreation && !swapRecurse) { + GLWindowingData data; + data.DC = dc; + data.wnd = w; + data.ctx = WGL.wglGetCurrentContext(); + + RefreshWindowParameters(data); + { SCOPED_LOCK(glLock); driver.SwapBuffers(w); @@ -369,17 +390,10 @@ static BOOL WINAPI wglMakeCurrent_hooked(HDC dc, HGLRC rc) data.wnd = WindowFromDC(dc); data.ctx = rc; + wglhook.RefreshWindowParameters(data); + if(wglhook.haveContextCreation && data.ctx && data.wnd) - { - RECT r; - GetClientRect(data.wnd, &r); - wglhook.driver.ActivateContext(data); - - GLInitParams ¶ms = wglhook.driver.GetInitParams(data); - params.width = r.right - r.left; - params.height = r.bottom - r.top; - } } SetLastError(err);