[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