diff --git a/glamor/glamor.h b/glamor/glamor.h index 038d4d80dedccbe4fc3c790c0ef80ed65437f123..76ad84ed90d41957e42ee387879fe5a1f0c8f8b5 100644 --- a/glamor/glamor.h +++ b/glamor/glamor.h @@ -399,6 +399,8 @@ extern _X_EXPORT Bool struct gbm_bo *bo, Bool used_modifiers); +extern _X_EXPORT const char *glamor_egl_get_driver_name(ScreenPtr screen); + #endif extern _X_EXPORT void glamor_egl_screen_init(ScreenPtr screen, diff --git a/glamor/glamor_egl.c b/glamor/glamor_egl.c index 693bee6cff11a051786d2fcb781af857e98e7277..ea34501525ea2acc72f8da2d857cfa42c054718e 100644 --- a/glamor/glamor_egl.c +++ b/glamor/glamor_egl.c @@ -700,6 +700,22 @@ glamor_get_modifiers(ScreenPtr screen, uint32_t format, #endif } +_X_EXPORT const char * +glamor_egl_get_driver_name(ScreenPtr screen) +{ +#ifdef GLAMOR_HAS_EGL_QUERY_DRIVER + struct glamor_egl_screen_private *glamor_egl; + + glamor_egl = glamor_egl_get_screen_private(xf86ScreenToScrn(screen)); + + if (epoxy_has_egl_extension(glamor_egl->display, "EGL_MESA_query_driver")) + return eglGetDisplayDriverName(glamor_egl->display); +#endif + + return NULL; +} + + static Bool glamor_egl_destroy_pixmap(PixmapPtr pixmap) { diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h index ef1e70f87add41afc34dc6fd23b9b17b2f3058de..c590ffec41c116a97775101b28e27aa487ce1e35 100644 --- a/hw/xfree86/common/xf86Module.h +++ b/hw/xfree86/common/xf86Module.h @@ -74,7 +74,7 @@ * mask is 0xFFFF0000. */ #define ABI_ANSIC_VERSION SET_ABI_VERSION(0, 4) -#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(25, 0) +#define ABI_VIDEODRV_VERSION SET_ABI_VERSION(25, 1) #define ABI_XINPUT_VERSION SET_ABI_VERSION(24, 1) #define ABI_EXTENSION_VERSION SET_ABI_VERSION(10, 0) diff --git a/hw/xfree86/drivers/modesetting/dri2.c b/hw/xfree86/drivers/modesetting/dri2.c index ccb9d04c98d3bcf630adabbe2b5953c3723a24b8..e893da4227e981cc862f1c1137d8fafde66deb9b 100644 --- a/hw/xfree86/drivers/modesetting/dri2.c +++ b/hw/xfree86/drivers/modesetting/dri2.c @@ -1037,6 +1037,7 @@ ms_dri2_screen_init(ScreenPtr screen) ScrnInfoPtr scrn = xf86ScreenToScrn(screen); modesettingPtr ms = modesettingPTR(scrn); DRI2InfoRec info; + const char *driver_names[2] = { NULL, NULL }; if (!ms->glamor.supports_pixmap_import_export(screen)) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, @@ -1075,9 +1076,31 @@ ms_dri2_screen_init(ScreenPtr screen) info.DestroyBuffer2 = ms_dri2_destroy_buffer2; info.CopyRegion2 = ms_dri2_copy_region2; - /* These two will be filled in by dri2.c */ - info.numDrivers = 0; - info.driverNames = NULL; + /* Ask Glamor to obtain the DRI driver name via EGL_MESA_query_driver, */ + if (ms->glamor.egl_get_driver_name) + driver_names[0] = ms->glamor.egl_get_driver_name(screen); + + if (driver_names[0]) { + /* There is no VDPAU driver for Intel, fallback to the generic + * OpenGL/VAAPI va_gl backend to emulate VDPAU. Otherwise, + * guess that the DRI and VDPAU drivers have the same name. + */ + if (strcmp(driver_names[0], "i965") == 0 || + strcmp(driver_names[0], "iris") == 0) { + driver_names[1] = "va_gl"; + } else { + driver_names[1] = driver_names[0]; + } + + info.numDrivers = 2; + info.driverNames = driver_names; + } else { + /* EGL_MESA_query_driver was unavailable; let dri2.c select the + * driver and fill in these fields for us. + */ + info.numDrivers = 0; + info.driverNames = NULL; + } return DRI2ScreenInit(screen, &info); } diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index 6c7d7eaf0643bdc4143421d2c771f9b90799c9d5..de7280084ade8c8581d8e8cffe87d264e15772b6 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -762,6 +762,7 @@ bind_glamor_api(void *mod, modesettingPtr ms) ms->glamor.shareable_fd_from_pixmap = LoaderSymbolFromModule(mod, "glamor_shareable_fd_from_pixmap"); ms->glamor.supports_pixmap_import_export = LoaderSymbolFromModule(mod, "glamor_supports_pixmap_import_export"); ms->glamor.xv_init = LoaderSymbolFromModule(mod, "glamor_xv_init"); + ms->glamor.egl_get_driver_name = LoaderSymbolFromModule(mod, "glamor_egl_get_driver_name"); } static void diff --git a/hw/xfree86/drivers/modesetting/driver.h b/hw/xfree86/drivers/modesetting/driver.h index 5909829a042896e63e97d80d57679b2e587a0488..60e4aaa96bde4617b98bf9a3ddf8b53945debadb 100644 --- a/hw/xfree86/drivers/modesetting/driver.h +++ b/hw/xfree86/drivers/modesetting/driver.h @@ -155,6 +155,7 @@ typedef struct _modesettingRec { CARD32 *); Bool (*supports_pixmap_import_export)(ScreenPtr); XF86VideoAdaptorPtr (*xv_init)(ScreenPtr, int); + const char *(*egl_get_driver_name)(ScreenPtr); } glamor; } modesettingRec, *modesettingPtr; diff --git a/include/meson.build b/include/meson.build index 070178473834f9169bdee11a6c122ede021d60f0..a01cb1709cc96cb06ebb4b9b7b0ca6addd18d0f5 100644 --- a/include/meson.build +++ b/include/meson.build @@ -97,6 +97,8 @@ conf_data.set('HAVE_XSHMFENCE', xshmfence_dep.found()) conf_data.set('WITH_LIBDRM', libdrm_required) conf_data.set('GLAMOR_HAS_EGL_QUERY_DMABUF', epoxy_dep.found() and epoxy_dep.version().version_compare('>= 1.4.4')) +conf_data.set('GLAMOR_HAS_EGL_QUERY_DRIVER', + epoxy_dep.found() and epoxy_dep.version().version_compare('>= 1.5.4')) conf_data.set('GLXEXT', build_glx) conf_data.set('GLAMOR', build_glamor) conf_data.set('GLAMOR_HAS_GBM', gbm_dep.found())