From 2671b9c90fd71bf66b6c90b98c32315c2bccb17d Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Fri, 13 Aug 2021 12:17:35 +0200 Subject: [PATCH] vbo/dlist: remove vbo_save_copied_vtx MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit The copy_vertices() function is rarely called and removing this decreases vbo_save_context's size by 20kb. Reviewed-by: Marek Olšák Part-of: --- src/mesa/vbo/vbo.h | 9 ++++----- src/mesa/vbo/vbo_save.c | 3 +++ src/mesa/vbo/vbo_save_api.c | 24 +++++++++++++++++------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h index 056fe40..38f7b24 100644 --- a/src/mesa/vbo/vbo.h +++ b/src/mesa/vbo/vbo.h @@ -151,10 +151,6 @@ struct vbo_exec_context #endif }; -struct vbo_save_copied_vtx { - fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS]; - GLuint nr; -}; struct vbo_save_context { GLvertexformat vtxfmt; @@ -180,7 +176,10 @@ struct vbo_save_context { GLuint vert_count; GLboolean dangling_attr_ref; - struct vbo_save_copied_vtx copied; + struct { + fi_type *buffer; + GLuint nr; + } copied; fi_type *current[VBO_ATTRIB_MAX]; /* points into ctx->ListState */ GLubyte *currentsz[VBO_ATTRIB_MAX]; diff --git a/src/mesa/vbo/vbo_save.c b/src/mesa/vbo/vbo_save.c index bf8e0cb..f0c56a7 100644 --- a/src/mesa/vbo/vbo_save.c +++ b/src/mesa/vbo/vbo_save.c @@ -70,5 +70,8 @@ void vbo_save_destroy( struct gl_context *ctx ) save->vertex_store = NULL; } + if (save->copied.buffer) + free(save->copied.buffer); + _mesa_reference_buffer_object(ctx, &save->current_bo, NULL); } diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index 4a94d1a..28a9fae 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -127,14 +127,16 @@ copy_vertices(struct gl_context *ctx, struct vbo_save_context *save = &vbo_context(ctx)->save; struct _mesa_prim *prim = &node->cold->prims[node->cold->prim_count - 1]; GLuint sz = save->vertex_size; - const fi_type *src = src_buffer + prim->start * sz; - fi_type *dst = save->copied.buffer; - if (prim->end) + if (prim->end || !prim->count || !sz) return 0; + const fi_type *src = src_buffer + prim->start * sz; + assert(save->copied.buffer == NULL); + save->copied.buffer = malloc(sizeof(fi_type) * sz * prim->count); + return vbo_copy_vertices(ctx, prim->mode, prim->start, &prim->count, - prim->begin, sz, true, dst, src); + prim->begin, sz, true, save->copied.buffer, src); } @@ -971,9 +973,14 @@ wrap_filled_vertex(struct gl_context *ctx) numComponents = save->copied.nr * save->vertex_size; fi_type *buffer_ptr = save->vertex_store->buffer_in_ram; - memcpy(buffer_ptr, - save->copied.buffer, - numComponents * sizeof(fi_type)); + if (numComponents) { + assert(save->copied.buffer); + memcpy(buffer_ptr, + save->copied.buffer, + numComponents * sizeof(fi_type)); + free(save->copied.buffer); + 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; @@ -1090,6 +1097,7 @@ upgrade_vertex(struct gl_context *ctx, GLuint attr, GLuint newsz) * and will need fixup at runtime. */ if (save->copied.nr) { + assert(save->copied.buffer); const fi_type *data = save->copied.buffer; fi_type *dest = save->vertex_store->buffer_in_ram; @@ -1128,6 +1136,8 @@ 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; + free(save->copied.buffer); + save->copied.buffer = NULL; } } -- 2.7.4