[Mesa-dev] [PATCH] mesa/vbo: Treat attribute 0 and vertex as the same
Brian Paul
brianp at vmware.com
Fri Oct 14 08:41:44 PDT 2011
On 10/13/2011 05:34 PM, Ian Romanick wrote:
> From: Ian Romanick<ian.d.romanick at intel.com>
>
> 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<ian.d.romanick at intel.com>
> ---
> 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 <brianp at vmware.com>
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
More information about the mesa-dev
mailing list