dlist: use a new OPCODE to avoid loading cold data

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>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2021-06-16 10:57:19 +02:00 committed by Marge Bot
parent 722e39c008
commit 764e28d238
5 changed files with 21 additions and 11 deletions

View 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:

View 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);

View 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);

View 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;

View 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);
}