diff --git a/libweston/backend-drm/state-propose.c b/libweston/backend-drm/state-propose.c index 5a2eba616..0338d4e82 100644 --- a/libweston/backend-drm/state-propose.c +++ b/libweston/backend-drm/state-propose.c @@ -876,8 +876,7 @@ drm_output_propose_state(struct weston_output *output_base, continue; } - if (pnode->view->alpha == 0.0f || - (pnode->draw_solid && pnode->solid.a == 0.0f)) { + if (pnode->is_fully_transparent) { drm_debug(b, "\t\t\t\t[view] ignoring view %p " \ "(fully transparent)\n", ev); continue; diff --git a/libweston/compositor.c b/libweston/compositor.c index 66de378a6..2e5d41249 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -226,13 +226,19 @@ paint_node_update_early(struct weston_paint_node *pnode) buffer = pnode->surface->buffer_ref.buffer; pnode->draw_solid = false; + pnode->is_fully_transparent = false; if (buffer->type == WESTON_BUFFER_SOLID) { pnode->draw_solid = true; pnode->is_fully_opaque = (buffer->solid.a == 1.0f); pnode->is_fully_blended = !pnode->is_fully_opaque; pnode->solid = buffer->solid; + if (pnode->solid.a == 0.0f) + pnode->is_fully_transparent = true; } + if (pnode->view->alpha == 0.0f) + pnode->is_fully_transparent = true; + /* Check for 2 types of censor requirements * - recording_censor: Censor protected view when a * protected view is captured. @@ -326,6 +332,7 @@ paint_node_update_late(struct weston_paint_node *pnode) pnode->draw_solid = true; pnode->is_fully_opaque = true; pnode->is_fully_blended = false; + pnode->is_fully_transparent = false; pnode->solid = (struct weston_solid_buffer_values) { 0.0, 0.0, 0.0, 0.0 }; diff --git a/libweston/libweston-internal.h b/libweston/libweston-internal.h index 2bcab6505..fb8c63c46 100644 --- a/libweston/libweston-internal.h +++ b/libweston/libweston-internal.h @@ -724,6 +724,12 @@ struct weston_paint_node { bool is_fully_opaque; bool is_fully_blended; bool draw_solid; + + /* This node's buffer or view alpha causes it to be completely + * transparent, so it can be optimized away or skipped for + * plane assignment. + */ + bool is_fully_transparent; struct weston_solid_buffer_values solid; bool need_hole; uint32_t psf_flags; /* presentation-feedback flags */ diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index ef9b792e5..b3c117884 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -2070,8 +2070,7 @@ draw_paint_node(struct weston_paint_node *pnode, if (!pixman_region32_not_empty(&repaint)) goto out; - if (pnode->view->alpha == 0.0f || - (pnode->draw_solid && pnode->solid.a == 0.0f)) { + if (pnode->is_fully_transparent) { gs->used_in_output_repaint = true; /* sort of */ goto out; }