]> git.ipfire.org Git - thirdparty/plymouth.git/commitdiff
libply-splash-core: Add a force argument to ply_renderer_open ()
authorHans de Goede <hdegoede@redhat.com>
Tue, 4 Mar 2025 14:22:45 +0000 (15:22 +0100)
committerHans de Goede <hdegoede@redhat.com>
Mon, 10 Mar 2025 10:46:58 +0000 (11:46 +0100)
Sometimes a renderer plugin may want to refuse to open a device
because it has suboptimal settings, like e.g. an EFI framebuffer
based simpledrm when the EFI firmware has set the resolution to
800x600 instead of the native panel resolution.

In such a case it might be better to wait for another better
/dev/dri/card# device to show up.

This skipping of devices by renderer plugins needs to be configurable
in case the timeout hits, or the user wishes to override things.

Add a force argument to ply_renderer_open () to allow overriding
this behavior. User can force using simpledrm by passing
plymouth.use-simpledrm=2 on the kernel commandline or by setting
UseSimpledrm=2 in the config-file.

This flag is passed to the renderer plugin's query_device () method
as that is the best place for the renderer plugin to determine
a device's usability.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
src/libply-splash-core/ply-device-manager.c
src/libply-splash-core/ply-device-manager.h
src/libply-splash-core/ply-renderer-plugin.h
src/libply-splash-core/ply-renderer.c
src/libply-splash-core/ply-renderer.h
src/main.c
src/plugins/renderers/drm/plugin.c
src/plugins/renderers/frame-buffer/plugin.c
src/plugins/renderers/x11/plugin.c

