From 8f6fca89aa1812b03da6d9f7fac3966955abc41e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 30 Aug 2024 12:08:48 -0400 Subject: [PATCH] meson: delete dri3 build option this existed for historical reasons, but realistically now it should be possible to build mesa with dri3 always enabled. additionally, this check was often used as a substitute for having drm functionality, which is sort of similar but also not really a direct match this simplifies a bunch of conditionals and prevents users from footgunnning themselves into orbit Reviewed-by: Adam Jackson Reviewed-by: Eric Engestrom Part-of: --- .gitlab-ci/build/gitlab-ci.yml | 10 ---- meson.build | 53 +++++++------------ meson_options.txt | 7 --- src/egl/drivers/dri2/egl_dri2.h | 4 +- src/egl/drivers/dri2/platform_x11.c | 23 ++++---- src/egl/meson.build | 2 +- src/gallium/auxiliary/meson.build | 4 +- src/gallium/auxiliary/vl/vl_winsys.h | 4 +- src/gallium/frontends/dri/meson.build | 2 +- src/gbm/backends/dri/gbm_dri.c | 2 +- src/gbm/main/backend.c | 4 +- src/glx/dri_common_query_renderer.c | 5 -- src/glx/drisw_glx.c | 2 +- src/glx/glxclient.h | 2 +- src/glx/glxext.c | 6 +-- src/glx/meson.build | 2 +- src/vulkan/wsi/wsi_common.c | 4 +- src/vulkan/wsi/wsi_common_x11.c | 75 ++++++++++++++++----------- src/x11/meson.build | 2 +- 19 files changed, 94 insertions(+), 119 deletions(-) diff --git a/.gitlab-ci/build/gitlab-ci.yml b/.gitlab-ci/build/gitlab-ci.yml index 622063d1ea7..dea9d42e267 100644 --- a/.gitlab-ci/build/gitlab-ci.yml +++ b/.gitlab-ci/build/gitlab-ci.yml @@ -96,7 +96,6 @@ debian-testing: -D glvnd=disabled -D platforms=x11,wayland GALLIUM_ST: > - -D dri3=enabled -D gallium-nine=true -D gallium-va=enabled -D gallium-rusticl=true @@ -196,7 +195,6 @@ debian-testing-msan: -D glvnd=disabled -D platforms=x11,wayland GALLIUM_ST: > - -D dri3=enabled -D gallium-extra-hud=true -D gallium-vdpau=enabled -D gallium-omx=bellagio @@ -262,7 +260,6 @@ debian-release: -D glvnd=disabled -D platforms=x11,wayland GALLIUM_ST: > - -D dri3=enabled -D gallium-extra-hud=true -D gallium-vdpau=enabled -D gallium-omx=disabled @@ -307,7 +304,6 @@ alpine-build-testing: -D platforms=wayland GALLIUM_DRIVERS: "crocus,etnaviv,freedreno,iris,lima,nouveau,panfrost,r300,r600,radeonsi,svga,llvmpipe,softpipe,tegra,v3d,vc4,virgl,zink" GALLIUM_ST: > - -D dri3=enabled -D gallium-extra-hud=true -D gallium-vdpau=disabled -D gallium-omx=disabled @@ -359,7 +355,6 @@ fedora-release: -D teflon=true GALLIUM_DRIVERS: "crocus,etnaviv,freedreno,i915,iris,lima,nouveau,panfrost,r300,r600,radeonsi,svga,llvmpipe,softpipe,tegra,v3d,vc4,virgl,zink" GALLIUM_ST: > - -D dri3=enabled -D gallium-extra-hud=true -D gallium-vdpau=enabled -D gallium-omx=disabled @@ -412,7 +407,6 @@ debian-android: -D android-libbacktrace=disabled -D intel-clc=system GALLIUM_ST: > - -D dri3=disabled -D gallium-vdpau=disabled -D gallium-omx=disabled -D gallium-va=disabled @@ -456,7 +450,6 @@ debian-android: -D platforms=x11,wayland -D osmesa=false GALLIUM_ST: > - -D dri3=enabled -D gallium-vdpau=disabled -D gallium-omx=disabled -D gallium-va=disabled @@ -614,7 +607,6 @@ debian-clang: -D glvnd=enabled -D platforms=x11,wayland GALLIUM_ST: > - -D dri3=enabled -D gallium-extra-hud=true -D gallium-vdpau=enabled -D gallium-omx=bellagio @@ -653,7 +645,6 @@ debian-clang-release: -D glx=xlib -D platforms=x11,wayland GALLIUM_ST: > - -D dri3=enabled -D gallium-extra-hud=true -D gallium-vdpau=enabled -D gallium-omx=bellagio @@ -701,7 +692,6 @@ debian-vulkan: -D platforms=x11,wayland -D osmesa=false GALLIUM_ST: > - -D dri3=enabled -D gallium-vdpau=disabled -D gallium-omx=disabled -D gallium-va=disabled diff --git a/meson.build b/meson.build index 5c5bbbc7eaf..b55a4a91227 100644 --- a/meson.build +++ b/meson.build @@ -566,23 +566,15 @@ if with_vulkan_icd_dir == '' endif with_dri2 = (with_dri or with_any_vk) and (with_dri_platform == 'drm' or with_dri_platform == 'apple') -with_dri3 = get_option('dri3').disable_auto_if(not (system_has_kms_drm and with_dri2)).allowed() with_x11_dri2 = with_dri2 and get_option('legacy-x11').contains('dri2') -if with_any_vk and (with_platform_x11 and not with_dri3) - error('Vulkan drivers require dri3 for X11 support') -endif if with_dri if with_glx == 'disabled' and not with_egl and not with_gbm error('building dri drivers require at least one windowing system') endif endif -if with_gallium_kmsro and (with_platform_x11 and not with_dri3) - error('kmsro requires dri3 for X11 support') -endif - dep_dxheaders = null_dep if with_gallium_d3d12 or with_microsoft_clc or with_microsoft_vk dep_dxheaders = dependency('directx-headers', required : false) @@ -786,9 +778,6 @@ if with_gallium_st_nine ].contains(true) error('The nine state tracker requires at least one non-swrast gallium driver.') endif - if not with_dri3 - error('Using nine with wine requires dri3') - endif endif with_gallium_st_d3d10umd = get_option('gallium-d3d10umd') if with_gallium_st_d3d10umd @@ -1749,7 +1738,7 @@ with_gallium_drisw_kms = false if system_has_kms_drm dep_libdrm = dependency( 'libdrm', version : '>=' + _drm_ver, - required : with_dri2 or with_dri3 + required : with_dri2 or with_dri ) else # We should prevent libdrm from being available when the target doesn't have it to avoid transitive @@ -2190,25 +2179,24 @@ if with_platform_x11 error('libdrm required for gallium video statetrackers when using x11') endif endif - if with_any_vk or with_egl or (with_glx == 'dri' and with_dri_platform == 'drm') + if with_dri_platform == 'drm' dep_xcb_dri2 = dependency('xcb-dri2', version : '>= 1.8', required : with_x11_dri2) - if with_dri3 - dep_xcb_dri3 = dependency('xcb-dri3') - dep_xcb_present = dependency('xcb-present') - # until xcb-dri3 has been around long enough to make a hard-dependency: - if (dep_xcb_dri3.version().version_compare('>= 1.13') and - dep_xcb_present.version().version_compare('>= 1.13')) - with_dri3_modifiers = true - endif - if (dep_xcb_dri3.version().version_compare('>= 1.17') and - dep_xcb_present.version().version_compare('>= 1.17')) - with_dri3_explicit_sync = true - endif - dep_xcb_shm = dependency('xcb-shm') - dep_xcb_sync = dependency('xcb-sync') - dep_xshmfence = dependency('xshmfence', version : '>= 1.1') + dep_xcb_dri3 = dependency('xcb-dri3') + dep_xcb_present = dependency('xcb-present') + # until xcb-dri3 has been around long enough to make a hard-dependency: + if (dep_xcb_dri3.version().version_compare('>= 1.13') and + dep_xcb_present.version().version_compare('>= 1.13')) + with_dri3_modifiers = true endif + if (dep_xcb_dri3.version().version_compare('>= 1.17') and + dep_xcb_present.version().version_compare('>= 1.17')) + with_dri3_explicit_sync = true + endif + dep_xcb_shm = dependency('xcb-shm') + dep_xcb_sync = dependency('xcb-sync') + dep_xshmfence = dependency('xshmfence', version : '>= 1.1') + pre_args += '-DHAVE_X11_DRM' endif if with_glx == 'dri' or with_glx == 'xlib' dep_glproto = dependency('glproto', version : '>= 1.4.14') @@ -2222,9 +2210,9 @@ if with_platform_x11 endif endif if (with_egl or - with_dri3 or ( + with_any_vk or with_gallium_vdpau or with_gallium_xa or - with_gallium_omx != 'disabled')) + with_gallium_omx != 'disabled') dep_xcb_xfixes = dependency('xcb-xfixes') endif if with_xlib_lease or with_any_vk @@ -2244,9 +2232,6 @@ endif if with_x11_dri2 pre_args += '-DHAVE_X11_DRI2' endif -if with_dri3 - pre_args += '-DHAVE_DRI3' -endif if with_dri3_modifiers pre_args += '-DHAVE_DRI3_MODIFIERS' endif @@ -2419,7 +2404,7 @@ if with_egl if with_dri egl_drivers += 'builtin:egl_dri2' endif - if with_dri3 + if with_dri_platform == 'drm' egl_drivers += 'builtin:egl_dri3' endif if with_platform_windows diff --git a/meson_options.txt b/meson_options.txt index 5916fe7cdc7..ac8a3114cfb 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -51,13 +51,6 @@ option( description : 'Use Android\'s libbacktrace', ) -option( - 'dri3', - type : 'feature', - deprecated: {'true': 'enabled', 'false': 'disabled'}, - description : 'enable support for dri3' -) - option( 'dri-drivers-path', type : 'string', diff --git a/src/egl/drivers/dri2/egl_dri2.h b/src/egl/drivers/dri2/egl_dri2.h index 9b3527a394e..53a36a17ef4 100644 --- a/src/egl/drivers/dri2/egl_dri2.h +++ b/src/egl/drivers/dri2/egl_dri2.h @@ -41,7 +41,7 @@ #include #include "loader_dri_helper.h" -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM #include "loader_dri3_helper.h" #endif #endif @@ -280,7 +280,7 @@ struct dri2_egl_display { xcb_connection_t *conn; xcb_screen_t *screen; bool swap_available; -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM struct loader_screen_resources screen_resources; #endif #endif diff --git a/src/egl/drivers/dri2/platform_x11.c b/src/egl/drivers/dri2/platform_x11.c index 4f23daabce7..ce4d3ec78ad 100644 --- a/src/egl/drivers/dri2/platform_x11.c +++ b/src/egl/drivers/dri2/platform_x11.c @@ -43,6 +43,7 @@ /* clang-format on */ #ifdef HAVE_LIBDRM #include +#include "platform_x11_dri3.h" #endif #include "util/bitscan.h" #include "util/macros.h" @@ -57,9 +58,6 @@ #include "drm-uapi/drm_fourcc.h" #include "dri_util.h" -#ifdef HAVE_DRI3 -#include "platform_x11_dri3.h" -#endif static EGLBoolean dri2_x11_swap_interval(_EGLDisplay *disp, _EGLSurface *surf, EGLint interval); @@ -1412,7 +1410,7 @@ dri2_x11_get_msc_rate(_EGLDisplay *display, _EGLSurface *surface, { struct dri2_egl_display *dri2_dpy = dri2_egl_display(display); -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM loader_update_screen_resources(&dri2_dpy->screen_resources); if (dri2_dpy->screen_resources.num_crtcs == 0) { @@ -1434,6 +1432,7 @@ dri2_x11_get_msc_rate(_EGLDisplay *display, _EGLSurface *surface, *denominator = 1; #endif + /* In a multi-monitor setup, look at each CRTC and perform a box * intersection between the CRTC and surface. Use the CRTC whose * box intersection has the largest area. @@ -1455,7 +1454,7 @@ dri2_x11_get_msc_rate(_EGLDisplay *display, _EGLSurface *surface, return EGL_FALSE; } -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM int area = 0; for (unsigned c = 0; c < dri2_dpy->screen_resources.num_crtcs; c++) { @@ -1471,7 +1470,6 @@ dri2_x11_get_msc_rate(_EGLDisplay *display, _EGLSurface *surface, } } #endif - /* If the window is entirely off-screen, then area will still be 0. * We defaulted to the first CRTC in the list's refresh rate, earlier. */ @@ -1817,12 +1815,14 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp) * here will allow is to simply free the memory at dri2_terminate(). */ dri2_dpy->driver_name = strdup(disp->Options.Zink ? "zink" : "swrast"); -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM + if (disp->Options.Zink && !debug_get_bool_option("LIBGL_DRI3_DISABLE", false) && !dri2_dpy->kopper_without_modifiers) dri3_x11_connect(dri2_dpy, disp->Options.Zink, disp->Options.ForceSoftware); #endif + if (!dri2_load_driver(disp)) goto cleanup; @@ -1860,7 +1860,7 @@ dri2_initialize_x11_swrast(_EGLDisplay *disp) disp->Extensions.CHROMIUM_sync_control = EGL_TRUE; disp->Extensions.EXT_swap_buffers_with_damage = !!dri2_dpy->kopper; -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM if (dri2_dpy->multibuffers_available) dri2_set_WL_bind_wayland_display(disp); #endif @@ -1887,8 +1887,7 @@ cleanup: return EGL_FALSE; } -#ifdef HAVE_DRI3 - +#ifdef HAVE_LIBDRM static const __DRIextension *dri3_image_loader_extensions[] = { &dri3_image_loader_extension.base, &image_lookup_extension.base, @@ -2072,7 +2071,7 @@ dri2_initialize_x11(_EGLDisplay *disp) (disp->Options.Zink && !debug_get_bool_option("LIBGL_KOPPER_DISABLE", false))) return dri2_initialize_x11_swrast(disp); -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM if (!debug_get_bool_option("LIBGL_DRI3_DISABLE", false)) { status = dri2_initialize_x11_dri3(disp); if (status == DRI2_EGL_DRIVER_LOADED) @@ -2093,7 +2092,7 @@ dri2_initialize_x11(_EGLDisplay *disp) void dri2_teardown_x11(struct dri2_egl_display *dri2_dpy) { -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM if (dri2_dpy->dri2_major >= 3) loader_destroy_screen_resources(&dri2_dpy->screen_resources); #endif diff --git a/src/egl/meson.build b/src/egl/meson.build index 5a95cba7dc4..d4da7dbc0bd 100644 --- a/src/egl/meson.build +++ b/src/egl/meson.build @@ -98,7 +98,7 @@ if with_dri if with_platform_x11 files_egl += files('drivers/dri2/platform_x11.c') - if with_dri3 + if with_dri_platform == 'drm' files_egl += files('drivers/dri2/platform_x11_dri3.c') link_for_egl += [libloader_x11] endif diff --git a/src/gallium/auxiliary/meson.build b/src/gallium/auxiliary/meson.build index 6b124c08d53..7284ade7e25 100644 --- a/src/gallium/auxiliary/meson.build +++ b/src/gallium/auxiliary/meson.build @@ -437,9 +437,9 @@ if host_machine.system() == 'windows' else files_libgalliumvlwinsys += files('vl/vl_winsys_drm.c') endif -if with_dri2 and with_platform_x11 +if with_platform_x11 files_libgalliumvlwinsys += files('vl/vl_winsys_dri.c') - if with_dri3 + if with_dri_platform == 'drm' vlwinsys_deps += [ dep_xcb_sync, dep_xcb_present, dep_xshmfence, dep_xcb_xfixes, dep_xcb_dri3, diff --git a/src/gallium/auxiliary/vl/vl_winsys.h b/src/gallium/auxiliary/vl/vl_winsys.h index 32ee05d60c7..12c238191a9 100644 --- a/src/gallium/auxiliary/vl/vl_winsys.h +++ b/src/gallium/auxiliary/vl/vl_winsys.h @@ -92,7 +92,7 @@ static inline struct vl_screen * vl_dri2_screen_create(void *display, int screen) { return NULL; }; #endif -#if defined(HAVE_X11_PLATFORM) && defined(HAVE_DRI3) +#if defined(HAVE_X11_PLATFORM) && defined(HAVE_LIBDRM) struct vl_screen * vl_dri3_screen_create(Display *display, int screen); #else @@ -124,4 +124,4 @@ vl_xlib_swrast_screen_create(void *display, int screen) { return NULL; } #endif #ifdef __cplusplus } -#endif \ No newline at end of file +#endif diff --git a/src/gallium/frontends/dri/meson.build b/src/gallium/frontends/dri/meson.build index ffa19e32b14..a98c8c0a903 100644 --- a/src/gallium/frontends/dri/meson.build +++ b/src/gallium/frontends/dri/meson.build @@ -21,7 +21,7 @@ files_libdri = files( if with_platform_x11 deps_for_libdri += dep_xcb - if with_dri3 + if with_dri_platform == 'drm' deps_for_libdri += [dep_xcb_dri3, dep_xcb_present, dep_xcb_sync, dep_xshmfence, dep_xcb_xfixes] files_libdri += files('loader_dri3_helper.c') diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 2411868901e..2be7ed2fb68 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -1207,7 +1207,7 @@ dri_device_create(int fd, uint32_t gbm_backend_version) struct dri_screen *screen = dri_screen(dri->screen); struct pipe_screen *pscreen = screen->base.screen; -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM if (pscreen->get_param(pscreen, PIPE_CAP_DMABUF) & DRM_PRIME_CAP_IMPORT) dri->has_dmabuf_import = true; if (pscreen->get_param(pscreen, PIPE_CAP_DMABUF) & DRM_PRIME_CAP_EXPORT) diff --git a/src/gbm/main/backend.c b/src/gbm/main/backend.c index feee0703495..e05969844e9 100644 --- a/src/gbm/main/backend.c +++ b/src/gbm/main/backend.c @@ -42,7 +42,7 @@ #define ARRAY_SIZE(a) (sizeof(a)/sizeof((a)[0])) #define VER_MIN(a, b) ((a) < (b) ? (a) : (b)) -#if defined(HAVE_DRI) || defined(HAVE_DRI2) || defined(HAVE_DRI3) +#ifdef HAVE_DRI extern const struct gbm_backend gbm_dri_backend; #endif @@ -53,7 +53,7 @@ struct gbm_backend_desc { }; static const struct gbm_backend_desc builtin_backends[] = { -#if defined(HAVE_DRI) || defined(HAVE_DRI2) || defined(HAVE_DRI3) +#ifdef HAVE_DRI { "dri", &gbm_dri_backend }, #endif }; diff --git a/src/glx/dri_common_query_renderer.c b/src/glx/dri_common_query_renderer.c index 09a86b990ff..09838ded5cb 100644 --- a/src/glx/dri_common_query_renderer.c +++ b/src/glx/dri_common_query_renderer.c @@ -26,11 +26,6 @@ #include "glxclient.h" #include "glx_error.h" #include "mesa_interface.h" -#include "dri2_priv.h" -#if defined(HAVE_DRI3) -#include "dri3_priv.h" -#endif -#include "drisw_priv.h" #include "dri_util.h" #include "dri_common.h" diff --git a/src/glx/drisw_glx.c b/src/glx/drisw_glx.c index 18cfa119c8b..d4fd21f6c32 100644 --- a/src/glx/drisw_glx.c +++ b/src/glx/drisw_glx.c @@ -32,7 +32,7 @@ #include #include "dri_common.h" #include "drisw_priv.h" -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM #include "dri3_priv.h" #endif #include diff --git a/src/glx/glxclient.h b/src/glx/glxclient.h index 8373d9881ed..6e798ed45e4 100644 --- a/src/glx/glxclient.h +++ b/src/glx/glxclient.h @@ -143,7 +143,7 @@ extern __GLXDRIdisplay *driwindowsCreateDisplay(Display * dpy); #if defined(GLX_DIRECT_RENDERING) && (!defined(GLX_USE_APPLEGL) || defined(GLX_USE_APPLE)) -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM struct glx_screen *dri3_create_screen(int screen, struct glx_display * priv, bool driver_name_is_inferred, bool *return_zink); void dri3_destroy_display(__GLXDRIdisplay * dpy); #endif diff --git a/src/glx/glxext.c b/src/glx/glxext.c index 6bfa83d7876..d7bc484b7d7 100644 --- a/src/glx/glxext.c +++ b/src/glx/glxext.c @@ -33,7 +33,7 @@ #endif #include "loader_x11.h" -#ifdef HAVE_DRI3 +#ifdef HAVE_LIBDRM #include "loader_dri3_helper.h" #endif @@ -870,7 +870,6 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv, enum glx_dr psc = NULL; #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL) #if defined(GLX_USE_DRM) -#if defined(HAVE_DRI3) if (glx_driver & GLX_DRIVER_DRI3) { bool use_zink; psc = dri3_create_screen(i, priv, driver_name_is_inferred, &use_zink); @@ -880,7 +879,6 @@ AllocAndFetchScreenConfigs(Display * dpy, struct glx_display * priv, enum glx_dr driver_name_is_inferred = false; } } -#endif /* HAVE_DRI3 */ #if defined(HAVE_X11_DRI2) if (psc == NULL && glx_driver & GLX_DRIVER_DRI2 && dri2CheckSupport(dpy)) { psc = dri2CreateScreen(i, priv, driver_name_is_inferred); @@ -1015,7 +1013,6 @@ __glXInitialize(Display * dpy) dpyPriv->has_multibuffer = x11_dri3_check_multibuffer(XGetXCBConnection(dpy), &dri3_err, &dpyPriv->has_explicit_modifiers); if (glx_direct && glx_accel && (!(glx_driver & GLX_DRIVER_ZINK_YES) || !kopper)) { -#if defined(HAVE_DRI3) if (dri3) { /* dri3 is tried as long as this doesn't error; whether modifiers work is not relevant */ if (!dri3_err) { @@ -1025,7 +1022,6 @@ __glXInitialize(Display * dpy) glx_driver |= GLX_DRIVER_ZINK_INFER; } } -#endif /* HAVE_DRI3 */ #if defined(HAVE_X11_DRI2) if (!debug_get_bool_option("LIBGL_DRI2_DISABLE", false)) glx_driver |= GLX_DRIVER_DRI2; diff --git a/src/glx/meson.build b/src/glx/meson.build index a1c36cf9bbc..6057aefaf96 100644 --- a/src/glx/meson.build +++ b/src/glx/meson.build @@ -69,7 +69,7 @@ if with_x11_dri2 ) endif -if with_dri3 +if with_dri_platform == 'drm' files_libglx += files('dri3_glx.c', 'dri3_priv.h') endif diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index 898bdd7bcdb..a6ebdf512ce 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -210,7 +210,7 @@ wsi_device_init(struct wsi_device *wsi, WSI_GET_CB(WaitSemaphores); #undef WSI_GET_CB -#ifdef VK_USE_PLATFORM_XCB_KHR +#if defined(VK_USE_PLATFORM_XCB_KHR) result = wsi_x11_init_wsi(wsi, alloc, dri_options); if (result != VK_SUCCESS) goto fail; @@ -311,7 +311,7 @@ wsi_device_finish(struct wsi_device *wsi, #ifdef VK_USE_PLATFORM_WIN32_KHR wsi_win32_finish_wsi(wsi, alloc); #endif -#ifdef VK_USE_PLATFORM_XCB_KHR +#if defined(VK_USE_PLATFORM_XCB_KHR) wsi_x11_finish_wsi(wsi, alloc); #endif } diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c index 0c0c489d893..dd57862e357 100644 --- a/src/vulkan/wsi/wsi_common_x11.c +++ b/src/vulkan/wsi/wsi_common_x11.c @@ -104,7 +104,7 @@ struct wsi_x11_vk_surface { }; bool has_alpha; }; - +#ifdef HAVE_X11_DRM /** * Wrapper around xcb_dri3_open. Returns the opened fd or -1 on error. */ @@ -137,7 +137,6 @@ wsi_dri3_open(xcb_connection_t *conn, return fd; } - /** * Checks compatibility of the device wsi_dev with the device the X server * provides via DRI3. @@ -166,6 +165,7 @@ wsi_x11_check_dri3_compatible(const struct wsi_device *wsi_dev, return match; } +#endif static bool wsi_x11_detect_xwayland(xcb_connection_t *conn, @@ -347,6 +347,7 @@ wsi_x11_connection_create(struct wsi_device *wsi_dev, wsi_conn->is_proprietary_x11 = true; wsi_conn->has_mit_shm = false; +#ifdef HAVE_X11_DRM if (wsi_conn->has_dri3 && wsi_conn->has_present && wants_shm) { bool has_mit_shm = shm_reply->present != 0; @@ -370,6 +371,7 @@ wsi_x11_connection_create(struct wsi_device *wsi_dev, } } } +#endif free(dri3_reply); free(pres_reply); @@ -1234,10 +1236,10 @@ x11_get_wsi_image(struct wsi_swapchain *wsi_chain, uint32_t image_index) struct x11_swapchain *chain = (struct x11_swapchain *)wsi_chain; return &chain->images[image_index].base; } - +#ifdef HAVE_DRI3_MODIFIERS static bool wsi_x11_swapchain_query_dri3_modifiers_changed(struct x11_swapchain *chain); - +#endif static VkResult x11_wait_for_explicit_sync_release_submission(struct x11_swapchain *chain, uint64_t rel_timeout_ns, @@ -1365,7 +1367,7 @@ x11_handle_dri3_present_event(struct x11_swapchain *chain, return VK_SUCCESS; } - +#ifdef HAVE_X11_DRM /** * Send image to X server via Present extension. */ @@ -1465,7 +1467,7 @@ x11_present_to_x11_dri3(struct x11_swapchain *chain, uint32_t image_index, xcb_flush(chain->conn); return x11_swapchain_result(chain, VK_SUCCESS); } - +#endif /** * Send image to X server unaccelerated (software drivers). */ @@ -1691,7 +1693,11 @@ x11_present_to_x11(struct x11_swapchain *chain, uint32_t image_index, if (chain->base.wsi->sw && !chain->has_mit_shm) result = x11_present_to_x11_sw(chain, image_index); else +#ifdef HAVE_X11_DRM result = x11_present_to_x11_dri3(chain, image_index, target_msc, present_mode); +#else + unreachable("X11 missing DRI3 support!"); +#endif if (result < 0) x11_swapchain_notify_error(chain, result); @@ -1771,9 +1777,11 @@ x11_acquire_next_image(struct wsi_swapchain *anv_chain, return result; assert(*image_index < chain->base.image_count); +#ifdef HAVE_X11_DRM if (chain->images[*image_index].shm_fence && !chain->base.image_info.explicit_sync) xshmfence_await(chain->images[*image_index].shm_fence); +#endif return result; } @@ -2055,25 +2063,25 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain, const VkAllocationCallbacks* pAllocator, struct x11_image *image) { - xcb_void_cookie_t cookie; - xcb_generic_error_t *error = NULL; VkResult result; - uint32_t bpp = 32; - int fence_fd; result = wsi_create_image(&chain->base, &chain->base.image_info, &image->base); if (result != VK_SUCCESS) return result; + if (chain->base.wsi->sw && !chain->has_mit_shm) + return VK_SUCCESS; + +#ifdef HAVE_X11_DRM + xcb_void_cookie_t cookie; + xcb_generic_error_t *error = NULL; + uint32_t bpp = 32; + int fence_fd; image->update_region = xcb_generate_id(chain->conn); xcb_xfixes_create_region(chain->conn, image->update_region, 0, NULL); if (chain->base.wsi->sw) { - if (!chain->has_mit_shm) { - return VK_SUCCESS; - } - image->shmseg = xcb_generate_id(chain->conn); xcb_shm_attach(chain->conn, @@ -2194,7 +2202,6 @@ out_fence: fence_fd); xshmfence_trigger(image->shm_fence); - return VK_SUCCESS; fail_shmfence_alloc: @@ -2207,6 +2214,9 @@ fail_pixmap: fail_image: wsi_destroy_image(&chain->base, &image->base); +#else + unreachable("SHM support not compiled in"); +#endif return VK_ERROR_INITIALIZATION_FAILED; } @@ -2216,18 +2226,19 @@ x11_image_finish(struct x11_swapchain *chain, struct x11_image *image) { xcb_void_cookie_t cookie; - if (!chain->base.wsi->sw || chain->has_mit_shm) { +#ifdef HAVE_X11_DRM cookie = xcb_sync_destroy_fence(chain->conn, image->sync_fence); xcb_discard_reply(chain->conn, cookie.sequence); xshmfence_unmap_shm(image->shm_fence); +#endif cookie = xcb_free_pixmap(chain->conn, image->pixmap); xcb_discard_reply(chain->conn, cookie.sequence); - +#ifdef HAVE_X11_DRM cookie = xcb_xfixes_destroy_region(chain->conn, image->update_region); xcb_discard_reply(chain->conn, cookie.sequence); - +#endif #ifdef HAVE_DRI3_EXPLICIT_SYNC if (chain->base.image_info.explicit_sync) { for (uint32_t i = 0; i < WSI_ES_COUNT; i++) { @@ -2335,7 +2346,7 @@ wsi_x11_get_dri3_modifiers(struct wsi_x11_connection *wsi_conn, out: *num_tranches_in = 0; } - +#ifdef HAVE_DRI3_MODIFIERS static bool wsi_x11_swapchain_query_dri3_modifiers_changed(struct x11_swapchain *chain) { @@ -2380,13 +2391,12 @@ wsi_x11_swapchain_query_dri3_modifiers_changed(struct x11_swapchain *chain) return memcmp(hash, chain->dri3_modifier_hash, sizeof(hash)) != 0; } - +#endif static VkResult x11_swapchain_destroy(struct wsi_swapchain *anv_chain, const VkAllocationCallbacks *pAllocator) { struct x11_swapchain *chain = (struct x11_swapchain *)anv_chain; - xcb_void_cookie_t cookie; mtx_lock(&chain->thread_state_lock); chain->status = VK_ERROR_OUT_OF_DATE_KHR; @@ -2404,13 +2414,14 @@ x11_swapchain_destroy(struct wsi_swapchain *anv_chain, for (uint32_t i = 0; i < chain->base.image_count; i++) x11_image_finish(chain, pAllocator, &chain->images[i]); - +#ifdef HAVE_X11_DRM + xcb_void_cookie_t cookie; xcb_unregister_for_special_event(chain->conn, chain->special_event); cookie = xcb_present_select_input_checked(chain->conn, chain->event_id, chain->window, XCB_PRESENT_EVENT_MASK_NO_EVENT); xcb_discard_reply(chain->conn, cookie.sequence); - +#endif mtx_destroy(&chain->present_progress_mutex); u_cnd_monotonic_destroy(&chain->present_progress_cond); mtx_destroy(&chain->thread_state_lock); @@ -2598,6 +2609,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, } uint32_t present_caps = 0; +#ifdef HAVE_X11_DRM xcb_present_query_capabilities_cookie_t present_query_cookie; xcb_present_query_capabilities_reply_t *present_query_reply; present_query_cookie = xcb_present_query_capabilities(conn, window); @@ -2606,12 +2618,11 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, present_caps = present_query_reply->capabilities; free(present_query_reply); } +#endif struct wsi_base_image_params *image_params = NULL; struct wsi_cpu_image_params cpu_image_params; - struct wsi_drm_image_params drm_image_params; uint64_t *modifiers[2] = {NULL, NULL}; - uint32_t num_modifiers[2] = {0, 0}; if (wsi_device->sw) { cpu_image_params = (struct wsi_cpu_image_params) { .base.image_type = WSI_IMAGE_TYPE_CPU, @@ -2619,7 +2630,9 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, }; image_params = &cpu_image_params.base; } else { - drm_image_params = (struct wsi_drm_image_params) { +#ifdef HAVE_X11_DRM + uint32_t num_modifiers[2] = {0, 0}; + struct wsi_drm_image_params drm_image_params = { .base.image_type = WSI_IMAGE_TYPE_DRM, .same_gpu = wsi_x11_check_dri3_compatible(wsi_device, conn), .explicit_sync = @@ -2642,6 +2655,9 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, wsi_x11_recompute_dri3_modifier_hash(&chain->dri3_modifier_hash, &drm_image_params); } image_params = &drm_image_params.base; +#else + unreachable("X11 DRM support missing!"); +#endif } result = wsi_swapchain_init(wsi_device, &chain->base, device, pCreateInfo, @@ -2701,7 +2717,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, * 'PresentOptionSuboptimal' complete mode. */ chain->copy_is_suboptimal = false; - +#ifdef HAVE_X11_DRM /* For our swapchain we need to listen to following Present extension events: * - Configure: Window dimensions changed. Images in the swapchain might need * to be reallocated. @@ -2722,7 +2738,7 @@ x11_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, chain->special_event = xcb_register_for_special_xge(chain->conn, &xcb_present_id, chain->event_id, NULL); - +#endif /* Create the graphics context. */ chain->gc = xcb_generate_id(chain->conn); if (!chain->gc) { @@ -2802,8 +2818,9 @@ fail_init_images: x11_image_finish(chain, pAllocator, &chain->images[j]); fail_register: +#ifdef HAVE_X11_DRM xcb_unregister_for_special_event(chain->conn, chain->special_event); - +#endif wsi_swapchain_finish(&chain->base); fail_alloc: diff --git a/src/x11/meson.build b/src/x11/meson.build index 7daea877cea..88ba0bb1c46 100644 --- a/src/x11/meson.build +++ b/src/x11/meson.build @@ -3,7 +3,7 @@ inc_loader_x11 = include_directories('.') -if with_platform_x11 and with_dri3 +if with_platform_x11 and with_dri_platform == 'drm' libloader_x11 = static_library( 'loader_x11', 'loader_x11.c',