vbo: fix VBO optimization regression
authorBrian Paul <brianp@vmware.com>
Wed, 17 Jan 2018 22:15:54 +0000 (15:15 -0700)
committerBrian Paul <brianp@vmware.com>
Thu, 18 Jan 2018 22:07:17 +0000 (15:07 -0700)
The optimization in change 8e4efdc895ea ("vbo: optimize some display
list drawing") missed the loopback case.  This is used when the
glBegin/End primitive doesn't have a uniform set of vertex attributes.
The new Piglit gl-1.0-dlist-materials test hits this.

So check the aligned_vertex_buffer_offset(list) value and adjust the
buffer offset accordingly.

We also need to remove the 'start == 0' assertion in the loopback
code since it no longer applies.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/mesa/vbo/vbo_save_draw.c
src/mesa/vbo/vbo_save_loopback.c

index f5c4a900b39801cf4c655c00621071444466fecb..ddf911700f86014e7c28c0d6cfe04d5efc1e7790 100644 (file)
@@ -240,8 +240,11 @@ loopback_vertex_list(struct gl_context *ctx,
                                  list->vertex_store->bufferobj,
                                  MAP_INTERNAL);
 
+   unsigned buffer_offset =
+      aligned_vertex_buffer_offset(list) ? 0 : list->buffer_offset;
+
    vbo_loopback_vertex_list(ctx,
-                            (const GLfloat *)(buffer + list->buffer_offset),
+                            (const GLfloat *) (buffer + buffer_offset),
                             list->attrsz,
                             list->prims,
                             list->prim_count,
index 1dae91b0b77f922eab34dc05e4832b7c3cee93a3..9c0e937fe40326e6a0543b3f73b78a4faa59cd17 100644 (file)
@@ -107,17 +107,17 @@ loopback_prim(struct gl_context *ctx,
    GLuint k;
 
    if (0)
-      printf("loopback prim %s(%s,%s) verts %d..%d\n",
+      printf("loopback prim %s(%s,%s) verts %d..%d  vsize %d\n",
              _mesa_lookup_prim_by_nr(prim->mode),
              prim->begin ? "begin" : "..",
              prim->end ? "end" : "..",
-             start, end);
+             start, end,
+             vertex_size);
 
    if (prim->begin) {
       CALL_Begin(GET_DISPATCH(), (prim->mode));
    }
    else {
-      assert(start == 0);
       start += wrap_count;
    }