On 10/13/2011 05:34 PM, Ian Romanick wrote:
From: Ian Romanick<[email protected]>
This is supported by the pseudo-code on pages 27 and 28 (pages 41 and
42 of the PDF) of the OpenGL 2.1 spec. The last part of the
implementation of ArrayElement is:
if (generic attribute array 0 enabled) {
if (generic vertex attribute 0 array normalization flag is set, and
type is not FLOAT or DOUBLE)
VertexAttrib[size]N[type]v(0, generic vertex attribute 0 array element
i);
else
VertexAttrib[size][type]v(0, generic vertex attribute 0 array element
i);
} else if (vertex array enabled) {
Vertex[size][type]v(vertex array element i);
}
Page 23 (page 37 of the PDF) of the same spec says:
"Setting generic vertex attribute zero specifies a vertex; the
four vertex coordinates are taken from the values of attribute
zero. A Vertex2, Vertex3, or Vertex4 command is completely
equivalent to the corresponding VertexAttrib* command with an
index of zero."
Fixes piglit test attribute0.
NOTE: This is a candidate for stable branches.
Signed-off-by: Ian Romanick<[email protected]>
---
src/mesa/vbo/vbo_exec_array.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/src/mesa/vbo/vbo_exec_array.c b/src/mesa/vbo/vbo_exec_array.c
index 18719d5..ceb6a64 100644
--- a/src/mesa/vbo/vbo_exec_array.c
+++ b/src/mesa/vbo/vbo_exec_array.c
@@ -538,7 +538,7 @@ recalculate_input_bindings(struct gl_context *ctx)
}
}
- for (i = 0; i< MAX_VERTEX_GENERIC_ATTRIBS; i++) {
+ for (i = 1; i< MAX_VERTEX_GENERIC_ATTRIBS; i++) {
if (exec->array.generic_array[i]->Enabled)
inputs[VERT_ATTRIB_GENERIC0 + i] = exec->array.generic_array[i];
else {
@@ -547,6 +547,7 @@ recalculate_input_bindings(struct gl_context *ctx)
}
}
+ inputs[VERT_ATTRIB_GENERIC0] = inputs[0];
ctx->NewState |= _NEW_ARRAY;
break;
}
Tested-by: Brian Paul <[email protected]>
This looks good to me. I hacked the attribute0 test to do some
additional experiments and it worked as expected.
There's two interesting points (IMHO) to note regarding generic
attribute 0 that I don't think are spelled out in the specs. Please
correct me if I'm wrong.
1. If a vertex shader uses gl_Vertex then the first generic attribute
that's allocated will be 1. But if the gl_Vertex is not used, the
first generic attribute that's allocated is 0. If quering
GL_MAX_VERTEX_ATTRIBS returns 16, you really only have 15 generic
attribs available if gl_Vertex is used.
2. If gl_Vertex is not used in the vertex shader, you can only draw
with vertex arrays - you can't use glBegin/End rendering. Section 2.7
of the OpenGL 2.1 spec it says that glVertexAttrib(0, ...) specifies a
vertex so if you have a vertex shader like this:
attribute vec4 vertex;
attribute vec4 color;
void main() {
gl_Position = vertex;
gl_FrontColor = color;
}
and draw like this:
vertPos = glGetAttribLocation(prog, "vertex");
colPos = glGetAttribLocation(prog, "color");
glBegin(GL_TRIANGLE_STRIP);
for (i = 0; i < n; i++) {
glVertexAttrib3fv(colAttr, colors[i]);
glVertexAttrib2fv(vertAttr, verts[i]);
}
glEnd();
It may or may not work depending on whether "vertex" is in location 0
or 1.
-Brian
_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev