vbo: delay vbo_exec_vtx_map call
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Wed, 9 Jun 2021 08:26:14 +0000 (10:26 +0200)
committerPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Thu, 17 Jun 2021 07:10:29 +0000 (09:10 +0200)
Instead of doing vbo_exec_vtx_map during initialization,
defer it until the first actual user.

v2: move init to vbo_exec_wrap_upgrade_vertex (Emma Anholt)

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

src/mesa/vbo/vbo_exec_api.c

index 4f19dbe..6b61b73 100644 (file)
@@ -268,6 +268,13 @@ vbo_exec_wrap_upgrade_vertex(struct vbo_exec_context *exec,
 
    assert(attr < VBO_ATTRIB_MAX);
 
+   if (unlikely(!exec->vtx.buffer_ptr)) {
+      /* We should only hit this when use_buffer_objects=true */
+      assert(exec->vtx.bufferobj);
+      vbo_exec_vtx_map(exec);
+      assert(exec->vtx.buffer_ptr);
+   }
+
    /* Run pipeline on current vertices, copy wrapped vertices
     * to exec->vtx.copied.
     */
@@ -488,7 +495,6 @@ do {                                                                    \
    int sz = (sizeof(C) / sizeof(GLfloat));                              \
                                                                         \
    assert(sz == 1 || sz == 2);                                          \
-                                                                        \
    /* store a copy of the attribute in exec except for glVertex */      \
    if ((A) != 0) {                                                      \
       /* Check if attribute size or type is changing. */                \
@@ -1031,12 +1037,7 @@ vbo_exec_vtx_init(struct vbo_exec_context *exec, bool use_buffer_objects)
    if (use_buffer_objects) {
       /* Use buffer objects for immediate mode. */
       struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
-
       exec->vtx.bufferobj = ctx->Driver.NewBufferObject(ctx, IMM_BUFFER_NAME);
-
-      /* Map the buffer. */
-      vbo_exec_vtx_map(exec);
-      assert(exec->vtx.buffer_ptr);
    } else {
       /* Use allocated memory for immediate mode. */
       exec->vtx.bufferobj = NULL;