[Mesa-dev] [PATCH 4/7] mesa/st: a bit of basic_variant refactoring

Rob Clark robdclark at gmail.com
Thu Sep 8 20:30:37 UTC 2016


Add a helper to initialize the key, and pass the key into the helper
that iterates the variants, similar to how it works for vp/fp variants.

The 'prog' arg to the helper gets used in a following patch, and is the
reason to pass the key into st_get_basic_variant().

Signed-off-by: Rob Clark <robdclark at gmail.com>
---
 src/mesa/state_tracker/st_atom_shader.c | 16 ++++++++++++----
 src/mesa/state_tracker/st_program.c     | 34 ++++++++++++++++-----------------
 src/mesa/state_tracker/st_program.h     | 16 ++++++++++++++--
 3 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index 2f700a2..c2e4fc8 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -217,6 +217,7 @@ static void
 update_gp( struct st_context *st )
 {
    struct st_geometry_program *stgp;
+   struct st_basic_variant_key key;
 
    if (!st->ctx->GeometryProgram._Current) {
       cso_set_geometry_shader_handle(st->cso_context, NULL);
@@ -227,8 +228,9 @@ update_gp( struct st_context *st )
    stgp = st_geometry_program(st->ctx->GeometryProgram._Current);
    assert(stgp->Base.Base.Target == GL_GEOMETRY_PROGRAM_NV);
 
+   key = st_get_basic_variant_key(st, &stgp->Base.Base);
    st->gp_variant = st_get_basic_variant(st, PIPE_SHADER_GEOMETRY,
-                                         &stgp->tgsi, &stgp->variants);
+                                         &stgp->tgsi, &stgp->variants, &key);
 
    st_reference_geomprog(st, &st->gp, stgp);
 
@@ -246,6 +248,7 @@ static void
 update_tcp( struct st_context *st )
 {
    struct st_tessctrl_program *sttcp;
+   struct st_basic_variant_key key;
 
    if (!st->ctx->TessCtrlProgram._Current) {
       cso_set_tessctrl_shader_handle(st->cso_context, NULL);
@@ -256,8 +259,9 @@ update_tcp( struct st_context *st )
    sttcp = st_tessctrl_program(st->ctx->TessCtrlProgram._Current);
    assert(sttcp->Base.Base.Target == GL_TESS_CONTROL_PROGRAM_NV);
 
+   key = st_get_basic_variant_key(st, &sttcp->Base.Base);
    st->tcp_variant = st_get_basic_variant(st, PIPE_SHADER_TESS_CTRL,
-                                          &sttcp->tgsi, &sttcp->variants);
+                                          &sttcp->tgsi, &sttcp->variants, &key);
 
    st_reference_tesscprog(st, &st->tcp, sttcp);
 
@@ -275,6 +279,7 @@ static void
 update_tep( struct st_context *st )
 {
    struct st_tesseval_program *sttep;
+   struct st_basic_variant_key key;
 
    if (!st->ctx->TessEvalProgram._Current) {
       cso_set_tesseval_shader_handle(st->cso_context, NULL);
@@ -285,8 +290,9 @@ update_tep( struct st_context *st )
    sttep = st_tesseval_program(st->ctx->TessEvalProgram._Current);
    assert(sttep->Base.Base.Target == GL_TESS_EVALUATION_PROGRAM_NV);
 
+   key = st_get_basic_variant_key(st, &sttep->Base.Base);
    st->tep_variant = st_get_basic_variant(st, PIPE_SHADER_TESS_EVAL,
-                                          &sttep->tgsi, &sttep->variants);
+                                          &sttep->tgsi, &sttep->variants, &key);
 
    st_reference_tesseprog(st, &st->tep, sttep);
 
@@ -304,6 +310,7 @@ static void
 update_cp( struct st_context *st )
 {
    struct st_compute_program *stcp;
+   struct st_basic_variant_key key;
 
    if (!st->ctx->ComputeProgram._Current) {
       cso_set_compute_shader_handle(st->cso_context, NULL);
@@ -314,7 +321,8 @@ update_cp( struct st_context *st )
    stcp = st_compute_program(st->ctx->ComputeProgram._Current);
    assert(stcp->Base.Base.Target == GL_COMPUTE_PROGRAM_NV);
 
-   st->cp_variant = st_get_cp_variant(st, &stcp->tgsi, &stcp->variants);
+   key = st_get_basic_variant_key(st, &stcp->Base.Base);
+   st->cp_variant = st_get_cp_variant(st, &stcp->tgsi, &stcp->variants, &key);
 
    st_reference_compprog(st, &st->cp, stcp);
 
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 91887dc..284cc22 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -1533,18 +1533,15 @@ struct st_basic_variant *
 st_get_basic_variant(struct st_context *st,
                      unsigned pipe_shader,
                      struct pipe_shader_state *tgsi,
-                     struct st_basic_variant **variants)
+                     struct st_basic_variant **variants,
+                     const struct st_basic_variant_key *key)
 {
    struct pipe_context *pipe = st->pipe;
    struct st_basic_variant *v;
-   struct st_basic_variant_key key;
-
-   memset(&key, 0, sizeof(key));
-   key.st = st->has_shareable_shaders ? NULL : st;
 
    /* Search for existing variant */
    for (v = *variants; v; v = v->next) {
-      if (memcmp(&v->key, &key, sizeof(key)) == 0) {
+      if (memcmp(&v->key, key, sizeof(*key)) == 0) {
          break;
       }
    }
@@ -1570,7 +1567,7 @@ st_get_basic_variant(struct st_context *st,
             return NULL;
          }
 
-         v->key = key;
+         v->key = *key;
 
          /* insert into list */
          v->next = *variants;
@@ -1689,18 +1686,15 @@ st_translate_compute_program(struct st_context *st,
 struct st_basic_variant *
 st_get_cp_variant(struct st_context *st,
                   struct pipe_compute_state *tgsi,
-                  struct st_basic_variant **variants)
+                  struct st_basic_variant **variants,
+                  const struct st_basic_variant_key *key)
 {
    struct pipe_context *pipe = st->pipe;
    struct st_basic_variant *v;
-   struct st_basic_variant_key key;
-
-   memset(&key, 0, sizeof(key));
-   key.st = st->has_shareable_shaders ? NULL : st;
 
    /* Search for existing variant */
    for (v = *variants; v; v = v->next) {
-      if (memcmp(&v->key, &key, sizeof(key)) == 0) {
+      if (memcmp(&v->key, key, sizeof(*key)) == 0) {
          break;
       }
    }
@@ -1711,7 +1705,7 @@ st_get_cp_variant(struct st_context *st,
       if (v) {
          /* fill in new variant */
          v->driver_shader = pipe->create_compute_state(pipe, tgsi);
-         v->key = key;
+         v->key = *key;
 
          /* insert into list */
          v->next = *variants;
@@ -1929,19 +1923,22 @@ st_precompile_shader_variant(struct st_context *st,
 
    case GL_TESS_CONTROL_PROGRAM_NV: {
       struct st_tessctrl_program *p = (struct st_tessctrl_program *)prog;
-      st_get_basic_variant(st, PIPE_SHADER_TESS_CTRL, &p->tgsi, &p->variants);
+      struct st_basic_variant_key key = st_get_basic_variant_key(st, prog);
+      st_get_basic_variant(st, PIPE_SHADER_TESS_CTRL, &p->tgsi, &p->variants, &key);
       break;
    }
 
    case GL_TESS_EVALUATION_PROGRAM_NV: {
       struct st_tesseval_program *p = (struct st_tesseval_program *)prog;
-      st_get_basic_variant(st, PIPE_SHADER_TESS_EVAL, &p->tgsi, &p->variants);
+      struct st_basic_variant_key key = st_get_basic_variant_key(st, prog);
+      st_get_basic_variant(st, PIPE_SHADER_TESS_EVAL, &p->tgsi, &p->variants, &key);
       break;
    }
 
    case GL_GEOMETRY_PROGRAM_NV: {
       struct st_geometry_program *p = (struct st_geometry_program *)prog;
-      st_get_basic_variant(st, PIPE_SHADER_GEOMETRY, &p->tgsi, &p->variants);
+      struct st_basic_variant_key key = st_get_basic_variant_key(st, prog);
+      st_get_basic_variant(st, PIPE_SHADER_GEOMETRY, &p->tgsi, &p->variants, &key);
       break;
    }
 
@@ -1957,7 +1954,8 @@ st_precompile_shader_variant(struct st_context *st,
 
    case GL_COMPUTE_PROGRAM_NV: {
       struct st_compute_program *p = (struct st_compute_program *)prog;
-      st_get_cp_variant(st, &p->tgsi, &p->variants);
+      struct st_basic_variant_key key = st_get_basic_variant_key(st, prog);
+      st_get_cp_variant(st, &p->tgsi, &p->variants, &key);
       break;
    }
 
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index ea55d47..f4e572a 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -230,6 +230,16 @@ struct st_basic_variant_key
    struct st_context *st;          /**< variants are per-context */
 };
 
+static inline struct st_basic_variant_key
+st_get_basic_variant_key(struct st_context *st, struct gl_program *prog)
+{
+   struct st_basic_variant_key key;
+
+   memset(&key, 0, sizeof(key));
+   key.st = st->has_shareable_shaders ? NULL : st;
+
+   return key;
+}
 
 /**
  * Geometry program variant.
@@ -438,13 +448,15 @@ st_get_fp_variant(struct st_context *st,
 extern struct st_basic_variant *
 st_get_cp_variant(struct st_context *st,
                   struct pipe_compute_state *tgsi,
-                  struct st_basic_variant **variants);
+                  struct st_basic_variant **variants,
+                  const struct st_basic_variant_key *key);
 
 extern struct st_basic_variant *
 st_get_basic_variant(struct st_context *st,
                      unsigned pipe_shader,
                      struct pipe_shader_state *tgsi,
-                     struct st_basic_variant **variants);
+                     struct st_basic_variant **variants,
+                     const struct st_basic_variant_key *key);
 
 extern void
 st_release_vp_variants( struct st_context *st,
-- 
2.7.4



More information about the mesa-dev mailing list