Reviewed-by: Marek Olšák <marek.ol...@amd.com> Marek
On Thu, Sep 8, 2016 at 10:30 PM, Rob Clark <robdcl...@gmail.com> wrote: > 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