From c980335b5858746772cb7b9588ca709c5d2dfa23 Mon Sep 17 00:00:00 2001 From: Phil Jones Date: Fri, 10 Jun 2022 00:44:42 +0100 Subject: Delay second buffer initialisation. We don't actually need to initialise our second Cairo context / surface until after the first one has been painted to the screen. This commit therefore delays this initialisation (or at least the expensive memcpy), granting a significant reduction in startup time. The downside is that main() and entry_init() are now tied together somewhat, but hopefully the comments help. --- src/main.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/main.c') diff --git a/src/main.c b/src/main.c index f3fab1d..e3073df 100644 --- a/src/main.c +++ b/src/main.c @@ -819,6 +819,20 @@ int main(int argc, char *argv[]) &tofi.window.entry.background_color, &tofi.window.entry.image); + /* + * entry_init() left the second of the two buffers we use for + * double-buffering unpainted to lower startup time, as described + * there. Here, we flush our first, finished buffer to the screen, then + * copy over the image to the second buffer before we need to use it in + * the main loop. This ensures we paint to the screen as quickly as + * possible after startup. + */ + wl_display_roundtrip(tofi.wl_display); + memcpy( + cairo_image_surface_get_data(tofi.window.entry.cairo[1].surface), + cairo_image_surface_get_data(tofi.window.entry.cairo[0].surface), + tofi.window.entry.image.width * tofi.window.entry.image.height * sizeof(uint32_t) + ); /* We've just rendered, so we don't need to do it again right now. */ tofi.window.surface.redraw = false; -- cgit v1.2.3