From c08a6ff8bd6e1839a8fd7fe87602df9a1a8b62e2 Mon Sep 17 00:00:00 2001 From: Derek Foreman Date: Wed, 5 Jun 2024 14:50:27 -0500 Subject: [PATCH] compositor/renderer: Only attach buffer to renderer in repaint Instead of doing this in several places, just do it when we're updating the paint nodes in the repaint loop, or when we're about to copy content via weston_surface_copy_content(). Signed-off-by: Derek Foreman --- libweston/compositor.c | 9 ++++++--- libweston/pixman-renderer.c | 2 ++ libweston/renderer-gl/gl-renderer.c | 16 +++++++--------- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/libweston/compositor.c b/libweston/compositor.c index f55833721..e886d93e6 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -221,9 +221,11 @@ paint_node_update_early(struct weston_paint_node *pnode) static void paint_node_update_late(struct weston_paint_node *pnode) { + struct weston_surface *surf = pnode->surface; bool vis_dirty = pnode->status & PAINT_NODE_VISIBILITY_DIRTY; bool plane_dirty = pnode->status & PAINT_NODE_PLANE_DIRTY; bool content_dirty = pnode->status & PAINT_NODE_CONTENT_DIRTY; + bool buffer_dirty = pnode->status & PAINT_NODE_BUFFER_DIRTY; /* The geoemtry may be shrinking, so we shouldn't just * add the old visible region to our damage region, because @@ -264,6 +266,10 @@ paint_node_update_late(struct weston_paint_node *pnode) pnode->plane_next = NULL; } + if (buffer_dirty) + surf->compositor->renderer->attach(surf, + surf->buffer_ref.buffer); + pnode->status &= ~(PAINT_NODE_VISIBILITY_DIRTY | PAINT_NODE_PLANE_DIRTY | PAINT_NODE_CONTENT_DIRTY | @@ -2981,7 +2987,6 @@ weston_surface_attach_solid(struct weston_surface *surface, assert(buffer->type == WESTON_BUFFER_SOLID); weston_buffer_reference(&surface->buffer_ref, buffer, BUFFER_MAY_BE_ACCESSED); - surface->compositor->renderer->attach(surface, buffer); weston_surface_set_size(surface, w, h); @@ -3117,7 +3122,6 @@ weston_surface_attach(struct weston_surface *surface, weston_buffer_reference(&surface->buffer_ref, NULL, BUFFER_WILL_NOT_BE_ACCESSED); - surface->compositor->renderer->attach(surface, buffer); surface->width_from_buffer = 0; surface->height_from_buffer = 0; @@ -3162,7 +3166,6 @@ weston_surface_attach(struct weston_surface *surface, old_buffer = NULL; weston_buffer_reference(&surface->buffer_ref, buffer, BUFFER_MAY_BE_ACCESSED); - surface->compositor->renderer->attach(surface, buffer); return status; } diff --git a/libweston/pixman-renderer.c b/libweston/pixman-renderer.c index b9053ff68..5dfecdf67 100644 --- a/libweston/pixman-renderer.c +++ b/libweston/pixman-renderer.c @@ -897,6 +897,8 @@ pixman_renderer_surface_copy_content(struct weston_surface *surface, if (!ps->image) return -1; + pixman_renderer_attach(surface, surface->buffer_ref.buffer); + out_buf = pixman_image_create_bits(format, width, height, target, width * bytespp); diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index e59eee967..35910d3af 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -3487,8 +3487,6 @@ gl_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer) { struct gl_surface_state *gs = get_surface_state(es); - /* If get_surface_state called gl_renderer_create_surface, it did - * attach the buffer */ if (gs->buffer_ref.buffer == buffer) return; @@ -3593,15 +3591,19 @@ gl_renderer_surface_copy_content(struct weston_surface *surface, const size_t bytespp = 4; /* PIXMAN_a8b8g8r8 */ const GLenum gl_format = GL_RGBA; /* PIXMAN_a8b8g8r8 little-endian */ struct gl_renderer *gr = get_renderer(surface->compositor); - struct gl_surface_state *gs = get_surface_state(surface); - struct gl_buffer_state *gb = gs->buffer; - struct weston_buffer *buffer = gs->buffer_ref.buffer; + struct gl_surface_state *gs; + struct gl_buffer_state *gb; + struct weston_buffer *buffer; int cw, ch; GLuint fbo; GLuint tex; GLenum status; int ret = -1; + gl_renderer_attach(surface, surface->buffer_ref.buffer); + gs = get_surface_state(surface); + gb = gs->buffer; + buffer = gs->buffer_ref.buffer; assert(buffer); cw = buffer->width; @@ -3750,10 +3752,6 @@ gl_renderer_create_surface(struct weston_surface *surface) wl_signal_add(&gr->destroy_signal, &gs->renderer_destroy_listener); - if (surface->buffer_ref.buffer) { - gl_renderer_attach(surface, surface->buffer_ref.buffer); - } - return 0; }