diff options
author | Anuj Phogat <[email protected]> | 2013-10-16 17:22:18 -0700 |
---|---|---|
committer | Anuj Phogat <[email protected]> | 2013-11-01 16:01:48 -0700 |
commit | 627b2692e916060f1cb72d5e254b63927961687d (patch) | |
tree | 44bd1a1aecc75eff2f4d2e2361d173a589d2dc0b /src/mesa/program/program.c | |
parent | e849511c781672487aec416708abd1166b3b4983 (diff) |
mesa: Add a helper function _mesa_get_min_invocations_per_fragment()
This function is used to test if we need to do per sample shading or
per fragment shading.
V2: Use MAX2() to make sure the function returns a number >= 1.
Signed-off-by: Anuj Phogat <[email protected]>
Reviewed-by: Ian Romanick <[email protected]>
Reviewed-by: Paul Berry <[email protected]>
Diffstat (limited to 'src/mesa/program/program.c')
-rw-r--r-- | src/mesa/program/program.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/mesa/program/program.c b/src/mesa/program/program.c index 093d37297b4..a102ec17ab4 100644 --- a/src/mesa/program/program.c +++ b/src/mesa/program/program.c @@ -32,6 +32,7 @@ #include "main/glheader.h" #include "main/context.h" #include "main/hash.h" +#include "main/macros.h" #include "program.h" #include "prog_cache.h" #include "prog_parameter.h" @@ -1024,3 +1025,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 | + SYSTEM_BIT_SAMPLE_POS)) + return MAX2(ctx->DrawBuffer->Visual.samples, 1); + else if (ctx->Multisample.SampleShading) + return MAX2(ceil(ctx->Multisample.MinSampleShadingValue * + ctx->DrawBuffer->Visual.samples), 1); + else + return 1; + } + return 1; +} |