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. */
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev