Skip to content
Snippets Groups Projects
Commit 0e2a1174 authored by Ludovico de Nittis's avatar Ludovico de Nittis :palm_tree:
Browse files

Add srt_vdpau_driver_resolve_library_path method


"srt_vdpau_driver_get_library_path" might return a relative path.
Instead with this new function we will be sure to receive an absolute
path to the driver.

Signed-off-by: default avatarLudovico de Nittis <ludovico.denittis@collabora.com>
parent f0d9344a
No related branches found
No related tags found
1 merge request!111Add resolve library path and refactor vdpau tests
......@@ -513,9 +513,18 @@ print_vdpau_details (JsonBuilder *builder,
{
for (iter = vdpau_list; iter != NULL; iter = iter->next)
{
const gchar *library;
gchar *resolved = NULL;
json_builder_begin_object (builder);
library = srt_vdpau_driver_get_library_path (iter->data);
json_builder_set_member_name (builder, "library_path");
json_builder_add_string_value (builder, srt_vdpau_driver_get_library_path (iter->data));
json_builder_add_string_value (builder, library);
resolved = srt_vdpau_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_vdpau_driver_get_library_link (iter->data) != NULL)
{
json_builder_set_member_name (builder, "library_link");
......@@ -526,6 +535,7 @@ print_vdpau_details (JsonBuilder *builder,
json_builder_set_member_name (builder, "is_extra");
json_builder_add_boolean_value (builder, TRUE);
}
g_free (resolved);
json_builder_end_object (builder);
}
}
......
......@@ -480,6 +480,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.
**library_link**
: Content of the **library_path** symbolic link. This key is optional
and if is not provided, it should be assumed that **library_path**
......
......@@ -3448,6 +3448,7 @@ enum
VDPAU_DRIVER_PROP_LIBRARY_PATH,
VDPAU_DRIVER_PROP_LIBRARY_LINK,
VDPAU_DRIVER_PROP_IS_EXTRA,
VDPAU_DRIVER_PROP_RESOLVED_LIBRARY_PATH,
N_VDPAU_DRIVER_PROPERTIES
};
......@@ -3480,6 +3481,10 @@ srt_vdpau_driver_get_property (GObject *object,
g_value_set_boolean (value, self->is_extra);
break;
case VDPAU_DRIVER_PROP_RESOLVED_LIBRARY_PATH:
g_value_take_string (value, srt_vdpau_driver_resolve_library_path (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
......@@ -3538,7 +3543,9 @@ srt_vdpau_driver_class_init (SrtVdpauDriverClass *cls)
vdpau_driver_properties[VDPAU_DRIVER_PROP_LIBRARY_PATH] =
g_param_spec_string ("library-path", "Library path",
"Absolute path to the VDPAU driver library",
"Path to the VDPAU driver library. It might be absolute "
"(e.g. /usr/lib/vdpau/libvdpau_radeonsi.so) or relative "
"(e.g. custom/vdpau/libvdpau_radeonsi.so)",
NULL,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
......@@ -3557,6 +3564,14 @@ srt_vdpau_driver_class_init (SrtVdpauDriverClass *cls)
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
vdpau_driver_properties[VDPAU_DRIVER_PROP_RESOLVED_LIBRARY_PATH] =
g_param_spec_string ("resolved-library-path", "Resolved library path",
"Absolute path to the VDPAU driver library. This is similar "
"to 'library-path', but is guaranteed to be an "
"absolute path (e.g. /usr/lib/vdpau/libvdpau_radeonsi.so)",
NULL,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (object_class, N_VDPAU_DRIVER_PROPERTIES,
vdpau_driver_properties);
}
......@@ -3589,7 +3604,7 @@ srt_vdpau_driver_new (const gchar *library_path,
*
* Return the library path for this VDPAU driver.
*
* Returns: (type filename) (transfer none) (nullable): #SrtVdpauDriver:library-path
* Returns: (type filename) (transfer none): #SrtVdpauDriver:library-path
*/
const gchar *
srt_vdpau_driver_get_library_path (SrtVdpauDriver *self)
......@@ -3629,6 +3644,36 @@ srt_vdpau_driver_is_extra (SrtVdpauDriver *self)
return self->is_extra;
}
/**
* srt_vdpau_driver_resolve_library_path:
* @self: The VDPAU driver
*
* Return the absolute library path for this VDPAU driver.
* If srt_vdpau_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
* #SrtVdpauDriver:resolved-library-path. Free with g_free().
*/
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;
}
/**
* SrtVulkanIcd:
*
......
......@@ -197,6 +197,7 @@ GType srt_vdpau_driver_get_type (void);
const gchar *srt_vdpau_driver_get_library_path (SrtVdpauDriver *self);
const gchar *srt_vdpau_driver_get_library_link (SrtVdpauDriver *self);
gboolean srt_vdpau_driver_is_extra (SrtVdpauDriver *self);
gchar *srt_vdpau_driver_resolve_library_path (SrtVdpauDriver *self);
typedef struct _SrtVulkanIcd SrtVulkanIcd;
typedef struct _SrtVulkanIcdClass SrtVulkanIcdClass;
......
......@@ -1807,6 +1807,68 @@ check_list_links (const GList *list,
g_assert_cmpstr (suffixes[i], ==, NULL);
}
static void
check_paths_are_absolute (const GList *list,
SrtGraphicsModule module)
{
const gchar *library_path = NULL;
gchar *absolute_path = NULL;
for (const GList *iter = list; iter != NULL; iter = iter->next)
{
switch (module)
{
case SRT_GRAPHICS_VDPAU_MODULE:
library_path = srt_vdpau_driver_get_library_path (iter->data);
absolute_path = srt_vdpau_driver_resolve_library_path (iter->data);
break;
case SRT_GRAPHICS_DRI_MODULE:
case SRT_GRAPHICS_VAAPI_MODULE:
case SRT_GRAPHICS_GLX_MODULE:
case NUM_SRT_GRAPHICS_MODULES:
default:
g_return_if_reached ();
}
g_assert_cmpstr (library_path, ==, absolute_path);
g_assert_nonnull (library_path);
g_assert_cmpint (library_path[0], ==, '/');
g_free (absolute_path);
}
}
static void
check_paths_are_relative (const GList *list,
SrtGraphicsModule module)
{
const gchar *library_path = NULL;
gchar *absolute_path = NULL;
gsize i = 0;
for (const GList *iter = list; iter != NULL; iter = iter->next, i++)
{
switch (module)
{
case SRT_GRAPHICS_VDPAU_MODULE:
library_path = srt_vdpau_driver_get_library_path (iter->data);
absolute_path = srt_vdpau_driver_resolve_library_path (iter->data);
break;
case SRT_GRAPHICS_DRI_MODULE:
case SRT_GRAPHICS_VAAPI_MODULE:
case SRT_GRAPHICS_GLX_MODULE:
case NUM_SRT_GRAPHICS_MODULES:
default:
g_return_if_reached ();
}
g_assert_cmpstr (library_path, !=, absolute_path);
g_assert_nonnull (library_path);
g_assert_nonnull (absolute_path);
g_assert_cmpint (library_path[0], !=, '/');
g_assert_cmpint (absolute_path[0], ==, '/');
assert_same_file (library_path, absolute_path);
g_free (absolute_path);
}
}
static void
test_dri_debian10 (Fixture *f,
gconstpointer context)
......@@ -2132,11 +2194,13 @@ test_vdpau_debian10 (Fixture *f,
vdpau = srt_system_info_list_vdpau_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE);
check_list_suffixes (vdpau, vdpau_suffixes_i386, SRT_GRAPHICS_VDPAU_MODULE);
check_list_links (vdpau, vdpau_links_i386, SRT_GRAPHICS_VDPAU_MODULE);
check_paths_are_absolute (vdpau, SRT_GRAPHICS_VDPAU_MODULE);
g_list_free_full (vdpau, g_object_unref);
vdpau = srt_system_info_list_vdpau_drivers (info, multiarch_tuples[1], SRT_DRIVER_FLAGS_NONE);
check_list_suffixes (vdpau, vdpau_suffixes_x86_64, SRT_GRAPHICS_VDPAU_MODULE);
check_list_links (vdpau, vdpau_links_x86_64, SRT_GRAPHICS_VDPAU_MODULE);
check_paths_are_absolute (vdpau, SRT_GRAPHICS_VDPAU_MODULE);
g_list_free_full (vdpau, g_object_unref);
g_object_unref (info);
......@@ -2250,6 +2314,17 @@ test_vdpau_with_env (Fixture *f,
check_list_extra (vdpau, G_N_ELEMENTS(vdpau_suffixes)-1, SRT_GRAPHICS_VDPAU_MODULE);
g_list_free_full (vdpau, g_object_unref);
/* Test a vdpau relative path */
g_free (vdpau_path);
vdpau_path = g_build_filename ("sysroots", "no-os-release", "custom_path32", "vdpau", NULL);
envp = g_environ_setenv (envp, "VDPAU_DRIVER_PATH", vdpau_path, TRUE);
srt_system_info_set_environ (info, envp);
vdpau = srt_system_info_list_vdpau_drivers (info, multiarch_tuples[0], SRT_DRIVER_FLAGS_NONE);
check_list_suffixes (vdpau, vdpau_suffixes, SRT_GRAPHICS_VDPAU_MODULE);
check_list_links (vdpau, vdpau_links, SRT_GRAPHICS_VDPAU_MODULE);
check_paths_are_relative (vdpau, SRT_GRAPHICS_VDPAU_MODULE);
g_list_free_full (vdpau, g_object_unref);
g_object_unref (info);
g_free (sysroot);
g_free (vdpau_path);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment