- (void) memset(dst, 0, ((uint16_t *) arrays->arrays[i].header)[0]);
-
- (void) memcpy(dst, arrays->arrays[i].header,
- arrays->arrays[i].header_size);
-
- dst += arrays->arrays[i].header_size;
-
- (void) memcpy(dst, ((GLubyte *) arrays->arrays[i].data) + offset,
- arrays->arrays[i].element_size);
-
- dst += __GLX_PAD(arrays->arrays[i].element_size);
+ (void) memset(dst, 0, arrays->arrays[i].header[0]);
+
+ (void) memcpy(dst, arrays->arrays[i].header, 4);
+
+ dst += 4;
+
+ if (arrays->arrays[i].key == GL_TEXTURE_COORD_ARRAY &&
+ arrays->arrays[i].index > 0) {
+ /* Multi-texture coordinate arrays require the texture target
+ * to be sent. For doubles it is after the data, for everything
+ * else it is before.
+ */
+ GLenum texture = arrays->arrays[i].index + GL_TEXTURE0;
+ if (arrays->arrays[i].data_type == GL_DOUBLE) {
+ (void) memcpy(dst, ((GLubyte *) arrays->arrays[i].data) + offset,
+ arrays->arrays[i].element_size);
+ dst += arrays->arrays[i].element_size;
+ (void) memcpy(dst, &texture, 4);
+ dst += 4;
+ } else {
+ (void) memcpy(dst, &texture, 4);
+ dst += 4;
+ (void) memcpy(dst, ((GLubyte *) arrays->arrays[i].data) + offset,
+ arrays->arrays[i].element_size);
+ dst += __GLX_PAD(arrays->arrays[i].element_size);
+ }
+ } else if (arrays->arrays[i].key == GL_VERTEX_ATTRIB_ARRAY_POINTER) {
+ /* Vertex attribute data requires the index sent first.
+ */
+ (void) memcpy(dst, &arrays->arrays[i].index, 4);
+ dst += 4;
+ (void) memcpy(dst, ((GLubyte *) arrays->arrays[i].data) + offset,
+ arrays->arrays[i].element_size);
+ dst += __GLX_PAD(arrays->arrays[i].element_size);
+ } else {
+ (void) memcpy(dst, ((GLubyte *) arrays->arrays[i].data) + offset,
+ arrays->arrays[i].element_size);
+ dst += __GLX_PAD(arrays->arrays[i].element_size);
+ }