dlist: use a new OPCODE to avoid loading cold data
authorPierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Wed, 16 Jun 2021 08:57:19 +0000 (10:57 +0200)
committerMarge Bot <eric+marge@anholt.net>
Fri, 9 Jul 2021 10:05:46 +0000 (10:05 +0000)
Also add a 'bool copy_to_current' param to vbo_save_playback_vertex_list:
this way we can decide if we need to call playback_copy_to_current without
loading any cold data.

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

src/mesa/main/dlist.c
src/mesa/main/dlist.h
src/mesa/vbo/vbo_save.h
src/mesa/vbo/vbo_save_api.c
src/mesa/vbo/vbo_save_draw.c

index 2971a56..4029992 100644 (file)
@@ -628,6 +628,7 @@ typedef enum
 
    OPCODE_VERTEX_LIST,
    OPCODE_VERTEX_LIST_LOOPBACK,
+   OPCODE_VERTEX_LIST_COPY_CURRENT,
 
    /* The following three are meta instructions */
    OPCODE_ERROR,                /* raise compiled-in error */
@@ -822,7 +823,7 @@ vbo_print_vertex_list(struct gl_context *ctx, struct vbo_save_vertex_list *node,
    (void) ctx;
 
    const char *label[] = {
-      "VBO-VERTEX-LIST", "VBO-VERTEX-LIST-LOOPBACK"
+      "VBO-VERTEX-LIST", "VBO-VERTEX-LIST-LOOPBACK", "VBO-VERTEX-LIST-COPY-CURRENT"
    };
 
    fprintf(f, "%s, %u vertices, %d primitives, %d vertsize, "
@@ -1363,6 +1364,7 @@ _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist)
             break;
          case OPCODE_VERTEX_LIST:
          case OPCODE_VERTEX_LIST_LOOPBACK:
+         case OPCODE_VERTEX_LIST_COPY_CURRENT:
             vbo_destroy_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[1]);
             break;
          case OPCODE_CONTINUE:
@@ -1637,9 +1639,11 @@ _mesa_dlist_alloc_aligned(struct gl_context *ctx, GLuint opcode, GLuint bytes)
 
 
 void *
-_mesa_dlist_alloc_vertex_list(struct gl_context *ctx)
+_mesa_dlist_alloc_vertex_list(struct gl_context *ctx, bool copy_to_current)
 {
-   return _mesa_dlist_alloc_aligned(ctx, OPCODE_VERTEX_LIST,
+   return _mesa_dlist_alloc_aligned(ctx,
+                                    copy_to_current ? OPCODE_VERTEX_LIST_COPY_CURRENT :
+                                                      OPCODE_VERTEX_LIST,
                                     sizeof(struct vbo_save_vertex_list));
 }
 
@@ -13412,7 +13416,11 @@ execute_list(struct gl_context *ctx, GLuint list)
             break;
 
          case OPCODE_VERTEX_LIST:
-            vbo_save_playback_vertex_list(ctx, &n[1]);
+            vbo_save_playback_vertex_list(ctx, &n[1], false);
+            break;
+
+         case OPCODE_VERTEX_LIST_COPY_CURRENT:
+            vbo_save_playback_vertex_list(ctx, &n[1], true);
             break;
 
          case OPCODE_VERTEX_LIST_LOOPBACK:
@@ -13620,6 +13628,7 @@ replace_op_vertex_list_recursively(struct gl_context *ctx, struct gl_display_lis
       const OpCode opcode = n[0].opcode;
       switch (opcode) {
          case OPCODE_VERTEX_LIST:
+         case OPCODE_VERTEX_LIST_COPY_CURRENT:
             n[0].opcode = OPCODE_VERTEX_LIST_LOOPBACK;
             break;
          case OPCODE_CONTINUE:
@@ -14956,6 +14965,7 @@ print_list(struct gl_context *ctx, GLuint list, const char *fname)
             break;
          case OPCODE_VERTEX_LIST:
          case OPCODE_VERTEX_LIST_LOOPBACK:
+         case OPCODE_VERTEX_LIST_COPY_CURRENT:
             vbo_print_vertex_list(ctx, (struct vbo_save_vertex_list *) &n[1], opcode, f);
             break;
          default:
index 205e87d..1b7d973 100644 (file)
@@ -112,7 +112,8 @@ void *
 _mesa_dlist_alloc_aligned(struct gl_context *ctx, GLuint opcode, GLuint bytes);
 
 void *
-_mesa_dlist_alloc_vertex_list(struct gl_context *ctx);
+_mesa_dlist_alloc_vertex_list(struct gl_context *ctx,
+                              bool copy_to_current);
 
 void
 _mesa_delete_list(struct gl_context *ctx, struct gl_display_list *dlist);
index aa37942..ec50d58 100644 (file)
@@ -175,7 +175,7 @@ void _vbo_loopback_vertex_list(struct gl_context *ctx,
 /* Callbacks:
  */
 void
-vbo_save_playback_vertex_list(struct gl_context *ctx, void *data);
+vbo_save_playback_vertex_list(struct gl_context *ctx, void *data, bool copy_to_current);
 
 void
 vbo_save_playback_vertex_list_loopback(struct gl_context *ctx, void *data);
index 58d3e34..2ff6b50 100644 (file)
@@ -525,7 +525,7 @@ compile_vertex_list(struct gl_context *ctx)
     * being compiled.
     */
    node = (struct vbo_save_vertex_list *)
-      _mesa_dlist_alloc_vertex_list(ctx);
+      _mesa_dlist_alloc_vertex_list(ctx, !save->dangling_attr_ref && !save->no_current_update);
 
    if (!node)
       return;
index c5bee16..279b064 100644 (file)
@@ -205,7 +205,7 @@ end:
  * a drawing command.
  */
 void
-vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
+vbo_save_playback_vertex_list(struct gl_context *ctx, void *data, bool copy_to_current)
 {
    const struct vbo_save_vertex_list *node =
       (const struct vbo_save_vertex_list *) data;
@@ -253,7 +253,6 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
    }
    info->index.gl_bo = gl_bo;
 
-   /* Copy to current?
-    */
-   playback_copy_to_current(ctx, node);
+   if (copy_to_current)
+      playback_copy_to_current(ctx, node);
 }