[Mesa-dev] [PATCH 3/5] glsl: Add gl_MESACurrentAttrib{Vert, Frag} internal builtin uniforms.

Ian Romanick idr at freedesktop.org
Thu Oct 6 14:40:28 PDT 2011


On 10/06/2011 09:36 AM, Eric Anholt wrote:
> These will be used by the FF VS/FS to represent the current attributes
> when they don't have an active vertex array.

I just want to make sure I grok this completely.  These are arrays of 
vec4 uniforms that are used when, for example, glColor is called outside 
glBegin.  Yes?

If that's the case, what's the advantage of having it in the fragment 
shader (as opposed to using uniforms to interpolate the potentially 
constant values)?

> ---
>   src/glsl/ir_variable.cpp |   25 ++++++++++++++++++++++++-
>   1 files changed, 24 insertions(+), 1 deletions(-)
>
> diff --git a/src/glsl/ir_variable.cpp b/src/glsl/ir_variable.cpp
> index 58be64b..03fa43f 100644
> --- a/src/glsl/ir_variable.cpp
> +++ b/src/glsl/ir_variable.cpp
> @@ -178,6 +178,14 @@ static struct gl_builtin_uniform_element gl_MESAFogParamsOptimized_elements[] =
>      {NULL, {STATE_INTERNAL, STATE_FOG_PARAMS_OPTIMIZED}, SWIZZLE_XYZW},
>   };
>
> +static struct gl_builtin_uniform_element gl_MESACurrentAttribVert_elements[] = {
> +   {NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB, 0}, SWIZZLE_XYZW},
> +};
> +
> +static struct gl_builtin_uniform_element gl_MESACurrentAttribFrag_elements[] = {
> +   {NULL, {STATE_INTERNAL, STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, 0}, SWIZZLE_XYZW},
> +};
> +
>   #define MATRIX(name, statevar, modifier)				\
>      static struct gl_builtin_uniform_element name ## _elements[] = {	\
>         { NULL, { statevar, 0, 0, 0, modifier}, SWIZZLE_XYZW },		\
> @@ -284,6 +292,8 @@ const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
>      STATEVAR(gl_MESABumpRotMatrix0),
>      STATEVAR(gl_MESABumpRotMatrix1),
>      STATEVAR(gl_MESAFogParamsOptimized),
> +   STATEVAR(gl_MESACurrentAttribVert),
> +   STATEVAR(gl_MESACurrentAttribFrag),

My preference would be to use the "regular" GLSL extension naming 
convention (even though we're not exposing these names directly).  That 
is, gl_CurrentAttribVertMESA and gl_CurrentAttribFragMESA.  I would have 
made the same comment about the other statevar names here, but I was too 
slow getting reviews out.

>
>      {NULL, NULL, 0}
>   };
> @@ -355,7 +365,12 @@ add_uniform(exec_list *instructions, glsl_symbol_table *symtab,
>
>   	 memcpy(slots->tokens, element->tokens, sizeof(element->tokens));
>   	 if (type->is_array()) {
> -	    slots->tokens[1] = a;
> +	    if (strcmp(name, "gl_MESACurrentAttribVert") == 0 ||
> +		strcmp(name, "gl_MESACurrentAttribFrag") == 0) {
> +	       slots->tokens[2] = a;
> +	    } else {
> +	       slots->tokens[1] = a;
> +	    }
>   	 }
>
>   	 slots->swizzle = element->swizzle;
> @@ -518,6 +533,14 @@ generate_110_uniforms(exec_list *instructions,
>
>      add_uniform(instructions, symtab, "gl_Fog",
>   	       symtab->get_type("gl_FogParameters"));
> +
> +   /* Mesa-internal current attrib state */
> +   const glsl_type *const vert_attribs =
> +      glsl_type::get_array_instance(glsl_type::vec4_type, VERT_ATTRIB_MAX);
> +   add_uniform(instructions, symtab, "gl_MESACurrentAttribVert", vert_attribs);
> +   const glsl_type *const frag_attribs =
> +      glsl_type::get_array_instance(glsl_type::vec4_type, FRAG_ATTRIB_MAX);
> +   add_uniform(instructions, symtab, "gl_MESACurrentAttribFrag", frag_attribs);
>   }
>
>   /* This function should only be called for ES, not desktop GL. */


More information about the mesa-dev mailing list