From 61abf35ec4b1f64056810bb0aa1623d971f8af16 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Fri, 6 Mar 2020 12:46:30 +0000 Subject: [PATCH] pixman-renderer: Replace output-create flags with struct pixman_renderer_output_create currently takes a flags enum bitmask for its options. Switch this to using a structure, so we can introduce other non-boolean options. Signed-off-by: Daniel Stone --- libweston/backend-drm/drm.c | 9 ++++----- libweston/backend-fbdev/fbdev.c | 6 ++++-- libweston/backend-headless/headless.c | 7 +++++-- libweston/backend-rdp/rdp.c | 9 ++++++--- libweston/backend-wayland/wayland.c | 6 ++++-- libweston/backend-x11/x11.c | 12 ++++++++---- libweston/pixman-renderer.c | 5 +++-- libweston/pixman-renderer.h | 8 +++++--- 8 files changed, 39 insertions(+), 23 deletions(-) diff --git a/libweston/backend-drm/drm.c b/libweston/backend-drm/drm.c index 11936115..3c5ca65a 100644 --- a/libweston/backend-drm/drm.c +++ b/libweston/backend-drm/drm.c @@ -1179,7 +1179,9 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b) uint32_t format = output->gbm_format; uint32_t pixman_format; unsigned int i; - uint32_t flags = 0; + const struct pixman_renderer_output_options options = { + .use_shadow = b->use_pixman_shadow, + }; switch (format) { case DRM_FORMAT_XRGB8888: @@ -1207,10 +1209,7 @@ drm_output_init_pixman(struct drm_output *output, struct drm_backend *b) goto err; } - if (b->use_pixman_shadow) - flags |= PIXMAN_RENDERER_OUTPUT_USE_SHADOW; - - if (pixman_renderer_output_create(&output->base, flags) < 0) + if (pixman_renderer_output_create(&output->base, &options) < 0) goto err; weston_log("DRM: output %s %s shadow framebuffer.\n", output->base.name, diff --git a/libweston/backend-fbdev/fbdev.c b/libweston/backend-fbdev/fbdev.c index ae289cc0..a43f648e 100644 --- a/libweston/backend-fbdev/fbdev.c +++ b/libweston/backend-fbdev/fbdev.c @@ -528,6 +528,9 @@ fbdev_output_enable(struct weston_output *base) struct fbdev_head *head; int fb_fd; struct wl_event_loop *loop; + const struct pixman_renderer_output_options options = { + .use_shadow = true, + }; head = fbdev_output_get_head(output); @@ -546,8 +549,7 @@ fbdev_output_enable(struct weston_output *base) output->base.start_repaint_loop = fbdev_output_start_repaint_loop; output->base.repaint = fbdev_output_repaint; - if (pixman_renderer_output_create(&output->base, - PIXMAN_RENDERER_OUTPUT_USE_SHADOW) < 0) + if (pixman_renderer_output_create(&output->base, &options) < 0) goto out_hw_surface; loop = wl_display_get_event_loop(backend->compositor->wl_display); diff --git a/libweston/backend-headless/headless.c b/libweston/backend-headless/headless.c index 76e52906..c312a0f2 100644 --- a/libweston/backend-headless/headless.c +++ b/libweston/backend-headless/headless.c @@ -214,6 +214,10 @@ headless_output_enable_gl(struct headless_output *output) static int headless_output_enable_pixman(struct headless_output *output) { + const struct pixman_renderer_output_options options = { + .use_shadow = true, + }; + output->image_buf = malloc(output->base.current_mode->width * output->base.current_mode->height * 4); if (!output->image_buf) @@ -225,8 +229,7 @@ headless_output_enable_pixman(struct headless_output *output) output->image_buf, output->base.current_mode->width * 4); - if (pixman_renderer_output_create(&output->base, - PIXMAN_RENDERER_OUTPUT_USE_SHADOW) < 0) + if (pixman_renderer_output_create(&output->base, &options) < 0) goto err_renderer; pixman_renderer_output_set_buffer(&output->base, output->image); diff --git a/libweston/backend-rdp/rdp.c b/libweston/backend-rdp/rdp.c index ce91cedd..2b33d29c 100644 --- a/libweston/backend-rdp/rdp.c +++ b/libweston/backend-rdp/rdp.c @@ -468,6 +468,7 @@ rdp_switch_mode(struct weston_output *output, struct weston_mode *target_mode) rdpSettings *settings; pixman_image_t *new_shadow_buffer; struct weston_mode *local_mode; + const struct pixman_renderer_output_options options = { }; local_mode = ensure_matching_mode(output, target_mode); if (!local_mode) { @@ -484,7 +485,7 @@ rdp_switch_mode(struct weston_output *output, struct weston_mode *target_mode) output->current_mode->flags |= WL_OUTPUT_MODE_CURRENT; pixman_renderer_output_destroy(output); - pixman_renderer_output_create(output, 0); + pixman_renderer_output_create(output, &options); new_shadow_buffer = pixman_image_create_bits(PIXMAN_x8r8g8b8, target_mode->width, target_mode->height, 0, target_mode->width * 4); @@ -560,6 +561,9 @@ rdp_output_enable(struct weston_output *base) struct rdp_output *output = to_rdp_output(base); struct rdp_backend *b = to_rdp_backend(base->compositor); struct wl_event_loop *loop; + const struct pixman_renderer_output_options options = { + .use_shadow = true, + }; output->shadow_surface = pixman_image_create_bits(PIXMAN_x8r8g8b8, output->base.current_mode->width, @@ -571,8 +575,7 @@ rdp_output_enable(struct weston_output *base) return -1; } - if (pixman_renderer_output_create(&output->base, - PIXMAN_RENDERER_OUTPUT_USE_SHADOW) < 0) { + if (pixman_renderer_output_create(&output->base, &options) < 0) { pixman_image_unref(output->shadow_surface); return -1; } diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c index 0224865c..60d42bf3 100644 --- a/libweston/backend-wayland/wayland.c +++ b/libweston/backend-wayland/wayland.c @@ -799,8 +799,10 @@ cleanup_window: static int wayland_output_init_pixman_renderer(struct wayland_output *output) { - return pixman_renderer_output_create(&output->base, - PIXMAN_RENDERER_OUTPUT_USE_SHADOW); + const struct pixman_renderer_output_options options = { + .use_shadow = true, + }; + return pixman_renderer_output_create(&output->base, &options); } static void diff --git a/libweston/backend-x11/x11.c b/libweston/backend-x11/x11.c index dad0849f..387e97a4 100644 --- a/libweston/backend-x11/x11.c +++ b/libweston/backend-x11/x11.c @@ -836,6 +836,9 @@ x11_output_switch_mode(struct weston_output *base, struct weston_mode *mode) output->mode.height = mode->height; if (b->use_pixman) { + const struct pixman_renderer_output_options options = { + .use_shadow = true, + }; pixman_renderer_output_destroy(&output->base); x11_output_deinit_shm(b, output); @@ -846,8 +849,7 @@ x11_output_switch_mode(struct weston_output *base, struct weston_mode *mode) return -1; } - if (pixman_renderer_output_create(&output->base, - PIXMAN_RENDERER_OUTPUT_USE_SHADOW) < 0) { + if (pixman_renderer_output_create(&output->base, &options) < 0) { weston_log("Failed to create pixman renderer for output\n"); x11_output_deinit_shm(b, output); return -1; @@ -1014,14 +1016,16 @@ x11_output_enable(struct weston_output *base) x11_output_wait_for_map(b, output); if (b->use_pixman) { + const struct pixman_renderer_output_options options = { + .use_shadow = true, + }; if (x11_output_init_shm(b, output, output->base.current_mode->width, output->base.current_mode->height) < 0) { weston_log("Failed to initialize SHM for the X11 output\n"); goto err; } - if (pixman_renderer_output_create(&output->base, - PIXMAN_RENDERER_OUTPUT_USE_SHADOW) < 0) { + if (pixman_renderer_output_create(&output->base, &options) < 0) { weston_log("Failed to create pixman renderer for output\n"); x11_output_deinit_shm(b, output); goto err; diff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c index 51324e9a..59b1f0ff 100644 --- a/libweston/pixman-renderer.c +++ b/libweston/pixman-renderer.c @@ -924,7 +924,8 @@ pixman_renderer_output_set_hw_extra_damage(struct weston_output *output, } WL_EXPORT int -pixman_renderer_output_create(struct weston_output *output, uint32_t flags) +pixman_renderer_output_create(struct weston_output *output, + const struct pixman_renderer_output_options *options) { struct pixman_output_state *po; int w, h; @@ -933,7 +934,7 @@ pixman_renderer_output_create(struct weston_output *output, uint32_t flags) if (po == NULL) return -1; - if (flags & PIXMAN_RENDERER_OUTPUT_USE_SHADOW) { + if (options->use_shadow) { /* set shadow image transformation */ w = output->current_mode->width; h = output->current_mode->height; diff --git a/libweston/pixman-renderer.h b/libweston/pixman-renderer.h index f53ae2a3..2b81dde5 100644 --- a/libweston/pixman-renderer.h +++ b/libweston/pixman-renderer.h @@ -32,12 +32,14 @@ int pixman_renderer_init(struct weston_compositor *ec); -enum pixman_renderer_output_flags { - PIXMAN_RENDERER_OUTPUT_USE_SHADOW = (1 << 0), +struct pixman_renderer_output_options { + /** Composite into a shadow buffer, copying to the hardware buffer */ + bool use_shadow; }; int -pixman_renderer_output_create(struct weston_output *output, uint32_t flags); +pixman_renderer_output_create(struct weston_output *output, + const struct pixman_renderer_output_options *options); void pixman_renderer_output_set_buffer(struct weston_output *output,