From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/win32u/opengl.c | 1 + dlls/winex11.drv/opengl.c | 23 +++++++++++++++++++++++ include/wine/opengl_driver.h | 1 + 3 files changed, 25 insertions(+)
diff --git a/dlls/win32u/opengl.c b/dlls/win32u/opengl.c index fc0be5795d4..2f3645bcf28 100644 --- a/dlls/win32u/opengl.c +++ b/dlls/win32u/opengl.c @@ -469,6 +469,7 @@ static UINT egldrv_init_pixel_formats( UINT *onscreen_count ) for (i = 0, j = 0; i < count; i++) { funcs->p_eglGetConfigAttrib( egl->display, configs[i], EGL_RENDERABLE_TYPE, &render ); + if (egl->filter_config && !egl->filter_config( egl, configs[i] )) continue; if (render & EGL_OPENGL_BIT) configs[j++] = configs[i]; } count = j; diff --git a/dlls/winex11.drv/opengl.c b/dlls/winex11.drv/opengl.c index c4cc2b1fe1f..f02c6a7a6e8 100644 --- a/dlls/winex11.drv/opengl.c +++ b/dlls/winex11.drv/opengl.c @@ -463,10 +463,33 @@ done: return ret; }
+static BOOL x11drv_egl_filter_config( struct egl_platform *egl, EGLConfig config ) +{ + XVisualInfo *visuals; + XVisualInfo visual; + int count; + + funcs->p_eglGetConfigAttrib( egl->display, config, EGL_NATIVE_VISUAL_ID, (EGLint *)&visual.visualid ); + if (!(visuals = XGetVisualInfo( gdi_display, VisualIDMask, &visual, &count ))) return FALSE; + + /* Reject formats whose depth does not match the screen depth so that we + * can copy child windows on-screen using XCopyArea(). + * See x11drv_init_pixel_formats() for the same logic with GLX. */ + if (visuals->depth != default_visual.depth) + { + XFree( visuals ); + return FALSE; + } + + XFree( visuals ); + return TRUE; +} + static void x11drv_init_egl_platform( struct egl_platform *platform ) { platform->type = EGL_PLATFORM_X11_KHR; platform->native_display = gdi_display; + platform->filter_config = x11drv_egl_filter_config; egl = platform; }
diff --git a/include/wine/opengl_driver.h b/include/wine/opengl_driver.h index e9052392471..60117e03cc9 100644 --- a/include/wine/opengl_driver.h +++ b/include/wine/opengl_driver.h @@ -134,6 +134,7 @@ struct egl_platform EGLenum type; EGLNativeDisplayType native_display; BOOL force_pbuffer_formats; + BOOL (*filter_config)(struct egl_platform *platform, EGLConfig config);
/* filled by win32u after init_egl_platform */ EGLDeviceEXT device;