vbo/dlist: remove vbo_save_copied_vtx
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Fri, 13 Aug 2021 10:17:35 +0000 (12:17 +0200)
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Thu, 9 Sep 2021 14:42:16 +0000 (16:42 +0200)
The copy_vertices() function is rarely called and removing
this decreases vbo_save_context's size by 20kb.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12646>

src/mesa/vbo/vbo.h
src/mesa/vbo/vbo_save.c
src/mesa/vbo/vbo_save_api.c

index 056fe40..38f7b24 100644 (file)
@@ -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];
index bf8e0cb..f0c56a7 100644 (file)
@@ -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);
 }
index 4a94d1a..28a9fae 100644 (file)
@@ -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;
    }
 }