vbo: Move no_current_update out of _mesa_prim.
authorMathias Fröhlich <mathias.froehlich@web.de>
Mon, 29 Oct 2018 05:13:19 +0000 (06:13 +0100)
committerMathias Fröhlich <mathias.froehlich@web.de>
Thu, 1 Nov 2018 05:08:49 +0000 (06:08 +0100)
The _mesa_prim::no_current_update flag should tell the compiled
display list if the current attributes that are placed in the dlists
vbo shall take a defined state past replay of a display list.
Immediate mode draws compiled into display lists should set the
current values. Array draws may leave the current values in
undefined state.
So finally this flag is not a property of every primitive
but it is a property of the compiled display list and there it
is a property of the last primitive compiled into the list.
So move the flag out of _mesa_prim into vbo_save.

Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
src/mesa/vbo/vbo.h
src/mesa/vbo/vbo_save.c
src/mesa/vbo/vbo_save.h
src/mesa/vbo/vbo_save_api.c

index eccef1a3ffccffaab664646dffe315bf7205f39a..ac0be5acf4a9022ea50cd2d57ad77e714b44fa40 100644 (file)
@@ -46,9 +46,8 @@ struct _mesa_prim
    GLuint indexed:1;
    GLuint begin:1;
    GLuint end:1;
-   GLuint no_current_update:1;
    GLuint is_indirect:1;
-   GLuint pad:19;
+   GLuint pad:20;
 
    GLuint start;
    GLuint count;
index 7e77123ba8c6f734142df1151222c1f490a18510..55b7792b85bdd67e9f48f14142e11a053f95743a 100644 (file)
@@ -47,6 +47,8 @@ void vbo_save_init( struct gl_context *ctx )
    for (gl_vertex_processing_mode vpm = VP_MODE_FF; vpm < VP_MODE_MAX; ++vpm)
       save->VAO[vpm] = NULL;
 
+   save->no_current_update = false;
+
    ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
 }
 
index 65293c93f048ded529b270f549e71d6998a6508c..6f2cc5bad423174cc326736db8d3f8bad1629cbe 100644 (file)
@@ -173,6 +173,8 @@ struct vbo_save_context {
    struct _mesa_prim *prims;
    GLuint prim_count, prim_max;
 
+   bool no_current_update;
+
    struct vbo_save_vertex_store *vertex_store;
    struct vbo_save_primitive_store *prim_store;
 
index 4cc315136c7fc35f764ca84b502e5078464ea885..28f8c46793b0b5a76f1ca8a751a5706718af9e8f 100644 (file)
@@ -602,7 +602,7 @@ compile_vertex_list(struct gl_context *ctx)
 
    node->prim_store->refcount++;
 
-   if (node->prims[0].no_current_update) {
+   if (save->no_current_update) {
       node->current_data = NULL;
    }
    else {
@@ -720,7 +720,6 @@ wrap_buffers(struct gl_context *ctx)
    struct vbo_save_context *save = &vbo_context(ctx)->save;
    GLint i = save->prim_count - 1;
    GLenum mode;
-   GLboolean no_current_update;
 
    assert(i < (GLint) save->prim_max);
    assert(i >= 0);
@@ -729,7 +728,6 @@ wrap_buffers(struct gl_context *ctx)
     */
    save->prims[i].count = (save->vert_count - save->prims[i].start);
    mode = save->prims[i].mode;
-   no_current_update = save->prims[i].no_current_update;
 
    /* store the copied vertices, and allocate a new list.
     */
@@ -738,7 +736,6 @@ wrap_buffers(struct gl_context *ctx)
    /* Restart interrupted primitive
     */
    save->prims[0].mode = mode;
-   save->prims[0].no_current_update = no_current_update;
    save->prims[0].begin = 0;
    save->prims[0].end = 0;
    save->prims[0].pad = 0;
@@ -1205,8 +1202,6 @@ vbo_save_NotifyBegin(struct gl_context *ctx, GLenum mode)
    save->prims[i].mode = mode & VBO_SAVE_PRIM_MODE_MASK;
    save->prims[i].begin = 1;
    save->prims[i].end = 0;
-   save->prims[i].no_current_update =
-      (mode & VBO_SAVE_PRIM_NO_CURRENT_UPDATE) ? 1 : 0;
    save->prims[i].pad = 0;
    save->prims[i].start = save->vert_count;
    save->prims[i].count = 0;
@@ -1214,6 +1209,9 @@ vbo_save_NotifyBegin(struct gl_context *ctx, GLenum mode)
    save->prims[i].base_instance = 0;
    save->prims[i].is_indirect = 0;
 
+   save->no_current_update =
+      (mode & VBO_SAVE_PRIM_NO_CURRENT_UPDATE) ? 1 : 0;
+
    if (save->out_of_memory) {
       _mesa_install_save_vtxfmt(ctx, &save->vtxfmt_noop);
    }