}
-#define EMIT_ATTR( ATTR, STYLE ) \
-do { \
- draw->attrs[draw->nr_attrs].attrib = ATTR; \
- draw->attrs[draw->nr_attrs].format = STYLE; \
- draw->nr_attrs++; \
+/**
+ * Accumulate another attribute's info.
+ * Note the "- 2" factor here. We need this because the vertex->data[]
+ * array does not include the first two attributes we emit (VERTEX_HEADER
+ * and CLIP_POS). So, the 3rd attribute actually winds up in the 1st
+ * position of the data[] array.
+ */
+#define EMIT_ATTR( VF_ATTR, STYLE ) \
+do { \
+ if (draw->nr_attrs >= 2) \
+ draw->vf_attr_to_slot[VF_ATTR] = draw->nr_attrs - 2; \
+ draw->attrs[draw->nr_attrs].attrib = VF_ATTR; \
+ draw->attrs[draw->nr_attrs].format = STYLE; \
+ draw->nr_attrs++; \
} while (0)
+/**
+ * Tell the draw module about the layout of attributes in the vertex.
+ * We need this in order to know which vertex slot has color0, etc.
+ *
+ * \param slot_to_vf_attr an array which maps slot indexes to vertex
+ * format tokens (VF_*).
+ * \param nr_attrs the size of the slot_to_vf_attr array
+ * (and number of attributes)
+ */
void draw_set_vertex_attributes( struct draw_context *draw,
- const GLuint *attrs,
+ const GLuint *slot_to_vf_attr,
GLuint nr_attrs )
{
GLuint i;
+ memset(draw->vf_attr_to_slot, 0, sizeof(draw->vf_attr_to_slot));
draw->nr_attrs = 0;
+ /*
+ * First three attribs are always the same: header, clip pos, winpos
+ */
EMIT_ATTR(VF_ATTRIB_VERTEX_HEADER, EMIT_1F);
EMIT_ATTR(VF_ATTRIB_CLIP_POS, EMIT_4F);
- assert(attrs[0] == VF_ATTRIB_POS);
- EMIT_ATTR(attrs[0], EMIT_4F_VIEWPORT);
+ assert(slot_to_vf_attr[0] == VF_ATTRIB_POS);
+ EMIT_ATTR(slot_to_vf_attr[0], EMIT_4F_VIEWPORT);
+ /*
+ * Remaining attribs (color, texcoords, etc)
+ */
for (i = 1; i < nr_attrs; i++)
- EMIT_ATTR(attrs[i], EMIT_4F);
+ EMIT_ATTR(slot_to_vf_attr[i], EMIT_4F);
- draw->vertex_size = vf_set_vertex_attributes( draw->vf, draw->attrs, draw->nr_attrs, 0 );
+ /* tell the vertex format module how to construct vertices for us */
+ draw->vertex_size = vf_set_vertex_attributes( draw->vf, draw->attrs,
+ draw->nr_attrs, 0 );
}