gl renderer: Don't render opacity nodes offscreen

We already drag a u_alpha uniform around in every shader, so use that
one.
This commit is contained in:
Timm Bäder 2017-12-07 17:30:02 +01:00
parent ac6b7b24f9
commit ab53ee7377
3 changed files with 15 additions and 27 deletions

View File

@ -1029,37 +1029,13 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
case GSK_OPACITY_NODE:
{
int texture_id;
gboolean is_offscreen;
float prev_opacity;
prev_opacity = ops_set_opacity (builder,
builder->current_opacity * gsk_opacity_node_get_opacity (node));
add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y,
gsk_opacity_node_get_child (node),
&texture_id, &is_offscreen);
gsk_gl_renderer_add_render_ops (self, gsk_opacity_node_get_child (node), builder);
/* Now draw the texture with the node's opacity */
ops_set_program (builder, &self->blit_program);
prev_opacity = ops_set_opacity (builder, gsk_opacity_node_get_opacity (node));
ops_set_texture (builder, texture_id);
if (is_offscreen)
{
GskQuadVertex vertex_data[GL_N_VERTICES] = {
{ { min_x, min_y }, { 0, 1 }, },
{ { min_x, max_y }, { 0, 0 }, },
{ { max_x, min_y }, { 1, 1 }, },
{ { max_x, max_y }, { 1, 0 }, },
{ { min_x, max_y }, { 0, 0 }, },
{ { max_x, min_y }, { 1, 1 }, },
};
ops_draw (builder, vertex_data);
}
else
{
ops_draw (builder, vertex_data);
}
ops_set_opacity (builder, prev_opacity);
}
break;

View File

@ -65,6 +65,14 @@ ops_set_program (RenderOpBuilder *builder,
g_array_append_val (builder->render_ops, op);
builder->program_state[program->index].clip = builder->current_clip;
}
if (builder->program_state[program->index].opacity != builder->current_opacity)
{
op.op = OP_CHANGE_OPACITY;
op.opacity = builder->current_opacity;
g_array_append_val (builder->render_ops, op);
builder->program_state[program->index].opacity = builder->current_opacity;
}
}
GskRoundedRect
@ -244,6 +252,9 @@ ops_set_opacity (RenderOpBuilder *builder,
prev_opacity = builder->current_opacity;
builder->current_opacity = opacity;
if (builder->current_program != NULL)
builder->program_state[builder->current_program->index].opacity = opacity;
return prev_opacity;
}

View File

@ -174,6 +174,7 @@ typedef struct
graphene_matrix_t projection;
int source_texture;
graphene_rect_t viewport;
float opacity;
/* Per-program state */
union {
GdkRGBA color;