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

Reply via email to