[gtk/wip/chergert/glproto] use stamps to avoid costly comparisons
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/glproto] use stamps to avoid costly comparisons
- Date: Fri, 12 Feb 2021 22:45:16 +0000 (UTC)
commit d50a57ab6ce492bc3a0edd9b784d71a652d2d8a9
Author: Christian Hergert <chergert redhat com>
Date: Fri Feb 12 14:45:11 2021 -0800
use stamps to avoid costly comparisons
gsk/next/gskglrenderjob.c | 5 +++++
gsk/next/gskgluniformstate.c | 2 +-
gsk/next/gskgluniformstateprivate.h | 24 ++++++++++++------------
3 files changed, 18 insertions(+), 13 deletions(-)
---
diff --git a/gsk/next/gskglrenderjob.c b/gsk/next/gskglrenderjob.c
index 7823417351..ea3cc382cc 100644
--- a/gsk/next/gskglrenderjob.c
+++ b/gsk/next/gskglrenderjob.c
@@ -927,6 +927,7 @@ gsk_gl_render_job_begin_draw (GskGLRenderJob *job,
gsk_gl_uniform_state_set4fv (program->uniforms,
program->program_info,
program->uniform_locations[UNIFORM_SHARED_VIEWPORT],
+ job->driver->stamps[UNIFORM_SHARED_VIEWPORT],
1,
(const float *)&job->viewport);
@@ -934,24 +935,28 @@ gsk_gl_render_job_begin_draw (GskGLRenderJob *job,
gsk_gl_uniform_state_set_matrix (program->uniforms,
program->program_info,
program->uniform_locations[UNIFORM_SHARED_MODELVIEW],
+ job->driver->stamps[UNIFORM_SHARED_MODELVIEW],
&job->current_modelview->matrix);
if (program->uniform_locations[UNIFORM_SHARED_PROJECTION] > -1)
gsk_gl_uniform_state_set_matrix (program->uniforms,
program->program_info,
program->uniform_locations[UNIFORM_SHARED_PROJECTION],
+ job->driver->stamps[UNIFORM_SHARED_PROJECTION],
&job->projection);
if (program->uniform_locations[UNIFORM_SHARED_CLIP_RECT] > -1)
gsk_gl_uniform_state_set_rounded_rect (program->uniforms,
program->program_info,
program->uniform_locations[UNIFORM_SHARED_CLIP_RECT],
+ job->driver->stamps[UNIFORM_SHARED_CLIP_RECT],
&job->current_clip->rect);
if (program->uniform_locations[UNIFORM_SHARED_ALPHA] > -1)
gsk_gl_uniform_state_set1f (program->uniforms,
program->program_info,
program->uniform_locations[UNIFORM_SHARED_ALPHA],
+ job->driver->stamps[UNIFORM_SHARED_ALPHA],
job->alpha);
}
diff --git a/gsk/next/gskgluniformstate.c b/gsk/next/gskgluniformstate.c
index 850c57c0f5..6e85853375 100644
--- a/gsk/next/gskgluniformstate.c
+++ b/gsk/next/gskgluniformstate.c
@@ -157,7 +157,7 @@ setup_info:
info->info.offset = offset;
info->info.array_count = array_count;
info->info.initial = TRUE;
- info->stamp = 1;
+ info->stamp = 0;
*infoptr = info;
diff --git a/gsk/next/gskgluniformstateprivate.h b/gsk/next/gskgluniformstateprivate.h
index 0f574ad945..9024db908a 100644
--- a/gsk/next/gskgluniformstateprivate.h
+++ b/gsk/next/gskgluniformstateprivate.h
@@ -180,20 +180,20 @@ gsk_gl_uniform_state_get_value (GskGLUniformState *state,
{
GskGLUniformInfoElement *info = &program->uniforms[location];
+ /* If the stamp is the same, then we can ignore the request
+ * and short-circuit as early as possible. This requires the
+ * caller to increment their private stamp when they change
+ * internal state.
+ *
+ * This is generally used for the shared uniforms like projection,
+ * modelview, clip, etc to avoid so many comparisons which cost
+ * considerable CPU.
+ */
+ if (stamp != 0 && stamp == info->stamp)
+ return NULL;
+
if G_LIKELY (format == info->info.format && array_count <= info->info.array_count)
{
- /* If the stamp is the same, then we can ignore the request
- * and short-circuit as early as possible. This requires the
- * peer to also increment their private stamp when they change
- * internal state.
- *
- * This is generally used for the shared uniforms like projection,
- * modelview, clip, etc to avoid so many comparisons which cost
- * considerable CPU.
- */
- if (stamp == info->stamp)
- return NULL;
-
*infoptr = info;
return state->values_buf + info->info.offset;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]