Looks good to me. It is unfortunate I guess that shaders may need recompilation just because the inputs are interpolated differently but I don't see a easy way out there.
Roland Am 05.07.2014 06:07, schrieb Ilia Mirkin: > This enables a gallium driver not to care about the semantics of > ARB_sample_shading vs ARB_gpu_shader5 sample attributes. When > ARB_sample_shading-style sample shading is enabled, all of the fp inputs > are marked for interpolation at the sample location. > > Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu> > --- > > I _think_ I got this right... at least the tests still pass. But my > understanding of all the various update atoms, etc is really weak... please > read carefully :) > > Now that I understand all this interpolation stuff better, I see why it was > suggested I add proper per-sample interpolation first and the > ARB_sample_shading stuff second. Oh well... > > src/mesa/state_tracker/st_atom_shader.c | 6 +++++- > src/mesa/state_tracker/st_program.c | 3 +++ > src/mesa/state_tracker/st_program.h | 3 +++ > 3 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/src/mesa/state_tracker/st_atom_shader.c > b/src/mesa/state_tracker/st_atom_shader.c > index 67c6157..6515a98 100644 > --- a/src/mesa/state_tracker/st_atom_shader.c > +++ b/src/mesa/state_tracker/st_atom_shader.c > @@ -89,6 +89,10 @@ update_fp( struct st_context *st ) > key.clamp_color = st->clamp_frag_color_in_shader && > st->ctx->Color._ClampFragmentColor; > > + /* Ignore sample qualifier while computing this flag. */ > + key.persample_shading = > + _mesa_get_min_invocations_per_fragment(st->ctx, &stfp->Base, true) > 1; > + > st->fp_variant = st_get_fp_variant(st, stfp, &key); > > st_reference_fragprog(st, &st->fp, stfp); > @@ -108,7 +112,7 @@ update_fp( struct st_context *st ) > const struct st_tracked_state st_update_fp = { > "st_update_fp", /* name */ > { /* dirty */ > - _NEW_BUFFERS, /* mesa */ > + _NEW_BUFFERS | _NEW_MULTISAMPLE, /* mesa */ > ST_NEW_FRAGMENT_PROGRAM /* st */ > }, > update_fp /* update */ > diff --git a/src/mesa/state_tracker/st_program.c > b/src/mesa/state_tracker/st_program.c > index b603759..9d7b7c4 100644 > --- a/src/mesa/state_tracker/st_program.c > +++ b/src/mesa/state_tracker/st_program.c > @@ -548,6 +548,9 @@ st_translate_fragment_program(struct st_context *st, > else > interpLocation[slot] = TGSI_INTERPOLATE_LOC_CENTER; > > + if (key->persample_shading) > + interpLocation[slot] = TGSI_INTERPOLATE_LOC_SAMPLE; > + > switch (attr) { > case VARYING_SLOT_POS: > input_semantic_name[slot] = TGSI_SEMANTIC_POSITION; > diff --git a/src/mesa/state_tracker/st_program.h > b/src/mesa/state_tracker/st_program.h > index ce9174f..9a5b6a8 100644 > --- a/src/mesa/state_tracker/st_program.h > +++ b/src/mesa/state_tracker/st_program.h > @@ -58,6 +58,9 @@ struct st_fp_variant_key > > /** for ARB_color_buffer_float */ > GLuint clamp_color:1; > + > + /** for ARB_sample_shading */ > + GLuint persample_shading:1; > }; > > > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev