diff options
Diffstat (limited to 'src/mesa/state_tracker/st_draw.c')
-rw-r--r-- | src/mesa/state_tracker/st_draw.c | 74 |
1 files changed, 69 insertions, 5 deletions
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index 5a13fdd2bf..a88e2106d7 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -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 { |