vbo/dlist: remove vbo_save_context::vert_count

The same property can be deduced directly from the vertex_store,
so remove this one to avoid sync problems between the two and
simplify the code.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12646>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2021-08-13 15:39:17 +02:00
parent 2671b9c90f
commit dd55d9f2b3
2 changed files with 32 additions and 29 deletions

View File

@ -173,7 +173,6 @@ struct vbo_save_context {
fi_type vertex[VBO_ATTRIB_MAX*4]; /* current values */ fi_type vertex[VBO_ATTRIB_MAX*4]; /* current values */
fi_type *attrptr[VBO_ATTRIB_MAX]; fi_type *attrptr[VBO_ATTRIB_MAX];
GLuint vert_count;
GLboolean dangling_attr_ref; GLboolean dangling_attr_ref;
struct { struct {

View File

@ -177,7 +177,6 @@ reset_counters(struct gl_context *ctx)
save->vertex_store->used = 0; save->vertex_store->used = 0;
save->prim_store->used = 0; save->prim_store->used = 0;
save->vert_count = 0;
save->dangling_attr_ref = GL_FALSE; save->dangling_attr_ref = GL_FALSE;
} }
@ -249,7 +248,6 @@ convert_line_loop_to_strip(struct vbo_save_context *save,
prim->count++; prim->count++;
node->cold->vertex_count++; node->cold->vertex_count++;
save->vert_count++;
save->vertex_store->used += sz; save->vertex_store->used += sz;
} }
@ -487,6 +485,15 @@ add_vertex(struct vbo_save_context *save, struct hash_table *hash_to_index,
} }
static uint32_t
get_vertex_count(struct vbo_save_context *save)
{
if (!save->vertex_size)
return 0;
return save->vertex_store->used / save->vertex_size;
}
/** /**
* Insert the active immediate struct onto the display list currently * Insert the active immediate struct onto the display list currently
* being built. * being built.
@ -514,7 +521,7 @@ compile_vertex_list(struct gl_context *ctx)
const GLsizei stride = save->vertex_size*sizeof(GLfloat); const GLsizei stride = save->vertex_size*sizeof(GLfloat);
node->cold->vertex_count = save->vert_count; node->cold->vertex_count = get_vertex_count(save);
node->cold->wrap_count = save->copied.nr; node->cold->wrap_count = save->copied.nr;
node->cold->prims = malloc(sizeof(struct _mesa_prim) * save->prim_store->used); node->cold->prims = malloc(sizeof(struct _mesa_prim) * save->prim_store->used);
memcpy(node->cold->prims, save->prim_store->prims, sizeof(struct _mesa_prim) * save->prim_store->used); memcpy(node->cold->prims, save->prim_store->prims, sizeof(struct _mesa_prim) * save->prim_store->used);
@ -567,7 +574,7 @@ compile_vertex_list(struct gl_context *ctx)
/* Create an index buffer. */ /* Create an index buffer. */
node->cold->min_index = node->cold->max_index = 0; node->cold->min_index = node->cold->max_index = 0;
if (save->vert_count == 0 || node->cold->prim_count == 0) if (node->cold->vertex_count == 0 || node->cold->prim_count == 0)
goto end; goto end;
/* We won't modify node->prims, so use a const alias to avoid unintended /* We won't modify node->prims, so use a const alias to avoid unintended
@ -932,7 +939,7 @@ wrap_buffers(struct gl_context *ctx)
/* Close off in-progress primitive. /* Close off in-progress primitive.
*/ */
save->prim_store->prims[i].count = (save->vert_count - save->prim_store->prims[i].start); save->prim_store->prims[i].count = (get_vertex_count(save) - save->prim_store->prims[i].start);
mode = save->prim_store->prims[i].mode; mode = save->prim_store->prims[i].mode;
/* store the copied vertices, and allocate a new list. /* store the copied vertices, and allocate a new list.
@ -959,17 +966,15 @@ wrap_filled_vertex(struct gl_context *ctx)
{ {
struct vbo_save_context *save = &vbo_context(ctx)->save; struct vbo_save_context *save = &vbo_context(ctx)->save;
unsigned numComponents; unsigned numComponents;
ASSERTED uint32_t max_vert = save->vertex_size ?
save->vertex_store->buffer_in_ram_size / (sizeof(float) * save->vertex_size) : 0;
/* Emit a glEnd to close off the last vertex list. /* Emit a glEnd to close off the last vertex list.
*/ */
wrap_buffers(ctx); wrap_buffers(ctx);
assert(save->vertex_store->used == 0 && save->vertex_store->used == 0);
/* Copy stored stored vertices to start of new list. /* Copy stored stored vertices to start of new list.
*/ */
assert(max_vert - save->vert_count > save->copied.nr);
numComponents = save->copied.nr * save->vertex_size; numComponents = save->copied.nr * save->vertex_size;
fi_type *buffer_ptr = save->vertex_store->buffer_in_ram; fi_type *buffer_ptr = save->vertex_store->buffer_in_ram;
@ -981,8 +986,6 @@ wrap_filled_vertex(struct gl_context *ctx)
free(save->copied.buffer); free(save->copied.buffer);
save->copied.buffer = NULL; save->copied.buffer = NULL;
} }
assert(save->vertex_store->used == 0 && save->vert_count == 0);
save->vert_count = save->copied.nr;
save->vertex_store->used = numComponents; save->vertex_store->used = numComponents;
} }
@ -1053,7 +1056,7 @@ upgrade_vertex(struct gl_context *ctx, GLuint attr, GLuint newsz)
/* Store the current run of vertices, and emit a GL_END. Emit a /* Store the current run of vertices, and emit a GL_END. Emit a
* BEGIN in the new buffer. * BEGIN in the new buffer.
*/ */
if (save->vert_count) if (save->vertex_store->used)
wrap_buffers(ctx); wrap_buffers(ctx);
else else
assert(save->copied.nr == 0); assert(save->copied.nr == 0);
@ -1071,7 +1074,6 @@ upgrade_vertex(struct gl_context *ctx, GLuint attr, GLuint newsz)
save->enabled |= BITFIELD64_BIT(attr); save->enabled |= BITFIELD64_BIT(attr);
save->vertex_size += newsz - oldsz; save->vertex_size += newsz - oldsz;
save->vert_count = 0;
/* Recalculate all the attrptr[] values: /* Recalculate all the attrptr[] values:
*/ */
@ -1134,7 +1136,6 @@ upgrade_vertex(struct gl_context *ctx, GLuint attr, GLuint newsz)
} }
} }
save->vert_count += save->copied.nr;
save->vertex_store->used += save->vertex_size * save->copied.nr; save->vertex_store->used += save->vertex_size * save->copied.nr;
free(save->copied.buffer); free(save->copied.buffer);
save->copied.buffer = NULL; save->copied.buffer = NULL;
@ -1239,16 +1240,16 @@ do { \
\ \
if ((A) == 0) { \ if ((A) == 0) { \
GLuint i; \ GLuint i; \
uint32_t max_vert = save->vertex_size ? \
save->vertex_store->buffer_in_ram_size / (sizeof(float) * save->vertex_size) : 0; \
fi_type *buffer_ptr = save->vertex_store->buffer_in_ram + save->vertex_store->used; \ fi_type *buffer_ptr = save->vertex_store->buffer_in_ram + save->vertex_store->used; \
\ \
for (i = 0; i < save->vertex_size; i++) \ for (i = 0; i < save->vertex_size; i++) \
buffer_ptr[i] = save->vertex[i]; \ buffer_ptr[i] = save->vertex[i]; \
\ \
save->vertex_store->used += save->vertex_size; \ save->vertex_store->used += save->vertex_size; \
if (++save->vert_count >= max_vert) \ if ((save->vertex_store->used + save->vertex_size) * sizeof(float) >= save->vertex_store->buffer_in_ram_size) { \
realloc_storage(ctx, -1, max_vert * 2); \ realloc_storage(ctx, -1, get_vertex_count(save) * 2); \
assert((save->vertex_store->used + save->vertex_size) * sizeof(float) < save->vertex_store->buffer_in_ram_size); \
} \
} \ } \
} while (0) } while (0)
@ -1325,11 +1326,14 @@ dlist_fallback(struct gl_context *ctx)
{ {
struct vbo_save_context *save = &vbo_context(ctx)->save; struct vbo_save_context *save = &vbo_context(ctx)->save;
if (save->vert_count || save->prim_store->used) { if (save->vertex_store->used || save->prim_store->used) {
if (save->prim_store->used > 0) { if (save->prim_store->used > 0 && save->vertex_store->used > 0) {
assert(save->vertex_size);
/* Close off in-progress primitive. */ /* Close off in-progress primitive. */
GLint i = save->prim_store->used - 1; GLint i = save->prim_store->used - 1;
save->prim_store->prims[i].count = save->vert_count - save->prim_store->prims[i].start; save->prim_store->prims[i].count =
get_vertex_count(save) -
save->prim_store->prims[i].start;
} }
/* Need to replay this display list with loopback, /* Need to replay this display list with loopback,
@ -1436,7 +1440,7 @@ vbo_save_NotifyBegin(struct gl_context *ctx, GLenum mode,
save->prim_store->prims[i].mode = mode & VBO_SAVE_PRIM_MODE_MASK; save->prim_store->prims[i].mode = mode & VBO_SAVE_PRIM_MODE_MASK;
save->prim_store->prims[i].begin = 1; save->prim_store->prims[i].begin = 1;
save->prim_store->prims[i].end = 0; save->prim_store->prims[i].end = 0;
save->prim_store->prims[i].start = save->vert_count; save->prim_store->prims[i].start = get_vertex_count(save);
save->prim_store->prims[i].count = 0; save->prim_store->prims[i].count = 0;
save->no_current_update = no_current_update; save->no_current_update = no_current_update;
@ -1457,7 +1461,7 @@ _save_End(void)
ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
save->prim_store->prims[i].end = 1; save->prim_store->prims[i].end = 1;
save->prim_store->prims[i].count = (save->vert_count - save->prim_store->prims[i].start); save->prim_store->prims[i].count = (get_vertex_count(save) - save->prim_store->prims[i].start);
if (i == (GLint) save->prim_store->size - 1) { if (i == (GLint) save->prim_store->size - 1) {
compile_vertex_list(ctx); compile_vertex_list(ctx);
@ -1576,11 +1580,11 @@ static void
_ensure_draws_fits_in_storage(struct gl_context *ctx, int primcount, int vertcount) _ensure_draws_fits_in_storage(struct gl_context *ctx, int primcount, int vertcount)
{ {
struct vbo_save_context *save = &vbo_context(ctx)->save; struct vbo_save_context *save = &vbo_context(ctx)->save;
uint32_t max_vert = save->vertex_size ?
save->vertex_store->buffer_in_ram_size / (sizeof(float) * save->vertex_size) : 0;
bool realloc_prim = save->prim_store->used + primcount > save->prim_store->size; bool realloc_prim = save->prim_store->used + primcount > save->prim_store->size;
bool realloc_vert = save->vertex_size && (save->vert_count + vertcount >= max_vert); bool realloc_vert = save->vertex_size &&
(save->vertex_store->used + vertcount * save->vertex_size) >=
save->vertex_store->buffer_in_ram_size;
if (realloc_prim || realloc_vert) if (realloc_prim || realloc_vert)
realloc_storage(ctx, realloc_prim ? primcount : -1, realloc_vert ? vertcount : -1); realloc_storage(ctx, realloc_prim ? primcount : -1, realloc_vert ? vertcount : -1);
@ -1899,7 +1903,7 @@ vbo_save_SaveFlushVertices(struct gl_context *ctx)
if (ctx->Driver.CurrentSavePrimitive <= PRIM_MAX) if (ctx->Driver.CurrentSavePrimitive <= PRIM_MAX)
return; return;
if (save->vert_count || save->prim_store->used) if (save->vertex_store->used || save->prim_store->used)
compile_vertex_list(ctx); compile_vertex_list(ctx);
copy_to_current(ctx); copy_to_current(ctx);
@ -1945,7 +1949,7 @@ vbo_save_EndList(struct gl_context *ctx)
GLint i = save->prim_store->used - 1; GLint i = save->prim_store->used - 1;
ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END; ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
save->prim_store->prims[i].end = 0; save->prim_store->prims[i].end = 0;
save->prim_store->prims[i].count = save->vert_count - save->prim_store->prims[i].start; save->prim_store->prims[i].count = get_vertex_count(save) - save->prim_store->prims[i].start;
} }
/* Make sure this vertex list gets replayed by the "loopback" /* Make sure this vertex list gets replayed by the "loopback"