vbo: merge more primitive types for glBegin/End (v2)
[mesa.git] / src / mesa / vbo / vbo_save_draw.c
index 71620e9a3cd262a32d9c4ed6da61ef9afc6b82d0..e193a5a32af4bff8aee13ae7a0feeac053369ecd 100644 (file)
@@ -47,28 +47,30 @@ copy_vao(struct gl_context *ctx, const struct gl_vertex_array_object *vao,
 {
    struct vbo_context *vbo = vbo_context(ctx);
 
-   mask &= vao->_Enabled;
+   mask &= vao->Enabled;
    while (mask) {
       const int i = u_bit_scan(&mask);
       const struct gl_array_attributes *attrib = &vao->VertexAttrib[i];
       struct gl_array_attributes *currval = &vbo->current[shift + i];
-      const GLubyte size = attrib->Size;
-      const GLenum16 type = attrib->Type;
-      fi_type tmp[4];
+      const GLubyte size = attrib->Format.Size;
+      const GLenum16 type = attrib->Format.Type;
+      fi_type tmp[8];
+      int dmul = 1;
 
-      COPY_CLEAN_4V_TYPE_AS_UNION(tmp, size, *data, type);
+      if (type == GL_DOUBLE ||
+          type == GL_UNSIGNED_INT64_ARB)
+         dmul = 2;
 
-      if (type != currval->Type ||
-          memcmp(currval->Ptr, tmp, 4 * sizeof(GLfloat)) != 0) {
-         memcpy((fi_type*)currval->Ptr, tmp, 4 * sizeof(GLfloat));
+      if (dmul == 2)
+         memcpy(tmp, *data, size * dmul * sizeof(GLfloat));
+      else
+         COPY_CLEAN_4V_TYPE_AS_UNION(tmp, size, *data, type);
+
+      if (type != currval->Format.Type ||
+          memcmp(currval->Ptr, tmp, 4 * sizeof(GLfloat) * dmul) != 0) {
+         memcpy((fi_type*)currval->Ptr, tmp, 4 * sizeof(GLfloat) * dmul);
 
-         currval->Size = size;
-         currval->_ElementSize = size * sizeof(GLfloat);
-         currval->Type = type;
-         currval->Integer = vbo_attrtype_to_integer_flag(type);
-         currval->Doubles = vbo_attrtype_to_double_flag(type);
-         currval->Normalized = GL_FALSE;
-         currval->Format = GL_RGBA;
+         vbo_set_vertex_format(&currval->Format, size, type);
 
          ctx->NewState |= state;
       }
@@ -211,7 +213,7 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
          GLuint min_index = _vbo_save_get_min_index(node);
          GLuint max_index = _vbo_save_get_max_index(node);
          ctx->Driver.Draw(ctx, node->prims, node->prim_count, NULL, GL_TRUE,
-                          min_index, max_index, NULL, 0, NULL);
+                          min_index, max_index, 1, 0, NULL, 0);
       }
    }