[Mesa-dev] [PATCH 2/3] mesa/st: add per sample shading state to fp key and set interpolation
Marek Olšák
maraeo at gmail.com
Sat Jul 5 15:22:18 PDT 2014
There is this vague statement in the sample shading spec:
When the sample shading fraction is 1.0, a separate set of colors and
other associated data are evaluated for each sample, each set of values
are evaluated at the sample location.
I thought it was about interpolation, meaning that the fraction must
1.0 for the per-sample interpolation to be enabled, right?
Marek
On Sat, Jul 5, 2014 at 6:07 AM, Ilia Mirkin <imirkin at alum.mit.edu> wrote:
> 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 <imirkin at 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;
> };
>
>
> --
> 1.8.5.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list