[Mesa-dev] [PATCH 04/12] mesa: Add a helper function _mesa_get_min_invocations_per_fragment()

Ian Romanick idr at freedesktop.org
Mon Oct 28 18:32:36 CET 2013


On 10/25/2013 04:45 PM, Anuj Phogat wrote:
> Thsi function is used to test if we need to do per sample shading or
> per fragment shading.
> 
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>

With the one change mentioned below, this patch is

Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>

> ---
>  src/mesa/program/program.c | 31 +++++++++++++++++++++++++++++++
>  src/mesa/program/program.h |  3 +++
>  2 files changed, 34 insertions(+)
> 
> diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c
> index 093d372..e12e6ec 100644
> --- a/src/mesa/program/program.c
> +++ b/src/mesa/program/program.c
> @@ -1024,3 +1024,34 @@ _mesa_postprocess_program(struct gl_context *ctx, struct gl_program *prog)
>  
>     }
>  }
> +
> +/* Gets the minimum number of shader invocations per fragment.
> + * This function is useful to determine if we need to do per
> + * sample shading or per fragment shading.
> + */
> +GLint
> +_mesa_get_min_invocations_per_fragment(struct gl_context *ctx,
> +                                       const struct gl_fragment_program *prog)
> +{
> +   /* From ARB_sample_shading specification:
> +    * "Using gl_SampleID in a fragment shader causes the entire shader
> +    *  to be evaluated per-sample."
> +    *
> +    * "Using gl_SamplePosition in a fragment shader causes the entire
> +    *  shader to be evaluated per-sample."
> +    *
> +    * "If MULTISAMPLE or SAMPLE_SHADING_ARB is disabled, sample shading
> +    *  has no effect."
> +    */
> +   if (ctx->Multisample.Enabled) {
> +      if (prog->Base.SystemValuesRead & SYSTEM_BIT_SAMPLE_ID ||
> +          prog->Base.SystemValuesRead & SYSTEM_BIT_SAMPLE_POS)

      if (prog->Base.SystemValuesRead & (SYSTEM_BIT_SAMPLE_ID |
                                         SYSTEM_BIT_SAMPLE_POS))

> +         return ctx->DrawBuffer->Visual.samples;
> +      else if (ctx->Multisample.SampleShading)
> +         return ceil(ctx->Multisample.MinSampleShadingValue *
> +                     ctx->DrawBuffer->Visual.samples);
> +      else
> +         return 1;
> +   }
> +   return 1;
> +}
> diff --git a/src/mesa/program/program.h b/src/mesa/program/program.h
> index 34965ab..353ccab 100644
> --- a/src/mesa/program/program.h
> +++ b/src/mesa/program/program.h
> @@ -187,6 +187,9 @@ _mesa_valid_register_index(const struct gl_context *ctx,
>  extern void
>  _mesa_postprocess_program(struct gl_context *ctx, struct gl_program *prog);
>  
> +extern GLint
> +_mesa_get_min_invocations_per_fragment(struct gl_context *ctx,
> +                                       const struct gl_fragment_program *prog);
>  
>  static inline GLuint
>  _mesa_program_target_to_index(GLenum v)
> 



More information about the mesa-dev mailing list