summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2018-12-05 10:44:11 +0100
committerTimm Bäder <mail@baedert.org>2018-12-07 16:36:10 +0100
commit3ce45508e122f7fba8d6f6bf85ca4a96499b3ea2 (patch)
treeb40d93e8f06de4038dbd4d50c53f1564cdb89c26
parent57efdcfbbef4fb63aba0f8c829733d40f3c5ea5b (diff)
downloadgtk+-3ce45508e122f7fba8d6f6bf85ca4a96499b3ea2.tar.gz
gl renderer: Track border width state separately
-rw-r--r--gsk/gl/gskglrenderer.c21
-rw-r--r--gsk/gl/gskglrenderops.c28
-rw-r--r--gsk/gl/gskglrenderopsprivate.h14
3 files changed, 45 insertions, 18 deletions
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 693faafe8f..ff66e803e9 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -663,7 +663,8 @@ render_border_node (GskGLRenderer *self,
}
ops_set_program (builder, &self->border_program);
- ops_set_border (builder, widths, &outline);
+ ops_set_border_width (builder, widths);
+ ops_set_border (builder, &outline);
for (i = 0; i < 4; i ++)
{
@@ -1879,8 +1880,7 @@ apply_border_op (const Program *program,
float widths[4];
float heights[4];
int i;
- OP_PRINT (" -> Border (%f, %f, %f, %f)",
- op->border.widths[0], op->border.widths[1], op->border.widths[2], op->border.widths[3]);
+ OP_PRINT (" -> Border Outline");
outline[0] = o->bounds.origin.x;
outline[1] = o->bounds.origin.y;
@@ -1893,13 +1893,22 @@ apply_border_op (const Program *program,
heights[i] = o->corner[i].height;
}
- glUniform4fv (program->border.widths_location, 1, op->border.widths);
glUniform4fv (program->border.outline_location, 1, outline);
glUniform4fv (program->border.corner_widths_location, 1, widths);
glUniform4fv (program->border.corner_heights_location, 1, heights);
}
static inline void
+apply_border_width_op (const Program *program,
+ const RenderOp *op)
+{
+ OP_PRINT (" -> Border width (%f, %f, %f, %f)",
+ op->border.widths[0], op->border.widths[1], op->border.widths[2], op->border.widths[3]);
+
+ glUniform4fv (program->border.widths_location, 1, op->border.widths);
+}
+
+static inline void
apply_border_color_op (const Program *program,
const RenderOp *op)
{
@@ -2608,6 +2617,10 @@ gsk_gl_renderer_render_ops (GskGLRenderer *self,
apply_border_op (program, op);
break;
+ case OP_CHANGE_BORDER_WIDTH:
+ apply_border_width_op (program, op);
+ break;
+
case OP_CHANGE_UNBLURRED_OUTSET_SHADOW:
apply_unblurred_outset_shadow_op (program, op);
break;
diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c
index 9b2e299ebe..db77ea7c68 100644
--- a/gsk/gl/gskglrenderops.c
+++ b/gsk/gl/gskglrenderops.c
@@ -537,28 +537,40 @@ ops_set_color_matrix (RenderOpBuilder *builder,
void
ops_set_border (RenderOpBuilder *builder,
- const float *widths,
const GskRoundedRect *outline)
{
RenderOp op;
- if (memcmp (&builder->current_program_state->border.widths,
- widths, sizeof (float) * 4) == 0 &&
- memcmp (&builder->current_program_state->border.outline,
+ if (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->current_program_state->border.outline = *outline;
op.op = OP_CHANGE_BORDER;
+ op.border.outline = *outline;
+ g_array_append_val (builder->render_ops, op);
+}
+
+void
+ops_set_border_width (RenderOpBuilder *builder,
+ const float *widths)
+{
+ RenderOp op;
+
+ if (memcmp (builder->current_program_state->border.widths,
+ widths, sizeof (float) * 4) == 0)
+ return;
+
+ memcpy (&builder->current_program_state->border.widths,
+ widths, sizeof (float) * 4);
+
+ op.op = OP_CHANGE_BORDER_WIDTH;
op.border.widths[0] = widths[0];
op.border.widths[1] = widths[1];
op.border.widths[2] = widths[2];
op.border.widths[3] = widths[3];
- op.border.outline = *outline;
+
g_array_append_val (builder->render_ops, op);
}
diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h
index c4bf2b29b9..1d1594172d 100644
--- a/gsk/gl/gskglrenderopsprivate.h
+++ b/gsk/gl/gskglrenderopsprivate.h
@@ -50,11 +50,12 @@ enum {
OP_CHANGE_OUTSET_SHADOW = 15,
OP_CHANGE_BORDER = 16,
OP_CHANGE_BORDER_COLOR = 17,
- OP_CHANGE_CROSS_FADE = 18,
- OP_CHANGE_UNBLURRED_OUTSET_SHADOW = 19,
- OP_CLEAR = 20,
- OP_DRAW = 21,
- OP_DUMP_FRAMEBUFFER = 22,
+ OP_CHANGE_BORDER_WIDTH = 18,
+ OP_CHANGE_CROSS_FADE = 19,
+ OP_CHANGE_UNBLURRED_OUTSET_SHADOW = 20,
+ OP_CLEAR = 21,
+ OP_DRAW = 22,
+ OP_DUMP_FRAMEBUFFER = 23,
};
typedef struct
@@ -310,8 +311,9 @@ void ops_set_color_matrix (RenderOpBuilder *builder,
const graphene_vec4_t *offset);
void ops_set_border (RenderOpBuilder *builder,
- const float *widths,
const GskRoundedRect *outline);
+void ops_set_border_width (RenderOpBuilder *builder,
+ const float *widths);
void ops_set_border_color (RenderOpBuilder *builder,
const GdkRGBA *color);