From 70f2ed850b0043244ac7e5340045f96dd1378c8c Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 12 Oct 2019 16:26:08 +0200 Subject: [PATCH 1/2] drm: Delay installing our framebuffer until the first draw Instead of installing a framebuffer with uninitialized contents, delay installing our framebuffer until the first (re)draw. This fixes some ugly flashes when plymout loads in some cases and it also removes a FIXME comment from the code. Signed-off-by: Hans de Goede --- src/plugins/renderers/drm/plugin.c | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c index 090be788..5f25099d 100644 --- a/src/plugins/renderers/drm/plugin.c +++ b/src/plugins/renderers/drm/plugin.c @@ -163,8 +163,6 @@ struct _ply_renderer_backend }; ply_renderer_plugin_interface_t *ply_renderer_backend_get_interface (void); -static void ply_renderer_head_redraw (ply_renderer_backend_t *backend, - ply_renderer_head_t *head); static bool open_input_source (ply_renderer_backend_t *backend, ply_renderer_input_source_t *input_source); static bool reset_scan_out_buffer_if_needed (ply_renderer_backend_t *backend, @@ -1536,13 +1534,8 @@ map_to_device (ply_renderer_backend_t *backend) head = (ply_renderer_head_t *) ply_list_node_get_data (node); next_node = ply_list_get_next_node (backend->heads, node); - if (ply_renderer_head_map (backend, head)) { - /* FIXME: Maybe we should blit the fbcon contents instead of the (blank) - * shadow buffer? - */ - ply_renderer_head_redraw (backend, head); + if (ply_renderer_head_map (backend, head)) head_mapped = true; - } node = next_node; } @@ -1666,21 +1659,6 @@ flush_head (ply_renderer_backend_t *backend, ply_region_clear (updated_region); } -static void -ply_renderer_head_redraw (ply_renderer_backend_t *backend, - ply_renderer_head_t *head) -{ - ply_region_t *region; - - ply_trace ("Redrawing %ldx%ld renderer head", head->area.width, head->area.height); - - region = ply_pixel_buffer_get_updated_areas (head->pixel_buffer); - - ply_region_add_rectangle (region, &head->area); - - flush_head (backend, head); -} - static ply_list_t * get_heads (ply_renderer_backend_t *backend) { From ea71bbfaf7b6fc07a5e3b08f8b461d38266224bb Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Sat, 12 Oct 2019 16:31:04 +0200 Subject: [PATCH 2/2] drm: Install our fb after drawing to it If we need to (re)install our fb as the buffer to scan-out of during flush, then do so after updating our fb contents, rather then before. This removes another potential source of flickering. Signed-off-by: Hans de Goede --- src/plugins/renderers/drm/plugin.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/plugins/renderers/drm/plugin.c b/src/plugins/renderers/drm/plugin.c index 5f25099d..0b7aad3e 100644 --- a/src/plugins/renderers/drm/plugin.c +++ b/src/plugins/renderers/drm/plugin.c @@ -1614,6 +1614,7 @@ flush_head (ply_renderer_backend_t *backend, ply_list_node_t *node; ply_pixel_buffer_t *pixel_buffer; char *map_address; + bool dirty = false; assert (backend != NULL); @@ -1645,16 +1646,19 @@ flush_head (ply_renderer_backend_t *backend, next_node = ply_list_get_next_node (areas_to_flush, node); - if (reset_scan_out_buffer_if_needed (backend, head)) - ply_trace ("Needed to reset scan out buffer on %ldx%ld renderer head", - head->area.width, head->area.height); - ply_renderer_head_flush_area (head, area_to_flush, map_address); + dirty = true; node = next_node; } - end_flush (backend, head->scan_out_buffer_id); + if (dirty) { + if (reset_scan_out_buffer_if_needed (backend, head)) + ply_trace ("Needed to reset scan out buffer on %ldx%ld renderer head", + head->area.width, head->area.height); + + end_flush (backend, head->scan_out_buffer_id); + } ply_region_clear (updated_region); }