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 <robdcl...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev