[Mesa-dev] [PATCH V2 05/12] glsl: Add new builtins required by GL_ARB_sample_shading

Ian Romanick idr at freedesktop.org
Mon Oct 28 18:34:40 CET 2013


On 10/25/2013 04:45 PM, Anuj Phogat wrote:
> New builtins added by GL_ARB_sample_shading:
> in vec2 gl_SamplePosition
> in int gl_SampleID
> in int gl_NumSamples
> out int gl_SampleMask[]
> 
> V2: - Use SWIZZLE_XXXX for STATE_NUM_SAMPLES.
>     - Use "result.samplemask" in arb_output_attrib_string.
>     - Add comment to explain the size of gl_SampleMask[] array.
>     - Make gl_SampleID and gl_SamplePosition system values.
> Signed-off-by: Anuj Phogat <anuj.phogat at gmail.com>
> Reviewed-by: Paul Berry <stereotype441 at gmail.com>

With the two minor nits below fixed, this patch is

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

> ---
>  src/glsl/builtin_variables.cpp | 18 ++++++++++++++++++
>  src/mesa/main/mtypes.h         | 10 +++++++++-
>  src/mesa/program/prog_print.c  |  1 +
>  3 files changed, 28 insertions(+), 1 deletion(-)
> 
> diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp
> index 64f3406..bb3d057 100644
> --- a/src/glsl/builtin_variables.cpp
> +++ b/src/glsl/builtin_variables.cpp
> @@ -30,6 +30,9 @@
>  #include "program/prog_statevars.h"
>  #include "program/prog_instruction.h"
>  
> +static struct gl_builtin_uniform_element gl_NumSamples_elements[] = {
> +   {NULL, {STATE_NUM_SAMPLES, 0, 0}, SWIZZLE_XXXX}
> +};
>  
>  static struct gl_builtin_uniform_element gl_DepthRange_elements[] = {
>     {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX},
> @@ -236,6 +239,7 @@ static struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
>  #define STATEVAR(name) {#name, name ## _elements, Elements(name ## _elements)}
>  
>  static const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
> +   STATEVAR(gl_NumSamples),
>     STATEVAR(gl_DepthRange),
>     STATEVAR(gl_ClipPlane),
>     STATEVAR(gl_Point),
> @@ -645,6 +649,7 @@ builtin_variable_generator::generate_constants()
>  void
>  builtin_variable_generator::generate_uniforms()
>  {
> +   add_uniform(int_t, "gl_NumSamples");
>     add_uniform(type("gl_DepthRangeParameters"), "gl_DepthRange");
>     add_uniform(array(vec4_t, VERT_ATTRIB_MAX), "gl_CurrentAttribVertMESA");
>     add_uniform(array(vec4_t, VARYING_SLOT_MAX), "gl_CurrentAttribFragMESA");
> @@ -821,6 +826,19 @@ builtin_variable_generator::generate_fs_special_vars()
>        if (state->AMD_shader_stencil_export_warn)
>           var->warn_extension = "GL_AMD_shader_stencil_export";
>     }
> +
> +   if (state->ARB_sample_shading_enable) {
> +      add_system_value(SYSTEM_VALUE_SAMPLE_ID, int_t, "gl_SampleID");
> +      add_system_value(SYSTEM_VALUE_SAMPLE_POS, vec2_t, "gl_SamplePosition");
> +      /* From the ARB_sample_shading specification:
> +       * "The number of elements in the array is ceil(<s>/32), where <s>
> +       *  is the maximum number of color samples supported by the
> +       *  implementation."
> +       *  Since no drivers expose more than 32x MSAA, we can simply set
> +       *  the array size to 1 rather than computing it.
> +       */

The formatting (indentation after the spec quote) is a little off.

> +      add_output(FRAG_RESULT_SAMPLE_MASK, array(int_t, 1), "gl_SampleMask");
> +   }
>  }
>  
>  
> diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> index 8306969..869470e 100644
> --- a/src/mesa/main/mtypes.h
> +++ b/src/mesa/main/mtypes.h
> @@ -274,6 +274,11 @@ typedef enum
>  #define VARYING_BIT_VAR(V) BITFIELD64_BIT(VARYING_SLOT_VAR0 + (V))
>  /*@}*/
>  
> +/**
> + * Bitflags for system values.
> + */
> +#define SYSTEM_BIT_SAMPLE_ID BITFIELD64_BIT(SYSTEM_VALUE_SAMPLE_ID)
> +#define SYSTEM_BIT_SAMPLE_POS BITFIELD64_BIT(SYSTEM_VALUE_SAMPLE_POS)
>  
>  /**
>   * Determine if the given gl_varying_slot appears in the fragment shader.
> @@ -306,12 +311,13 @@ typedef enum
>      * register is written.  No FRAG_RESULT_DATAn will be written.
>      */
>     FRAG_RESULT_COLOR = 2,
> +   FRAG_RESULT_SAMPLE_MASK = 3,
>  
>     /* FRAG_RESULT_DATAn are the per-render-target (GLSL gl_FragData[n]
>      * or ARB_fragment_program fragment.color[n]) color results.  If
>      * any are written, FRAG_RESULT_COLOR will not be written.
>      */
> -   FRAG_RESULT_DATA0 = 3,
> +   FRAG_RESULT_DATA0 = 4,
>     FRAG_RESULT_MAX = (FRAG_RESULT_DATA0 + MAX_DRAW_BUFFERS)
>  } gl_frag_result;
>  
> @@ -1904,6 +1910,8 @@ typedef enum
>     SYSTEM_VALUE_FRONT_FACE,  /**< Fragment shader only (not done yet) */
>     SYSTEM_VALUE_VERTEX_ID,   /**< Vertex shader only */
>     SYSTEM_VALUE_INSTANCE_ID, /**< Vertex shader only */
> +   SYSTEM_VALUE_SAMPLE_ID, /**< Fragment shader only */
> +   SYSTEM_VALUE_SAMPLE_POS, /**< Fragment shader only */

The /**< should line up with the others.

>     SYSTEM_VALUE_MAX          /**< Number of values */
>  } gl_system_value;
>  
> diff --git a/src/mesa/program/prog_print.c b/src/mesa/program/prog_print.c
> index cf85213..fa9063f 100644
> --- a/src/mesa/program/prog_print.c
> +++ b/src/mesa/program/prog_print.c
> @@ -311,6 +311,7 @@ arb_output_attrib_string(GLint index, GLenum progType)
>        "result.depth", /* FRAG_RESULT_DEPTH */
>        "result.(one)", /* FRAG_RESULT_STENCIL */
>        "result.color", /* FRAG_RESULT_COLOR */
> +      "result.samplemask", /* FRAG_RESULT_SAMPLE_MASK */
>        "result.color[0]", /* FRAG_RESULT_DATA0 (named for GLSL's gl_FragData) */
>        "result.color[1]",
>        "result.color[2]",
> 



More information about the mesa-dev mailing list