index 79c44283942c880f35e869808ec30a06c659dd90..fd54d3a9dbd7dde8bc6578b67b308c1e50e363f0 100644 (file)
@@ -1120,9 +1120,12 @@ create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
 
         if (renderer_type != PLY_RENDERER_TYPE_NONE) {
                 ply_renderer_t *old_renderer = NULL;
+                bool force = manager->device_timeout_elapsed ||
+                             (manager->flags & PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN);
+
                 renderer = ply_renderer_new (renderer_type, device_path, terminal);
 
-                if (renderer != NULL && !ply_renderer_open (renderer)) {
+                if (renderer != NULL && !ply_renderer_open (renderer, force)) {
                         ply_trace ("could not open renderer for %s", device_path);
                         ply_renderer_free (renderer);
                         renderer = NULL;
index dea30917ce8e686032f6373c006a1497d3034ee3..fb5e1cf7d39e95567979c42fd6bdfba2d4045218 100644 (file)
@@ -35,6 +35,7 @@ typedef enum
         PLY_DEVICE_MANAGER_FLAGS_SKIP_RENDERERS         = 1 << 2,
         PLY_DEVICE_MANAGER_FLAGS_FORCE_FRAME_BUFFER     = 1 << 3,
         PLY_DEVICE_MANAGER_FLAGS_USE_SIMPLEDRM          = 1 << 4,
+        PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN             = 1 << 5,
 } ply_device_manager_flags_t;
 
 typedef struct _ply_device_manager ply_device_manager_t;
index 483ad27c3ff94bbd8356a3411bce68502968a892..d9f31de9f6f277317eb2a9b470f4ec26417edad3 100644 (file)
@@ -43,7 +43,8 @@ typedef struct
         void (*destroy_backend)(ply_renderer_backend_t *backend);
         bool (*open_device)(ply_renderer_backend_t *backend);
         void (*close_device)(ply_renderer_backend_t *backend);
-        bool (*query_device)(ply_renderer_backend_t *backend);
+        bool (*query_device)(ply_renderer_backend_t *backend,
+                             bool                    force);
         bool (*handle_change_event)(ply_renderer_backend_t *backend);
         bool (*map_to_device)(ply_renderer_backend_t *backend);
         void (*unmap_from_device)(ply_renderer_backend_t *backend);
index 61c59ccc2630beeeae17dcf22592f575249f05e5..2c555f464dc881f5b49df04745babf86043d1c77 100644 (file)
@@ -199,12 +199,13 @@ ply_renderer_close_device (ply_renderer_t *renderer)
 }
 
 static bool
-ply_renderer_query_device (ply_renderer_t *renderer)
+ply_renderer_query_device (ply_renderer_t *renderer,
+                           bool            force)
 {
         assert (renderer != NULL);
         assert (renderer->plugin_interface != NULL);
 
-        return renderer->plugin_interface->query_device (renderer->backend);
+        return renderer->plugin_interface->query_device (renderer->backend, force);
 }
 
 static bool
@@ -236,7 +237,8 @@ ply_renderer_unmap_from_device (ply_renderer_t *renderer)
 
 static bool
 ply_renderer_open_plugin (ply_renderer_t *renderer,
-                          const char     *plugin_path)
+                          const char     *plugin_path,
+                          bool            force)
 {
         ply_trace ("trying to open renderer plugin %s", plugin_path);
 
@@ -250,7 +252,7 @@ ply_renderer_open_plugin (ply_renderer_t *renderer,
                 return false;
         }
 
-        if (!ply_renderer_query_device (renderer)) {
+        if (!ply_renderer_query_device (renderer, force)) {
                 ply_trace ("could not query rendering device for plugin %s",
                            plugin_path);
                 ply_renderer_close_device (renderer);
@@ -263,7 +265,8 @@ ply_renderer_open_plugin (ply_renderer_t *renderer,
 }
 
 bool
-ply_renderer_open (ply_renderer_t *renderer)
+ply_renderer_open (ply_renderer_t *renderer,
+                   bool            force)
 {
         int i;
 
@@ -284,7 +287,7 @@ ply_renderer_open (ply_renderer_t *renderer)
         for (i = 0; known_plugins[i].type != PLY_RENDERER_TYPE_NONE; i++) {
                 if (renderer->type == known_plugins[i].type ||
                     renderer->type == PLY_RENDERER_TYPE_AUTO) {
-                        if (ply_renderer_open_plugin (renderer, known_plugins[i].path)) {
+                        if (ply_renderer_open_plugin (renderer, known_plugins[i].path, force)) {
                                 renderer->is_active = true;
                                 goto out;
                         }
index cfd4f2ddea1522231f7ec0edbce921264a42bf08..5ba181189d5616654d411eea4245955e8a858d65 100644 (file)
@@ -55,7 +55,8 @@ ply_renderer_t *ply_renderer_new (ply_renderer_type_t renderer_type,
                                   const char         *device_name,
                                   ply_terminal_t     *terminal);
 void ply_renderer_free (ply_renderer_t *renderer);
-bool ply_renderer_open (ply_renderer_t *renderer);
+bool ply_renderer_open (ply_renderer_t *renderer,
+                        bool            force);
 void ply_renderer_close (ply_renderer_t *renderer);
 /* Returns true when the heads have changed as a result of the change event */
 bool ply_renderer_handle_change_event (ply_renderer_t *renderer);
index 56d366ebf468cce0588ebb1b75b60aab90d1c398..d9ba7340b34e30cec1a7b0afb679431cfb40d1a3 100644 (file)
@@ -412,7 +412,7 @@ find_override_splash (state_t *state)
                 if (ply_kernel_command_line_has_argument ("plymouth.use-simpledrm"))
                         state->use_simpledrm = 1;
                 else if (ply_kernel_command_line_has_argument ("nomodeset"))
-                        state->use_simpledrm = 1;
+                        state->use_simpledrm = 2;
         }
 }
 
@@ -2582,6 +2582,9 @@ main (int    argc,
         if (state.use_simpledrm >= 1)
                 device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_USE_SIMPLEDRM;
 
+        if (state.use_simpledrm >= 2)
+                device_manager_flags |= PLY_DEVICE_MANAGER_FLAGS_FORCE_OPEN;
+
         load_devices (&state, device_manager_flags);
 
         ply_trace ("entering event loop");
index e09c7b3edc4086878cdd06b6c02cc63aa2d3755f..2fddaee4b03617f5272b1a97f00d843a797454af 100644 (file)
@@ -1563,7 +1563,8 @@ has_32bpp_support (ply_renderer_backend_t *backend)
 }
 
 static bool
-query_device (ply_renderer_backend_t *backend)
+query_device (ply_renderer_backend_t *backend,
+              bool                    force)
 {
         bool ret = true;
 
index 8f341d071d862471ce0601556167b30202810dec..7d74bdc284dbcbeb9822be377260ff09d6ca4ddd 100644 (file)
@@ -420,7 +420,8 @@ static const char *get_visual_name (int visual)
 }
 
 static bool
-query_device (ply_renderer_backend_t *backend)
+query_device (ply_renderer_backend_t *backend,
+              bool                    force)
 {
         struct fb_var_screeninfo variable_screen_info;
         struct fb_fix_screeninfo fixed_screen_info;
index a673a40d9d1cdf9bff0597533ff40a56bed603df..87aa7a93c22e3cd499f070c7f84ae10d6942b59a 100644 (file)
@@ -284,7 +284,8 @@ create_fullscreen_single_head_setup (ply_renderer_backend_t *backend)
 }
 
 static bool
-query_device (ply_renderer_backend_t *backend)
+query_device (ply_renderer_backend_t *backend,
+              bool                    force)
 {
         assert (backend != NULL);