mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-05 14:38:07 +02:00
gl-renderer: Cache and defer blend state update to draw call
This slightly minimises state changes. Signed-off-by: Loïc Molinari <loic.molinari@collabora.com>
This commit is contained in:
parent
e18e3b6c4a
commit
da393fd468
2 changed files with 21 additions and 9 deletions
|
|
@ -485,6 +485,8 @@ struct gl_renderer {
|
|||
GLenum pbo_usage;
|
||||
enum gl_bgra8_texture_support bgra8_texture_support;
|
||||
|
||||
bool blend_state;
|
||||
|
||||
struct wl_list dmabuf_images;
|
||||
struct wl_list dmabuf_formats;
|
||||
struct wl_list pending_capture_list;
|
||||
|
|
|
|||
|
|
@ -1636,6 +1636,20 @@ set_debug_mode(struct gl_renderer *gr,
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_blend_state(struct gl_renderer *gr,
|
||||
bool state)
|
||||
{
|
||||
if (gr->blend_state == state)
|
||||
return;
|
||||
|
||||
if (state)
|
||||
glEnable(GL_BLEND);
|
||||
else
|
||||
glDisable(GL_BLEND);
|
||||
gr->blend_state = state;
|
||||
}
|
||||
|
||||
static void
|
||||
draw_mesh(struct gl_renderer *gr,
|
||||
struct weston_paint_node *pnode,
|
||||
|
|
@ -1652,6 +1666,8 @@ draw_mesh(struct gl_renderer *gr,
|
|||
|
||||
assert(nidx > 0);
|
||||
|
||||
set_blend_state(gr, !opaque || pnode->view->alpha < 1.0);
|
||||
|
||||
/* Prevent translucent surfaces from punching holes through the
|
||||
* renderbuffer. */
|
||||
if (gb->shader_variant == SHADER_VARIANT_RGBA) {
|
||||
|
|
@ -1823,11 +1839,6 @@ draw_paint_node(struct weston_paint_node *pnode,
|
|||
prepare_placeholder(&sconf, pnode);
|
||||
|
||||
if (pixman_region32_not_empty(&surface_opaque)) {
|
||||
if (pnode->view->alpha < 1.0)
|
||||
glEnable(GL_BLEND);
|
||||
else
|
||||
glDisable(GL_BLEND);
|
||||
|
||||
transform_damage(pnode, &repaint, &quads, &nquads);
|
||||
repaint_region(gr, pnode, quads, nquads, &surface_opaque,
|
||||
&sconf, true);
|
||||
|
|
@ -1835,7 +1846,6 @@ draw_paint_node(struct weston_paint_node *pnode,
|
|||
}
|
||||
|
||||
if (pixman_region32_not_empty(&surface_blend)) {
|
||||
glEnable(GL_BLEND);
|
||||
transform_damage(pnode, &repaint, &quads, &nquads);
|
||||
repaint_region(gr, pnode, quads, nquads, &surface_blend, &sconf,
|
||||
false);
|
||||
|
|
@ -2152,7 +2162,7 @@ draw_output_borders(struct weston_output *output,
|
|||
return;
|
||||
}
|
||||
|
||||
glDisable(GL_BLEND);
|
||||
set_blend_state(gr, false);
|
||||
glViewport(0, 0, fb->width, fb->height);
|
||||
|
||||
weston_matrix_init(&sconf.projection);
|
||||
|
|
@ -2307,7 +2317,7 @@ blit_shadow_to_output(struct weston_output *output,
|
|||
pixman_region32_init(&translated_damage);
|
||||
|
||||
gl_renderer_use_program(gr, &sconf);
|
||||
glDisable(GL_BLEND);
|
||||
set_blend_state(gr, false);
|
||||
|
||||
/* output_damage is in global coordinates */
|
||||
pixman_region32_intersect(&translated_damage, output_damage,
|
||||
|
|
@ -3813,7 +3823,7 @@ gl_renderer_surface_copy_content(struct weston_surface *surface,
|
|||
}
|
||||
|
||||
glViewport(0, 0, cw, ch);
|
||||
glDisable(GL_BLEND);
|
||||
set_blend_state(gr, false);
|
||||
if (buffer->buffer_origin == ORIGIN_TOP_LEFT)
|
||||
ARRAY_COPY(sconf.projection.d, projmat_normal);
|
||||
else
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue