From 764e28d238b7bd70358694428eca50a91544460c Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Wed, 16 Jun 2021 10:57:19 +0200 Subject: [PATCH] dlist: use a new OPCODE to avoid loading cold data MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Part-of: --- src/mesa/main/dlist.c | 18 ++++++++++++++---- src/mesa/main/dlist.h | 3 ++- src/mesa/vbo/vbo_save.h | 2 +- src/mesa/vbo/vbo_save_api.c | 2 +- src/mesa/vbo/vbo_save_draw.c | 7 +++---- 5 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 2971a56d5a8..402999287c4 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -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: diff --git a/src/mesa/main/dlist.h b/src/mesa/main/dlist.h index 205e87d8814..1b7d973d09f 100644 --- a/src/mesa/main/dlist.h +++ b/src/mesa/main/dlist.h @@ -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); diff --git a/src/mesa/vbo/vbo_save.h b/src/mesa/vbo/vbo_save.h index aa3794230ba..ec50d580649 100644 --- a/src/mesa/vbo/vbo_save.h +++ b/src/mesa/vbo/vbo_save.h @@ -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); diff --git a/src/mesa/vbo/vbo_save_api.c b/src/mesa/vbo/vbo_save_api.c index 58d3e347660..2ff6b5061d5 100644 --- a/src/mesa/vbo/vbo_save_api.c +++ b/src/mesa/vbo/vbo_save_api.c @@ -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; diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c index c5bee16d278..279b064c2cd 100644 --- a/src/mesa/vbo/vbo_save_draw.c +++ b/src/mesa/vbo/vbo_save_draw.c @@ -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); }