Browse Source

vbo: Move no_current_update out of _mesa_prim.

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>
tags/18.3-branchpoint
Mathias Fröhlich 6 years ago
parent
commit
b899f5e59c
4 changed files with 9 additions and 8 deletions
  1. 1
    2
      src/mesa/vbo/vbo.h
  2. 2
    0
      src/mesa/vbo/vbo_save.c
  3. 2
    0
      src/mesa/vbo/vbo_save.h
  4. 4
    6
      src/mesa/vbo/vbo_save_api.c

+ 1
- 2
src/mesa/vbo/vbo.h View File

GLuint indexed:1; GLuint indexed:1;
GLuint begin:1; GLuint begin:1;
GLuint end:1; GLuint end:1;
GLuint no_current_update:1;
GLuint is_indirect:1; GLuint is_indirect:1;
GLuint pad:19;
GLuint pad:20;


GLuint start; GLuint start;
GLuint count; GLuint count;

+ 2
- 0
src/mesa/vbo/vbo_save.c View File

for (gl_vertex_processing_mode vpm = VP_MODE_FF; vpm < VP_MODE_MAX; ++vpm) for (gl_vertex_processing_mode vpm = VP_MODE_FF; vpm < VP_MODE_MAX; ++vpm)
save->VAO[vpm] = NULL; save->VAO[vpm] = NULL;


save->no_current_update = false;

ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
} }



+ 2
- 0
src/mesa/vbo/vbo_save.h View File

struct _mesa_prim *prims; struct _mesa_prim *prims;
GLuint prim_count, prim_max; GLuint prim_count, prim_max;


bool no_current_update;

struct vbo_save_vertex_store *vertex_store; struct vbo_save_vertex_store *vertex_store;
struct vbo_save_primitive_store *prim_store; struct vbo_save_primitive_store *prim_store;



+ 4
- 6
src/mesa/vbo/vbo_save_api.c View File



node->prim_store->refcount++; node->prim_store->refcount++;


if (node->prims[0].no_current_update) {
if (save->no_current_update) {
node->current_data = NULL; node->current_data = NULL;
} }
else { else {
struct vbo_save_context *save = &vbo_context(ctx)->save; struct vbo_save_context *save = &vbo_context(ctx)->save;
GLint i = save->prim_count - 1; GLint i = save->prim_count - 1;
GLenum mode; GLenum mode;
GLboolean no_current_update;


assert(i < (GLint) save->prim_max); assert(i < (GLint) save->prim_max);
assert(i >= 0); assert(i >= 0);
*/ */
save->prims[i].count = (save->vert_count - save->prims[i].start); save->prims[i].count = (save->vert_count - save->prims[i].start);
mode = save->prims[i].mode; mode = save->prims[i].mode;
no_current_update = save->prims[i].no_current_update;


/* store the copied vertices, and allocate a new list. /* store the copied vertices, and allocate a new list.
*/ */
/* Restart interrupted primitive /* Restart interrupted primitive
*/ */
save->prims[0].mode = mode; save->prims[0].mode = mode;
save->prims[0].no_current_update = no_current_update;
save->prims[0].begin = 0; save->prims[0].begin = 0;
save->prims[0].end = 0; save->prims[0].end = 0;
save->prims[0].pad = 0; save->prims[0].pad = 0;
save->prims[i].mode = mode & VBO_SAVE_PRIM_MODE_MASK; save->prims[i].mode = mode & VBO_SAVE_PRIM_MODE_MASK;
save->prims[i].begin = 1; save->prims[i].begin = 1;
save->prims[i].end = 0; 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].pad = 0;
save->prims[i].start = save->vert_count; save->prims[i].start = save->vert_count;
save->prims[i].count = 0; save->prims[i].count = 0;
save->prims[i].base_instance = 0; save->prims[i].base_instance = 0;
save->prims[i].is_indirect = 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) { if (save->out_of_memory) {
_mesa_install_save_vtxfmt(ctx, &save->vtxfmt_noop); _mesa_install_save_vtxfmt(ctx, &save->vtxfmt_noop);
} }

Loading…
Cancel
Save