diff --git a/pressure-vessel/runtime.c b/pressure-vessel/runtime.c index a4c7423fef94c98157438aa3e73c1a2aa70d3ff5..0a996d8678fe923c51bc864d500067ccb1170b02 100644 --- a/pressure-vessel/runtime.c +++ b/pressure-vessel/runtime.c @@ -1371,79 +1371,6 @@ collect_s2tc (PvRuntime *self, return TRUE; } -static gboolean -try_bind_dri (PvRuntime *self, - RuntimeArchitecture *arch, - const char *libdir, - GError **error) -{ - /* e.g. /usr/lib/dri */ - g_autofree gchar *dri = g_build_filename (libdir, "dri", NULL); - /* e.g. /run/host/usr/lib/dri */ - g_autofree gchar *dri_in_current_namespace = g_build_filename ( - self->provider_in_current_namespace, - dri, - NULL); - - if (g_file_test (dri_in_current_namespace, G_FILE_TEST_IS_DIR)) - { - g_autoptr(FlatpakBwrap) temp_bwrap = NULL; - g_autofree gchar *expr = NULL; - g_autoptr(GDir) dir = NULL; - const char *member; - - g_debug ("Collecting dependencies of DRI drivers in \"%s\"...", dri); - expr = g_strdup_printf ("only-dependencies:if-exists:path-match:%s/dri/*.so", - libdir); - - if (!pv_runtime_provide_container_access (self, error)) - return FALSE; - - temp_bwrap = pv_runtime_get_capsule_capture_libs (self, arch); - flatpak_bwrap_add_args (temp_bwrap, - "--dest", arch->libdir_in_current_namespace, - expr, - NULL); - flatpak_bwrap_finish (temp_bwrap); - - if (!pv_bwrap_run_sync (temp_bwrap, NULL, error)) - return FALSE; - - g_clear_pointer (&temp_bwrap, flatpak_bwrap_free); - - dir = g_dir_open (dri_in_current_namespace, 0, error); - - if (dir == NULL) - return FALSE; - - for (member = g_dir_read_name (dir); - member != NULL; - member = g_dir_read_name (dir)) - { - g_autofree gchar *target = g_build_filename (self->provider_in_container_namespace, - dri, member, NULL); - g_autofree gchar *dest = g_build_filename (arch->libdir_in_current_namespace, - "dri", member, NULL); - - g_debug ("Creating symbolic link \"%s\" -> \"%s\" for \"%s\" DRI driver", - dest, target, arch->details->tuple); - - /* Delete an existing symlink if any, like ln -f */ - if (unlink (dest) != 0 && errno != ENOENT) - return glnx_throw_errno_prefix (error, - "Unable to remove \"%s\"", - dest); - - if (symlink (target, dest) != 0) - return glnx_throw_errno_prefix (error, - "Unable to create symlink \"%s\" -> \"%s\"", - dest, target); - } - } - - return TRUE; -} - typedef enum { ICD_KIND_NONEXISTENT, @@ -1455,7 +1382,8 @@ typedef enum typedef struct { /* (type SrtEglIcd) or (type SrtVulkanIcd) or (type SrtVdpauDriver) - * or (type SrtVaApiDriver) or (type SrtVulkanLayer) */ + * or (type SrtVaApiDriver) or (type SrtVulkanLayer) or + * (type SrtDriDriver) */ gpointer icd; gchar *resolved_library; /* Last entry is always NONEXISTENT; keyed by the index of a multiarch @@ -1472,7 +1400,8 @@ icd_details_new (gpointer icd) gsize i; g_return_val_if_fail (G_IS_OBJECT (icd), NULL); - g_return_val_if_fail (SRT_IS_EGL_ICD (icd) || + g_return_val_if_fail (SRT_IS_DRI_DRIVER (icd) || + SRT_IS_EGL_ICD (icd) || SRT_IS_VULKAN_ICD (icd) || SRT_IS_VULKAN_LAYER (icd) || SRT_IS_VDPAU_DRIVER (icd) || @@ -3402,14 +3331,13 @@ pv_runtime_use_provider_graphics_stack (PvRuntime *self, if (runtime_architecture_init (arch, self)) { g_autoptr(GPtrArray) dirs = NULL; - g_autofree gchar *this_dri_path_on_host = g_build_filename (arch->libdir_in_current_namespace, - "dri", NULL); g_autofree gchar *this_dri_path_in_container = g_build_filename (arch->libdir_in_container, "dri", NULL); g_autofree gchar *libc = NULL; /* Can either be relative to the sysroot, or absolute */ g_autofree gchar *ld_so_in_runtime = NULL; g_autofree gchar *libdrm = NULL; + g_autoptr(SrtObjectList) dri_drivers = NULL; g_autoptr(SrtObjectList) vdpau_drivers = NULL; g_autoptr(SrtObjectList) va_api_drivers = NULL; gboolean use_numbered_subdirs; @@ -3433,7 +3361,6 @@ pv_runtime_use_provider_graphics_stack (PvRuntime *self, pv_search_path_append (va_api_path, this_dri_path_in_container); g_mkdir_with_parents (arch->libdir_in_current_namespace, 0755); - g_mkdir_with_parents (this_dri_path_on_host, 0755); g_debug ("Collecting graphics drivers from provider system..."); @@ -3522,6 +3449,28 @@ pv_runtime_use_provider_graphics_stack (PvRuntime *self, return FALSE; } + g_debug ("Enumerating %s DRI drivers on host system...", + arch->details->tuple); + dri_drivers = srt_system_info_list_dri_drivers (system_info, + arch->details->tuple, + SRT_DRIVER_FLAGS_NONE); + /* The DRI loader looks up drivers by name, not by readdir(), + * so order doesn't matter unless there are name collisions. */ + use_numbered_subdirs = FALSE; + + for (icd_iter = dri_drivers, j = 0; icd_iter != NULL; icd_iter = icd_iter->next, j++) + { + g_autoptr(IcdDetails) details = icd_details_new (icd_iter->data); + + details->resolved_library = srt_dri_driver_resolve_library_path (details->icd); + g_assert (details->resolved_library != NULL); + g_assert (g_path_is_absolute (details->resolved_library)); + + if (!bind_icd (self, arch, j, "dri", details, + &use_numbered_subdirs, dri_path, error)) + return FALSE; + } + g_debug ("Enumerating %s VA-API drivers on host system...", arch->details->tuple); va_api_drivers = srt_system_info_list_va_api_drivers (system_info, @@ -3584,17 +3533,6 @@ pv_runtime_use_provider_graphics_stack (PvRuntime *self, dirs = multiarch_details_get_libdirs (arch->details, MULTIARCH_LIBDIRS_FLAGS_NONE); - /* We iterate in reverse order, from dirs->len - 1 down to 0, - * because we want to see the most important *last*: drivers - * checked later will overwrite drivers checked earlier. */ - for (j = 0; j < dirs->len; j++) - { - if (!try_bind_dri (self, arch, - g_ptr_array_index (dirs, dirs->len - 1 - j), - error)) - return FALSE; - } - for (j = 0; j < dirs->len; j++) { if (!collect_s2tc (self, arch,