[gtk] gl renderer: Only send clip corners if we need to
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk] gl renderer: Only send clip corners if we need to
- Date: Tue, 7 Jan 2020 16:36:37 +0000 (UTC)
commit 5191b6fccddf4cd1bb282ef2952da4f229157b0e
Author: Timm Bäder <mail baedert org>
Date: Sat Dec 14 15:41:32 2019 +0100
gl renderer: Only send clip corners if we need to
We change the clip bounds a lot more ofthen than the clip corners and
they are already split up in the shader, so only send the corners if we
need to.
gsk/gl/gskglrenderer.c | 14 ++++++++++++--
gsk/gl/gskglrenderops.c | 34 +++++++++++++++++++++++++++++++---
gsk/gl/opbuffer.h | 1 +
3 files changed, 44 insertions(+), 5 deletions(-)
---
diff --git a/gsk/gl/gskglrenderer.c b/gsk/gl/gskglrenderer.c
index 1713c5e757..7f77670977 100644
--- a/gsk/gl/gskglrenderer.c
+++ b/gsk/gl/gskglrenderer.c
@@ -2521,9 +2521,19 @@ static inline void
apply_clip_op (const Program *program,
const OpClip *op)
{
- OP_PRINT (" -> Clip: %s", gsk_rounded_rect_to_string (&op->clip));
glUniform4fv (program->clip_rect_bounds_location, 1, (float *)&op->clip.bounds);
- glUniform2fv (program->clip_rect_corners_location, 4, (float *)&op->clip.corner);
+
+ if (op->send_corners)
+ {
+ OP_PRINT (" -> Clip: %s", gsk_rounded_rect_to_string (&op->clip));
+ glUniform2fv (program->clip_rect_corners_location, 4, (float *)&op->clip.corner);
+ }
+ else
+ {
+ OP_PRINT (" -> clip: %f, %f, %f, %f",
+ op->clip.bounds.origin.x, op->clip.bounds.origin.y,
+ op->clip.bounds.size.width, op->clip.bounds.size.height);
+ }
}
static inline void
diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c
index c2c7858dfb..5ab089493f 100644
--- a/gsk/gl/gskglrenderops.c
+++ b/gsk/gl/gskglrenderops.c
@@ -8,6 +8,23 @@ rect_equal (const graphene_rect_t *a,
return memcmp (a, b, sizeof (graphene_rect_t)) == 0;
}
+static inline gboolean
+rounded_rect_corners_equal (const GskRoundedRect *r1,
+ const GskRoundedRect *r2)
+{
+ int i;
+
+ if (!r1)
+ return FALSE;
+
+ for (i = 0; i < 4; i ++)
+ if (r1->corner[i].width != r2->corner[i].width ||
+ r1->corner[i].height != r2->corner[i].height)
+ return FALSE;
+
+ return TRUE;
+}
+
static inline ProgramState *
get_current_program_state (RenderOpBuilder *builder)
{
@@ -252,6 +269,7 @@ ops_set_program (RenderOpBuilder *builder,
opc = ops_begin (builder, OP_CHANGE_CLIP);
opc->clip = *builder->current_clip;
+ opc->send_corners = !rounded_rect_corners_equal (builder->current_clip, &program_state->clip);
program_state->clip = *builder->current_clip;
}
@@ -273,15 +291,25 @@ ops_set_clip (RenderOpBuilder *builder,
OpClip *op;
if (current_program_state &&
- memcmp (¤t_program_state->clip, clip,sizeof (GskRoundedRect)) == 0)
+ rounded_rect_equal (¤t_program_state->clip, clip))
return;
if (!(op = op_buffer_peek_tail_checked (&builder->render_ops, OP_CHANGE_CLIP)))
- op = op_buffer_add (&builder->render_ops, OP_CHANGE_CLIP);
+ {
+ op = op_buffer_add (&builder->render_ops, OP_CHANGE_CLIP);
+ op->send_corners = !current_program_state ||
+ !rounded_rect_corners_equal (¤t_program_state->clip, clip);
+ }
+ else
+ {
+ /* If the op before sent the corners, this one needs, too */
+ op->send_corners |= !current_program_state ||
+ !rounded_rect_corners_equal (¤t_program_state->clip, clip);
+ }
op->clip = *clip;
- if (builder->current_program != NULL)
+ if (current_program_state)
current_program_state->clip = *clip;
}
diff --git a/gsk/gl/opbuffer.h b/gsk/gl/opbuffer.h
index 04ae799490..8578bc108b 100644
--- a/gsk/gl/opbuffer.h
+++ b/gsk/gl/opbuffer.h
@@ -88,6 +88,7 @@ typedef struct
typedef struct
{
GskRoundedRect clip;
+ guint send_corners: 1;
} OpClip;
typedef struct
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]