summaryrefslogtreecommitdiff
path: root/gsk
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2017-12-03 19:15:33 +0100
committerTimm Bäder <mail@baedert.org>2017-12-21 19:12:31 +0100
commit9479bb6bfca12c51d41c9f990bd1c0a453ccfa06 (patch)
treebe9a434548dbe9dc886f3e245159251fa20c8adb /gsk
parentb33d85b594e625eaec9d69778645eacef17cd3a5 (diff)
downloadgtk+-9479bb6bfca12c51d41c9f990bd1c0a453ccfa06.tar.gz
gl renderer: Keep track of color matrix op state
Diffstat (limited to 'gsk')
-rw-r--r--gsk/gl/gskglrenderer.c9
-rw-r--r--gsk/gl/gskglrenderops.c24
-rw-r--r--gsk/gl/gskglrenderopsprivate.h44
3 files changed, 54 insertions, 23 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 5f8fe95ba8..313d730672 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -1102,16 +1102,15 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
{
int texture_id;
gboolean is_offscreen;
- RenderOp op;
+
add_offscreen_ops (self, builder, min_x, max_x, min_y, max_y,
gsk_color_matrix_node_get_child (node),
&texture_id, &is_offscreen);
ops_set_program (builder, &self->color_matrix_program);
- op.op = OP_CHANGE_COLOR_MATRIX;
- op.color_matrix.matrix = *gsk_color_matrix_node_peek_color_matrix (node);
- op.color_matrix.offset = *gsk_color_matrix_node_peek_color_offset (node);
- ops_add (builder, &op);
+ ops_set_color_matrix (builder,
+ gsk_color_matrix_node_peek_color_matrix (node),
+ gsk_color_matrix_node_peek_color_offset (node));
ops_set_texture (builder, texture_id);
diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c
index 3c97d94855..517ce851c4 100644
--- a/gsk/gl/gskglrenderops.c
+++ b/gsk/gl/gskglrenderops.c
@@ -248,6 +248,30 @@ ops_set_color (RenderOpBuilder *builder,
}
void
+ops_set_color_matrix (RenderOpBuilder *builder,
+ const graphene_matrix_t *matrix,
+ const graphene_vec4_t *offset)
+{
+ RenderOp op;
+
+ if (memcmp (matrix,
+ &builder->program_state[builder->current_program->index].color_matrix.matrix,
+ sizeof (graphene_matrix_t)) == 0 &&
+ memcmp (offset,
+ &builder->program_state[builder->current_program->index].color_matrix.offset,
+ sizeof (graphene_vec4_t)) == 0)
+ return;
+
+ builder->program_state[builder->current_program->index].color_matrix.matrix = *matrix;
+ builder->program_state[builder->current_program->index].color_matrix.offset = *offset;
+
+ op.op = OP_CHANGE_COLOR_MATRIX;
+ op.color_matrix.matrix = *matrix;
+ op.color_matrix.offset = *offset;
+ g_array_append_val (builder->render_ops, op);
+}
+
+void
ops_draw (RenderOpBuilder *builder,
const GskQuadVertex vertex_data[GL_N_VERTICES])
{
diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h
index 087bf1dd62..2245fd311a 100644
--- a/gsk/gl/gskglrenderopsprivate.h
+++ b/gsk/gl/gskglrenderopsprivate.h
@@ -175,6 +175,10 @@ typedef struct
/* Per-program state */
union {
GdkRGBA color;
+ struct {
+ graphene_matrix_t matrix;
+ graphene_vec4_t offset;
+ } color_matrix;
};
} program_state[GL_N_PROGRAMS];
@@ -197,31 +201,35 @@ typedef struct
-void ops_set_program (RenderOpBuilder *builder,
- const Program *program);
+void ops_set_program (RenderOpBuilder *builder,
+ const Program *program);
-GskRoundedRect ops_set_clip (RenderOpBuilder *builder,
- const GskRoundedRect *clip);
+GskRoundedRect ops_set_clip (RenderOpBuilder *builder,
+ const GskRoundedRect *clip);
-graphene_matrix_t ops_set_modelview (RenderOpBuilder *builder,
- const graphene_matrix_t *modelview);
+graphene_matrix_t ops_set_modelview (RenderOpBuilder *builder,
+ const graphene_matrix_t *modelview);
-graphene_matrix_t ops_set_projection (RenderOpBuilder *builder,
- const graphene_matrix_t *projection);
+graphene_matrix_t ops_set_projection (RenderOpBuilder *builder,
+ const graphene_matrix_t *projection);
-graphene_rect_t ops_set_viewport (RenderOpBuilder *builder,
- const graphene_rect_t *viewport);
+graphene_rect_t ops_set_viewport (RenderOpBuilder *builder,
+ const graphene_rect_t *viewport);
-void ops_set_texture (RenderOpBuilder *builder,
- int texture_id);
+void ops_set_texture (RenderOpBuilder *builder,
+ int texture_id);
-int ops_set_render_target (RenderOpBuilder *builder,
- int render_target_id);
+int ops_set_render_target (RenderOpBuilder *builder,
+ int render_target_id);
-float ops_set_opacity (RenderOpBuilder *builder,
- float opacity);
-void ops_set_color (RenderOpBuilder *builder,
- const GdkRGBA *color);
+float ops_set_opacity (RenderOpBuilder *builder,
+ float opacity);
+void ops_set_color (RenderOpBuilder *builder,
+ const GdkRGBA *color);
+
+void ops_set_color_matrix (RenderOpBuilder *builder,
+ const graphene_matrix_t *matrix,
+ const graphene_vec4_t *offset);
void ops_draw (RenderOpBuilder *builder,
const GskQuadVertex vertex_data[GL_N_VERTICES]);