diff --git a/bin/system-info.c b/bin/system-info.c index a6199a77c2b93e9ae81479cd356bce721ebaa4a0..171785a0a66c24809f5fe766ef4d9310ed81019a 100644 --- a/bin/system-info.c +++ b/bin/system-info.c @@ -488,14 +488,24 @@ print_va_api_details (JsonBuilder *builder, { for (iter = va_api_list; iter != NULL; iter = iter->next) { + const gchar *library; + gchar *resolved = NULL; json_builder_begin_object (builder); + library = srt_va_api_driver_get_library_path (iter->data); json_builder_set_member_name (builder, "library_path"); - json_builder_add_string_value (builder, srt_va_api_driver_get_library_path (iter->data)); + json_builder_add_string_value (builder, library); + resolved = srt_va_api_driver_resolve_library_path (iter->data); + if (g_strcmp0 (library, resolved) != 0) + { + json_builder_set_member_name (builder, "library_path_resolved"); + json_builder_add_string_value (builder, resolved); + } if (srt_va_api_driver_is_extra (iter->data)) { json_builder_set_member_name (builder, "is_extra"); json_builder_add_boolean_value (builder, TRUE); } + g_free (resolved); json_builder_end_object (builder); } } diff --git a/bin/system-info.md b/bin/system-info.md index 9028725ffdffcdecfb1dad5be89ad2eb812d0c57..e95d24912982f3267aec8d8837d6d493ffc55935 100644 --- a/bin/system-info.md +++ b/bin/system-info.md @@ -466,6 +466,10 @@ keys: **library_path** : Path to the driver module that has been found. + **library_path_resolved** + : Absolute path to the driver module that has been found. + This key is present only if **library_path** is relative. + **is_extra** : A boolean value indicating whether the driver module is in an "unusual" location, probably not in the canonical search path. diff --git a/steam-runtime-tools/graphics.c b/steam-runtime-tools/graphics.c index f7ae403bd61dc95a6c43956cccd94544287b6b4c..3df5da69095bf3abf1c378b8bcf26029df114d77 100644 --- a/steam-runtime-tools/graphics.c +++ b/steam-runtime-tools/graphics.c @@ -3251,6 +3251,24 @@ _srt_list_graphics_modules (const char *sysroot, return g_list_reverse (drivers); } +static gchar * +_srt_resolve_library_path (const gchar *library_path) +{ + gchar *base; + gchar *ret; + + g_return_val_if_fail (library_path != NULL, NULL); + + /* We can't use g_canonicalize_filename() because we are targeting an earlier glib version */ + if (library_path[0] == '/') + return g_strdup (library_path); + + base = g_get_current_dir (); + ret = g_build_filename (base, library_path, NULL); + g_free (base); + return ret; +} + /** * SrtVaApiDriver: * @@ -3276,6 +3294,7 @@ enum VA_API_DRIVER_PROP_0, VA_API_DRIVER_PROP_LIBRARY_PATH, VA_API_DRIVER_PROP_IS_EXTRA, + VA_API_DRIVER_PROP_RESOLVED_LIBRARY_PATH, N_VA_API_DRIVER_PROPERTIES }; @@ -3304,6 +3323,10 @@ srt_va_api_driver_get_property (GObject *object, g_value_set_boolean (value, self->is_extra); break; + case VA_API_DRIVER_PROP_RESOLVED_LIBRARY_PATH: + g_value_take_string (value, srt_va_api_driver_resolve_library_path (self)); + break; + default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -3356,7 +3379,9 @@ srt_va_api_driver_class_init (SrtVaApiDriverClass *cls) va_api_driver_properties[VA_API_DRIVER_PROP_LIBRARY_PATH] = g_param_spec_string ("library-path", "Library path", - "Absolute path to the DRI driver library", + "Path to the DRI driver library. It might be absolute " + "(e.g. /usr/lib/dri/iHD_drv_video.so) or relative " + "(e.g. custom/dri/iHD_drv_video.so)", NULL, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); @@ -3368,6 +3393,14 @@ srt_va_api_driver_class_init (SrtVaApiDriverClass *cls) G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS); + va_api_driver_properties[VA_API_DRIVER_PROP_RESOLVED_LIBRARY_PATH] = + g_param_spec_string ("resolved-library-path", "Resolved library path", + "Absolute path to the DRI driver library. This is similar " + "to 'library-path', but is guaranteed to be an " + "absolute path (e.g. /usr/lib/dri/iHD_drv_video.so)", + NULL, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, N_VA_API_DRIVER_PROPERTIES, va_api_driver_properties); } @@ -3397,7 +3430,7 @@ srt_va_api_driver_new (const gchar *library_path, * * Return the library path for this VA-API driver. * - * Returns: (type filename) (transfer none) (nullable): #SrtVaApiDriver:library-path + * Returns: (type filename) (transfer none): #SrtVaApiDriver:library-path */ const gchar * srt_va_api_driver_get_library_path (SrtVaApiDriver *self) @@ -3421,6 +3454,26 @@ srt_va_api_driver_is_extra (SrtVaApiDriver *self) return self->is_extra; } +/** + * srt_va_api_driver_resolve_library_path: + * @self: The VA-API driver + * + * Return the absolute library path for this VA-API driver. + * If srt_va_api_driver_get_library_path() is already an absolute path, a copy + * of the same value will be returned. + * + * Returns: (type filename) (transfer full): A copy of + * #SrtVaApiDriver:resolved-library-path. Free with g_free(). + */ +gchar * +srt_va_api_driver_resolve_library_path (SrtVaApiDriver *self) +{ + g_return_val_if_fail (SRT_IS_VA_API_DRIVER (self), NULL); + g_return_val_if_fail (self->library_path != NULL, NULL); + + return _srt_resolve_library_path (self->library_path); +} + /** * SrtVdpauDriver: * @@ -3658,20 +3711,10 @@ srt_vdpau_driver_is_extra (SrtVdpauDriver *self) gchar * srt_vdpau_driver_resolve_library_path (SrtVdpauDriver *self) { - gchar *base; - gchar *ret; - g_return_val_if_fail (SRT_IS_VDPAU_DRIVER (self), NULL); g_return_val_if_fail (self->library_path != NULL, NULL); - /* We can't use g_canonicalize_filename() because we are targeting an earlier glib version */ - if (self->library_path[0] == '/') - return g_strdup (self->library_path); - - base = g_get_current_dir (); - ret = g_build_filename (base, self->library_path, NULL); - g_free (base); - return ret; + return _srt_resolve_library_path (self->library_path); } /** diff --git a/steam-runtime-tools/graphics.h b/steam-runtime-tools/graphics.h index 28be49e6faaf84b9e5cd4568d135ff59c4477233..4e7f2af850ff55ee11fa13523acc969a3eb37a86 100644 --- a/steam-runtime-tools/graphics.h +++ b/steam-runtime-tools/graphics.h @@ -182,6 +182,7 @@ GType srt_va_api_driver_get_type (void); const gchar *srt_va_api_driver_get_library_path (SrtVaApiDriver *self); gboolean srt_va_api_driver_is_extra (SrtVaApiDriver *self); +gchar *srt_va_api_driver_resolve_library_path (SrtVaApiDriver *self); typedef struct _SrtVdpauDriver SrtVdpauDriver; typedef struct _SrtVdpauDriverClass SrtVdpauDriverClass; diff --git a/tests/graphics.c b/tests/graphics.c index 4ea295744ddc989d1885912a4063e8d876cf8d93..54eb80767dffb668a1c08c939015692581095080 100644 --- a/tests/graphics.c +++ b/tests/graphics.c @@ -1822,8 +1822,12 @@ check_paths_are_absolute (const GList *list, absolute_path = srt_vdpau_driver_resolve_library_path (iter->data); break; - case SRT_GRAPHICS_DRI_MODULE: case SRT_GRAPHICS_VAAPI_MODULE: + library_path = srt_va_api_driver_get_library_path (iter->data); + absolute_path = srt_va_api_driver_resolve_library_path (iter->data); + break; + + case SRT_GRAPHICS_DRI_MODULE: case SRT_GRAPHICS_GLX_MODULE: case NUM_SRT_GRAPHICS_MODULES: default: @@ -1852,8 +1856,12 @@ check_paths_are_relative (const GList *list, absolute_path = srt_vdpau_driver_resolve_library_path (iter->data); break; - case SRT_GRAPHICS_DRI_MODULE: case SRT_GRAPHICS_VAAPI_MODULE: + library_path = srt_va_api_driver_get_library_path (iter->data); + absolute_path = srt_va_api_driver_resolve_library_path (iter->data); + break; + + case SRT_GRAPHICS_DRI_MODULE: case SRT_GRAPHICS_GLX_MODULE: case NUM_SRT_GRAPHICS_MODULES: default: @@ -1916,10 +1924,12 @@ test_dri_debian10 (Fixture *f, /* The output is guaranteed to be in aphabetical order */ va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); check_list_suffixes (va_api, va_api_suffixes_i386, SRT_GRAPHICS_VAAPI_MODULE); + check_paths_are_absolute (va_api, SRT_GRAPHICS_VAAPI_MODULE); g_list_free_full (va_api, g_object_unref); va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_NONE); check_list_suffixes (va_api, va_api_suffixes_x86_64, SRT_GRAPHICS_VAAPI_MODULE); + check_paths_are_absolute (va_api, SRT_GRAPHICS_VAAPI_MODULE); g_list_free_full (va_api, g_object_unref); /* Do it again, this time using the cached result. @@ -2064,7 +2074,7 @@ test_dri_with_env (Fixture *f, libva3 = g_build_filename (sysroot, "custom_path64", "va", NULL); libgl_combined = g_strjoin (":", libgl, libgl2, libgl3, NULL); - libva_combined = g_strjoin (":", libva, libva2, libgl3, NULL); + libva_combined = g_strjoin (":", libva, libva2, libva3, NULL); envp = g_get_environ (); envp = g_environ_setenv (envp, "SRT_TEST_SYSROOT", sysroot, TRUE); @@ -2099,6 +2109,22 @@ test_dri_with_env (Fixture *f, check_list_extra (va_api, G_N_ELEMENTS(va_api_suffixes)-1, SRT_GRAPHICS_VAAPI_MODULE); g_list_free_full (va_api, g_object_unref); + /* Test a va_api relative path */ + g_free (libva); + g_free (libva2); + g_free (libva3); + g_free (libva_combined); + libva = g_build_filename ("sysroots", "no-os-release", "custom_path32", "va", NULL); + libva2 = g_build_filename ("sysroots", "no-os-release", "custom_path32_2", "va", NULL); + libva3 = g_build_filename ("sysroots", "no-os-release", "custom_path64", "va", NULL); + libva_combined = g_strjoin (":", libva, libva2, libva3, NULL); + envp = g_environ_setenv (envp, "LIBVA_DRIVERS_PATH", libva_combined, TRUE); + srt_system_info_set_environ (info, envp); + va_api = srt_system_info_list_va_api_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE); + check_list_suffixes (va_api, va_api_suffixes, SRT_GRAPHICS_VAAPI_MODULE); + check_paths_are_relative (va_api, SRT_GRAPHICS_VAAPI_MODULE); + g_list_free_full (va_api, g_object_unref); + g_object_unref (info); g_free (sysroot); g_free (libgl_combined); diff --git a/tests/mock-fedora-32-bit-inspect-library.c b/tests/mock-fedora-32-bit-inspect-library.c index f79b89171d0c22acdd6e7dea2e96f6d9528c1734..d2162dc715f93ee13bd892cab5dafcbb231fd1d8 100644 --- a/tests/mock-fedora-32-bit-inspect-library.c +++ b/tests/mock-fedora-32-bit-inspect-library.c @@ -57,6 +57,10 @@ main (int argc, } } + /* If the argument is a 64bit directory, we return an exit failure */ + if (g_strstr_len (argv[1], -1, "/custom_path64/") != NULL) + return EXIT_FAILURE; + gchar **envp = g_get_environ (); gchar *path = g_build_filename (g_environ_getenv (envp, "SRT_TEST_SYSROOT"), "usr", "lib", argv[1], NULL);