map Mesa vertex attribs/arrays to TGSI attribs
authorBrian <brian.paul@tungstengraphics.com>
Thu, 23 Aug 2007 23:39:52 +0000 (17:39 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 23 Aug 2007 23:39:52 +0000 (17:39 -0600)
src/mesa/state_tracker/st_draw.c

index 5a13fdd2bf738321ca5df8cc4ea9e8ca067d3299..a88e2106d70b67762af245e7f73c78e166f5bc1d 100644 (file)
@@ -44,6 +44,7 @@
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
 #include "pipe/p_winsys.h"
+#include "pipe/tgsi/core/tgsi_attribs.h"
 
 
 
@@ -71,6 +72,68 @@ pipe_vertex_format(GLenum format, GLuint size)
 }
 
 
+/**
+ * Convert a mesa vertex attribute to a TGSI attribute
+ */
+static GLuint
+tgsi_attrib_to_mesa_attrib(GLuint attr)
+{
+   switch (attr) {
+   case TGSI_ATTRIB_POS:
+      return VERT_ATTRIB_POS;
+   case TGSI_ATTRIB_WEIGHT:
+      return VERT_ATTRIB_WEIGHT;
+   case TGSI_ATTRIB_NORMAL:
+      return VERT_ATTRIB_NORMAL;
+   case TGSI_ATTRIB_COLOR0:
+      return VERT_ATTRIB_COLOR0;
+   case TGSI_ATTRIB_COLOR1:
+      return VERT_ATTRIB_COLOR1;
+   case TGSI_ATTRIB_FOG:
+      return VERT_ATTRIB_FOG;
+   case TGSI_ATTRIB_COLOR_INDEX:
+      return VERT_ATTRIB_COLOR_INDEX;
+   case TGSI_ATTRIB_EDGEFLAG:
+      return VERT_ATTRIB_EDGEFLAG;
+   case TGSI_ATTRIB_TEX0:
+      return VERT_ATTRIB_TEX0;
+   case TGSI_ATTRIB_TEX1:
+      return VERT_ATTRIB_TEX1;
+   case TGSI_ATTRIB_TEX2:
+      return VERT_ATTRIB_TEX2;
+   case TGSI_ATTRIB_TEX3:
+      return VERT_ATTRIB_TEX3;
+   case TGSI_ATTRIB_TEX4:
+      return VERT_ATTRIB_TEX4;
+   case TGSI_ATTRIB_TEX5:
+      return VERT_ATTRIB_TEX5;
+   case TGSI_ATTRIB_TEX6:
+      return VERT_ATTRIB_TEX6;
+   case TGSI_ATTRIB_TEX7:
+      return VERT_ATTRIB_TEX7;
+   case TGSI_ATTRIB_VAR0:
+      return VERT_ATTRIB_GENERIC0;
+   case TGSI_ATTRIB_VAR1:
+      return VERT_ATTRIB_GENERIC1;
+   case TGSI_ATTRIB_VAR2:
+      return VERT_ATTRIB_GENERIC2;
+   case TGSI_ATTRIB_VAR3:
+      return VERT_ATTRIB_GENERIC3;
+   case TGSI_ATTRIB_VAR4:
+      return VERT_ATTRIB_GENERIC4;
+   case TGSI_ATTRIB_VAR5:
+      return VERT_ATTRIB_GENERIC5;
+   case TGSI_ATTRIB_VAR6:
+      return VERT_ATTRIB_GENERIC6;
+   case TGSI_ATTRIB_VAR7:
+      return VERT_ATTRIB_GENERIC7;
+   default:
+      assert(0);
+      return 0;
+   }
+}
+
+
 
 /**
  * The default attribute buffer is basically a copy of the
@@ -141,27 +204,28 @@ draw_vbo(GLcontext *ctx,
       velement.src_format = 0;
 
       if (attrsNeeded & (1 << attr)) {
-         struct gl_buffer_object *bufobj = arrays[attr]->BufferObj;
+         const GLuint mesaAttr = tgsi_attrib_to_mesa_attrib(attr);
+         struct gl_buffer_object *bufobj = arrays[mesaAttr]->BufferObj;
 
          if (bufobj && bufobj->Name) {
             struct st_buffer_object *stobj = st_buffer_object(bufobj);
             /* Recall that for VBOs, the gl_client_array->Ptr field is
              * really an offset from the start of the VBO, not a pointer.
              */
-            unsigned offset = (unsigned) arrays[attr]->Ptr;
+            unsigned offset = (unsigned) arrays[mesaAttr]->Ptr;
 
             assert(stobj->buffer);
 
             vbuffer.buffer = stobj->buffer;
             vbuffer.buffer_offset = attr0_offset;  /* in bytes */
-            vbuffer.pitch = arrays[attr]->StrideB; /* in bytes */
+            vbuffer.pitch = arrays[mesaAttr]->StrideB; /* in bytes */
             vbuffer.max_index = 0;  /* need this? */
 
             velement.src_offset = offset - attr0_offset; /* bytes */
             velement.vertex_buffer_index = attr;
             velement.dst_offset = 0; /* need this? */
-            velement.src_format = pipe_vertex_format(arrays[attr]->Type,
-                                                     arrays[attr]->Size);
+            velement.src_format = pipe_vertex_format(arrays[mesaAttr]->Type,
+                                                     arrays[mesaAttr]->Size);
             assert(velement.src_format);
          }
          else {