From 160f91b8e13a2253e4444caeb41cb3230472bf01 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Tue, 20 Jun 2023 01:38:58 +0100 Subject: [PATCH] surface: Only rebuild surface size where necessary The only time we need to go through recalculating the surface size is when either the buffer dimensions or the surface transforms have changed. Now that we have dirty flags, use them to avoid a calculation where required. Signed-off-by: Daniel Stone --- libweston/compositor.c | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/libweston/compositor.c b/libweston/compositor.c index 428dee76..e0030aa9 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -2671,13 +2671,10 @@ bind_single_pixel_buffer(struct wl_client *client, void *data, uint32_t version, static enum weston_surface_status weston_surface_attach(struct weston_surface *surface, - struct weston_surface_state *state) + struct weston_surface_state *state, + enum weston_surface_status status) { - struct weston_buffer_viewport *vp = &state->buffer_viewport; - int32_t old_width = surface->width_from_buffer; - int32_t old_height = surface->height_from_buffer; struct weston_buffer *buffer = state->buffer; - enum weston_surface_status status = WESTON_SURFACE_CLEAN; if (!buffer) { if (weston_surface_is_mapped(surface)) { @@ -2698,16 +2695,28 @@ weston_surface_attach(struct weston_surface *surface, return status; } - convert_size_by_transform_scale(&surface->width_from_buffer, - &surface->height_from_buffer, - buffer->width, - buffer->height, - vp->buffer.transform, - vp->buffer.scale); + /* Recalculate the surface size if the buffer dimensions or the + * surface transforms (viewport, rotation/mirror, scale) have + * changed. */ + if (!surface->buffer_ref.buffer || + buffer->width != surface->buffer_ref.buffer->width || + buffer->height != surface->buffer_ref.buffer->height || + (status & WESTON_SURFACE_DIRTY_SIZE)) { + struct weston_buffer_viewport *vp = &state->buffer_viewport; + int32_t old_width = surface->width_from_buffer; + int32_t old_height = surface->height_from_buffer; - if (surface->width_from_buffer != old_width || - surface->height_from_buffer != old_height) { - status |= WESTON_SURFACE_DIRTY_SIZE; + convert_size_by_transform_scale(&surface->width_from_buffer, + &surface->height_from_buffer, + buffer->width, + buffer->height, + vp->buffer.transform, + vp->buffer.scale); + + if (surface->width_from_buffer != old_width || + surface->height_from_buffer != old_height) { + status |= WESTON_SURFACE_DIRTY_SIZE; + } } status |= WESTON_SURFACE_DIRTY_BUFFER; @@ -4125,7 +4134,7 @@ weston_surface_commit_state(struct weston_surface *surface, /* wp_presentation.feedback */ weston_presentation_feedback_discard_list(&surface->feedback_list); - status |= weston_surface_attach(surface, state); + status |= weston_surface_attach(surface, state, status); } weston_surface_state_set_buffer(state, NULL); assert(state->acquire_fence_fd == -1);