[gtk] gl renderer: Refactor render op builder
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk] gl renderer: Refactor render op builder
- Date: Sun, 2 Dec 2018 15:19:13 +0000 (UTC)
commit 692ed4f994886be2abbef8c6cc99f73560147d2c
Author: Timm Bäder <mail baedert org>
Date: Sun Dec 2 14:17:18 2018 +0100
gl renderer: Refactor render op builder
gsk/gl/gskglrenderops.c | 69 ++++++++++++++++++++++--------------------
gsk/gl/gskglrenderopsprivate.h | 46 ++++++++++++++--------------
2 files changed, 60 insertions(+), 55 deletions(-)
---
diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c
index 28926f4ece..ace761790c 100644
--- a/gsk/gl/gskglrenderops.c
+++ b/gsk/gl/gskglrenderops.c
@@ -157,6 +157,7 @@ ops_set_program (RenderOpBuilder *builder,
static const graphene_matrix_t empty_matrix;
static const graphene_rect_t empty_rect;
RenderOp op;
+ ProgramState *program_state;
if (builder->current_program == program)
return;
@@ -166,50 +167,54 @@ ops_set_program (RenderOpBuilder *builder,
g_array_append_val (builder->render_ops, op);
builder->current_program = program;
+ program_state = &builder->program_state[program->index];
+
/* If the projection is not yet set for this program, we use the current one. */
- if (memcmp (&empty_matrix, &builder->program_state[program->index].projection, sizeof (graphene_matrix_t))
== 0 ||
- memcmp (&builder->current_projection, &builder->program_state[program->index].projection, sizeof
(graphene_matrix_t)) != 0)
+ if (memcmp (&empty_matrix, &program_state->projection, sizeof (graphene_matrix_t)) == 0 ||
+ memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0)
{
op.op = OP_CHANGE_PROJECTION;
op.projection = builder->current_projection;
g_array_append_val (builder->render_ops, op);
- builder->program_state[program->index].projection = builder->current_projection;
+ program_state->projection = builder->current_projection;
}
- if (memcmp (&empty_matrix, &builder->program_state[program->index].modelview, sizeof (graphene_matrix_t))
== 0 ||
- memcmp (builder->current_modelview, &builder->program_state[program->index].modelview, sizeof
(graphene_matrix_t)) != 0)
+ if (memcmp (&empty_matrix, &program_state->modelview, sizeof (graphene_matrix_t)) == 0 ||
+ memcmp (builder->current_modelview, &program_state->modelview, sizeof (graphene_matrix_t)) != 0)
{
op.op = OP_CHANGE_MODELVIEW;
op.modelview = *builder->current_modelview;
g_array_append_val (builder->render_ops, op);
- builder->program_state[program->index].modelview = *builder->current_modelview;
+ program_state->modelview = *builder->current_modelview;
}
- if (memcmp (&empty_rect, &builder->program_state[program->index].viewport, sizeof (graphene_rect_t)) == 0
||
- memcmp (&builder->current_viewport, &builder->program_state[program->index].viewport, sizeof
(graphene_rect_t)) != 0)
+ if (memcmp (&empty_rect, &program_state->viewport, sizeof (graphene_rect_t)) == 0 ||
+ memcmp (&builder->current_viewport, &program_state->viewport, sizeof (graphene_rect_t)) != 0)
{
op.op = OP_CHANGE_VIEWPORT;
op.viewport = builder->current_viewport;
g_array_append_val (builder->render_ops, op);
- builder->program_state[program->index].viewport = builder->current_viewport;
+ program_state->viewport = builder->current_viewport;
}
- if (memcmp (&empty_clip, &builder->program_state[program->index].clip, sizeof (GskRoundedRect)) == 0 ||
- memcmp (&builder->current_clip, &builder->program_state[program->index].clip, sizeof (GskRoundedRect))
!= 0)
+ if (memcmp (&empty_clip, &program_state->clip, sizeof (GskRoundedRect)) == 0 ||
+ memcmp (&builder->current_clip, &program_state->clip, sizeof (GskRoundedRect)) != 0)
{
op.op = OP_CHANGE_CLIP;
op.clip = builder->current_clip;
g_array_append_val (builder->render_ops, op);
- builder->program_state[program->index].clip = builder->current_clip;
+ program_state->clip = builder->current_clip;
}
- if (builder->program_state[program->index].opacity != builder->current_opacity)
+ if (program_state->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;
+ program_state->opacity = builder->current_opacity;
}
+
+ builder->current_program_state = &builder->program_state[program->index];
}
GskRoundedRect
@@ -238,7 +243,7 @@ ops_set_clip (RenderOpBuilder *builder,
}
if (builder->current_program != NULL)
- builder->program_state[builder->current_program->index].clip = *clip;
+ builder->current_program_state->clip = *clip;
prev_clip = builder->current_clip;
builder->current_clip = *clip;
@@ -253,7 +258,7 @@ ops_set_modelview (RenderOpBuilder *builder,
RenderOp op;
if (builder->current_program &&
- memcmp (&builder->program_state[builder->current_program->index].modelview, modelview,
+ memcmp (&builder->current_program_state->modelview, modelview,
sizeof (graphene_matrix_t)) == 0)
return;
@@ -279,7 +284,7 @@ ops_set_modelview (RenderOpBuilder *builder,
}
if (builder->current_program != NULL)
- builder->program_state[builder->current_program->index].modelview = *modelview;
+ builder->current_program_state->modelview = *modelview;
}
void
@@ -356,7 +361,7 @@ ops_set_projection (RenderOpBuilder *builder,
}
if (builder->current_program != NULL)
- builder->program_state[builder->current_program->index].projection = *projection;
+ builder->current_program_state->projection = *projection;
prev_mv = builder->current_projection;
builder->current_projection = *projection;
@@ -376,7 +381,7 @@ ops_set_viewport (RenderOpBuilder *builder,
g_array_append_val (builder->render_ops, op);
if (builder->current_program != NULL)
- builder->program_state[builder->current_program->index].viewport = *viewport;
+ builder->current_program_state->viewport = *viewport;
prev_viewport = builder->current_viewport;
builder->current_viewport = *viewport;
@@ -455,7 +460,7 @@ ops_set_opacity (RenderOpBuilder *builder,
builder->current_opacity = opacity;
if (builder->current_program != NULL)
- builder->program_state[builder->current_program->index].opacity = opacity;
+ builder->current_program_state->opacity = opacity;
return prev_opacity;
}
@@ -466,10 +471,10 @@ ops_set_color (RenderOpBuilder *builder,
{
RenderOp op;
- if (gdk_rgba_equal (color, &builder->program_state[builder->current_program->index].color))
+ if (gdk_rgba_equal (color, &builder->current_program_state->color))
return;
- builder->program_state[builder->current_program->index].color = *color;
+ builder->current_program_state->color = *color;
op.op = OP_CHANGE_COLOR;
op.color = *color;
@@ -484,15 +489,15 @@ ops_set_color_matrix (RenderOpBuilder *builder,
RenderOp op;
if (memcmp (matrix,
- &builder->program_state[builder->current_program->index].color_matrix.matrix,
+ &builder->current_program_state->color_matrix.matrix,
sizeof (graphene_matrix_t)) == 0 &&
memcmp (offset,
- &builder->program_state[builder->current_program->index].color_matrix.offset,
+ &builder->current_program_state->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;
+ builder->current_program_state->color_matrix.matrix = *matrix;
+ builder->current_program_state->color_matrix.offset = *offset;
op.op = OP_CHANGE_COLOR_MATRIX;
op.color_matrix.matrix = *matrix;
@@ -507,18 +512,16 @@ ops_set_border (RenderOpBuilder *builder,
{
RenderOp op;
- /* TODO: Assert that current_program == border program? */
-
- if (memcmp (&builder->program_state[builder->current_program->index].border.widths,
+ if (memcmp (&builder->current_program_state->border.widths,
widths, sizeof (float) * 4) == 0 &&
- memcmp (&builder->program_state[builder->current_program->index].border.outline,
+ memcmp (&builder->current_program_state->border.outline,
outline, sizeof (GskRoundedRect)) == 0)
return;
memcpy (&builder->program_state[builder->current_program->index].border.widths,
widths, sizeof (float) * 4);
- builder->program_state[builder->current_program->index].border.outline = *outline;
+ builder->current_program_state->border.outline = *outline;
op.op = OP_CHANGE_BORDER;
op.border.widths[0] = widths[0];
@@ -537,11 +540,11 @@ ops_set_border_color (RenderOpBuilder *builder,
op.op = OP_CHANGE_BORDER_COLOR;
rgba_to_float (color, op.border.color);
- if (memcmp (&op.border.color, &builder->program_state[builder->current_program->index].border.color,
+ if (memcmp (&op.border.color, &builder->current_program_state->border.color,
sizeof (float) * 4) == 0)
return;
- rgba_to_float (color, builder->program_state[builder->current_program->index].border.color);
+ rgba_to_float (color, builder->current_program_state->border.color);
g_array_append_val (builder->render_ops, op);
}
diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h
index 38b66744e4..88303f039e 100644
--- a/gsk/gl/gskglrenderopsprivate.h
+++ b/gsk/gl/gskglrenderopsprivate.h
@@ -218,30 +218,32 @@ typedef struct
typedef struct
{
- /* Per-Program State */
- struct {
- GskRoundedRect clip;
- graphene_matrix_t modelview;
- graphene_matrix_t projection;
- int source_texture;
- graphene_rect_t viewport;
- float opacity;
- /* Per-program state */
- union {
- GdkRGBA color;
- struct {
- graphene_matrix_t matrix;
- graphene_vec4_t offset;
- } color_matrix;
- struct {
- float widths[4];
- float color[4];
- GskRoundedRect outline;
- } border;
- };
- } program_state[GL_N_PROGRAMS];
+ GskRoundedRect clip;
+ graphene_matrix_t modelview;
+ graphene_matrix_t projection;
+ int source_texture;
+ graphene_rect_t viewport;
+ float opacity;
+ /* Per-program state */
+ union {
+ GdkRGBA color;
+ struct {
+ graphene_matrix_t matrix;
+ graphene_vec4_t offset;
+ } color_matrix;
+ struct {
+ float widths[4];
+ float color[4];
+ GskRoundedRect outline;
+ } border;
+ };
+} ProgramState;
+typedef struct
+{
+ ProgramState program_state[GL_N_PROGRAMS];
/* Current global state */
+ ProgramState *current_program_state;
const Program *current_program;
int current_render_target;
int current_texture;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]