[Mesa-dev,2/3] st/mesa: set force_persample_interp if ARB_sample_shading is used

Submitted by Marek Olšák on Sept. 29, 2015, 12:38 a.m.

Details

Message ID 1443487081-17304-3-git-send-email-maraeo@gmail.com
State New
Headers show

Not browsing as part of any series.

Commit Message

Marek Olšák Sept. 29, 2015, 12:38 a.m.
From: Marek Olšák <marek.olsak@amd.com>

This is only a half of the work. The next patch will handle
gl_SampleID/SamplePos, which is the other half of ARB_sample_shading.
---
 src/mesa/state_tracker/st_atom_rasterizer.c | 8 ++++++++
 src/mesa/state_tracker/st_atom_shader.c     | 1 +
 src/mesa/state_tracker/st_context.c         | 2 ++
 src/mesa/state_tracker/st_context.h         | 1 +
 4 files changed, 12 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c
index cceed42..3a9c461 100644
--- a/src/mesa/state_tracker/st_atom_rasterizer.c
+++ b/src/mesa/state_tracker/st_atom_rasterizer.c
@@ -237,6 +237,14 @@  static void update_raster_state( struct st_context *st )
    /* _NEW_MULTISAMPLE */
    raster->multisample = ctx->Multisample._Enabled;
 
+   /* _NEW_MULTISAMPLE | _NEW_BUFFERS */
+   raster->force_persample_interp =
+         st->can_force_persample_interp &&
+         ctx->Multisample._Enabled &&
+         ctx->Multisample.SampleShading &&
+         MAX2(ceil(ctx->Multisample.MinSampleShadingValue *
+                   ctx->DrawBuffer->Visual.samples), 1) > 1;
+
    /* _NEW_SCISSOR */
    raster->scissor = ctx->Scissor.EnableFlags;
 
diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
index fee15a9..dc03156 100644
--- a/src/mesa/state_tracker/st_atom_shader.c
+++ b/src/mesa/state_tracker/st_atom_shader.c
@@ -72,6 +72,7 @@  update_fp( struct st_context *st )
 
    /* Ignore sample qualifier while computing this flag. */
    key.persample_shading =
+      !st->can_force_persample_interp &&
       _mesa_get_min_invocations_per_fragment(st->ctx, &stfp->Base, true) > 1;
 
    st->fp_variant = st_get_fp_variant(st, stfp, &key);
diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
index 72c23ca..7061191 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -237,6 +237,8 @@  st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
                                               PIPE_BIND_SAMPLER_VIEW);
    st->prefer_blit_based_texture_transfer = screen->get_param(screen,
                               PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER);
+   st->can_force_persample_interp = screen->get_param(screen,
+                                          PIPE_CAP_FORCE_PERSAMPLE_INTERP);
 
    st->needs_texcoord_semantic =
       screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD);
diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
index 81d5480..a4cda29 100644
--- a/src/mesa/state_tracker/st_context.h
+++ b/src/mesa/state_tracker/st_context.h
@@ -98,6 +98,7 @@  struct st_context
    boolean has_etc1;
    boolean has_etc2;
    boolean prefer_blit_based_texture_transfer;
+   boolean can_force_persample_interp;
 
    boolean needs_texcoord_semantic;
    boolean apply_texture_swizzle_to_border_color;

Comments

On Mon, Sep 28, 2015 at 8:38 PM, Marek Olšák <maraeo@gmail.com> wrote:
> From: Marek Olšák <marek.olsak@amd.com>
>
> This is only a half of the work. The next patch will handle
> gl_SampleID/SamplePos, which is the other half of ARB_sample_shading.
> ---
>  src/mesa/state_tracker/st_atom_rasterizer.c | 8 ++++++++
>  src/mesa/state_tracker/st_atom_shader.c     | 1 +
>  src/mesa/state_tracker/st_context.c         | 2 ++
>  src/mesa/state_tracker/st_context.h         | 1 +
>  4 files changed, 12 insertions(+)
>
> diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c b/src/mesa/state_tracker/st_atom_rasterizer.c
> index cceed42..3a9c461 100644
> --- a/src/mesa/state_tracker/st_atom_rasterizer.c
> +++ b/src/mesa/state_tracker/st_atom_rasterizer.c
> @@ -237,6 +237,14 @@ static void update_raster_state( struct st_context *st )
>     /* _NEW_MULTISAMPLE */
>     raster->multisample = ctx->Multisample._Enabled;
>
> +   /* _NEW_MULTISAMPLE | _NEW_BUFFERS */
> +   raster->force_persample_interp =
> +         st->can_force_persample_interp &&
> +         ctx->Multisample._Enabled &&
> +         ctx->Multisample.SampleShading &&
> +         MAX2(ceil(ctx->Multisample.MinSampleShadingValue *
> +                   ctx->DrawBuffer->Visual.samples), 1) > 1;

The max seems unnecessary... as does the ceil. You should just be able
to do MinSampleShadingValue * samples > 1.

With that fixed, Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>

> +
>     /* _NEW_SCISSOR */
>     raster->scissor = ctx->Scissor.EnableFlags;
>
> diff --git a/src/mesa/state_tracker/st_atom_shader.c b/src/mesa/state_tracker/st_atom_shader.c
> index fee15a9..dc03156 100644
> --- a/src/mesa/state_tracker/st_atom_shader.c
> +++ b/src/mesa/state_tracker/st_atom_shader.c
> @@ -72,6 +72,7 @@ update_fp( struct st_context *st )
>
>     /* Ignore sample qualifier while computing this flag. */
>     key.persample_shading =
> +      !st->can_force_persample_interp &&
>        _mesa_get_min_invocations_per_fragment(st->ctx, &stfp->Base, true) > 1;
>
>     st->fp_variant = st_get_fp_variant(st, stfp, &key);
> diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c
> index 72c23ca..7061191 100644
> --- a/src/mesa/state_tracker/st_context.c
> +++ b/src/mesa/state_tracker/st_context.c
> @@ -237,6 +237,8 @@ st_create_context_priv( struct gl_context *ctx, struct pipe_context *pipe,
>                                                PIPE_BIND_SAMPLER_VIEW);
>     st->prefer_blit_based_texture_transfer = screen->get_param(screen,
>                                PIPE_CAP_PREFER_BLIT_BASED_TEXTURE_TRANSFER);
> +   st->can_force_persample_interp = screen->get_param(screen,
> +                                          PIPE_CAP_FORCE_PERSAMPLE_INTERP);
>
>     st->needs_texcoord_semantic =
>        screen->get_param(screen, PIPE_CAP_TGSI_TEXCOORD);
> diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h
> index 81d5480..a4cda29 100644
> --- a/src/mesa/state_tracker/st_context.h
> +++ b/src/mesa/state_tracker/st_context.h
> @@ -98,6 +98,7 @@ struct st_context
>     boolean has_etc1;
>     boolean has_etc2;
>     boolean prefer_blit_based_texture_transfer;
> +   boolean can_force_persample_interp;
>
>     boolean needs_texcoord_semantic;
>     boolean apply_texture_swizzle_to_border_color;
> --
> 2.1.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev