[gtk+/wip/baedert/gl: 14/15] gl renderer: Keep track of current program color value
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/baedert/gl: 14/15] gl renderer: Keep track of current program color value
- Date: Fri, 24 Nov 2017 13:34:14 +0000 (UTC)
commit 4da2a617bf519c125219232c2ad52dfd815e84fa
Author: Timm Bäder <mail baedert org>
Date: Fri Nov 24 13:18:45 2017 +0100
gl renderer: Keep track of current program color value
gsk/gl/gskglrenderer.c | 13 ++-----------
gsk/gl/gskglrenderops.c | 18 ++++++++++++++++++
gsk/gl/gskglrenderopsprivate.h | 6 ++++++
3 files changed, 26 insertions(+), 11 deletions(-)
---
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index c20d95c..aec5a9e 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -677,12 +677,8 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
case GSK_COLOR_NODE:
{
- RenderOp op;
-
ops_set_program (builder, &self->color_program);
- op.op = OP_CHANGE_COLOR;
- op.color = *gsk_color_node_peek_color (node);
- ops_add (builder, &op);
+ ops_set_color (builder, gsk_color_node_peek_color (node));
ops_draw (builder, vertex_data);
}
break;
@@ -882,13 +878,8 @@ gsk_gl_renderer_add_render_ops (GskGLRenderer *self,
}
else
{
- RenderOp op;
-
ops_set_program (builder, &self->coloring_program);
-
- op.op = OP_CHANGE_COLOR;
- op.color = *gsk_text_node_peek_color (node);
- ops_add (builder, &op);
+ ops_set_color (builder, gsk_text_node_peek_color (node));
}
/* We use one quad per character, unlike the other nodes which
diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c
index 8713094..ed43240 100644
--- a/gsk/gl/gskglrenderops.c
+++ b/gsk/gl/gskglrenderops.c
@@ -211,6 +211,24 @@ ops_set_opacity (RenderOpBuilder *builder,
}
void
+ops_set_color (RenderOpBuilder *builder,
+ const GdkRGBA *color)
+{
+ RenderOp op;
+
+ g_assert (builder->current_program->color_location != 0);
+
+ if (gdk_rgba_equal (color, &builder->program_state[builder->current_program->index].color))
+ return;
+
+ builder->program_state[builder->current_program->index].color = *color;
+
+ op.op = OP_CHANGE_COLOR;
+ op.color = *color;
+ 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 84bc48b..b4ea6a4 100644
--- a/gsk/gl/gskglrenderopsprivate.h
+++ b/gsk/gl/gskglrenderopsprivate.h
@@ -116,6 +116,10 @@ typedef struct
graphene_matrix_t projection;
int source_texture;
graphene_rect_t viewport;
+ /* Per-program state */
+ union {
+ GdkRGBA color;
+ };
} program_state[GL_N_PROGRAMS];
/* Current global state */
@@ -160,6 +164,8 @@ int ops_set_render_target (RenderOpBuilder *builder,
float ops_set_opacity (RenderOpBuilder *builder,
float opacity);
+void ops_set_color (RenderOpBuilder *builder,
+ const GdkRGBA *color);
void ops_draw (RenderOpBuilder *builder,
const GskQuadVertex vertex_data[GL_N_VERTICES]);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]