From 8b71fcf79526197949ffa20511ccd50ee1ca6685 Mon Sep 17 00:00:00 2001 From: Pierre-Eric Pelloux-Prayer Date: Thu, 17 Jun 2021 21:49:44 +0200 Subject: [PATCH] glthread: merge sucessive glCallList MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Then unmarshalling a glCallList cmd if the next command(s) are also glCallList, they are batched in a single glCallLists. Reviewed-by: Marek Olšák Part-of: --- src/mesa/main/glthread_list.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/mesa/main/glthread_list.c b/src/mesa/main/glthread_list.c index af4b1283..08a60d1 100644 --- a/src/mesa/main/glthread_list.c +++ b/src/mesa/main/glthread_list.c @@ -30,6 +30,44 @@ uint32_t _mesa_unmarshal_CallList(struct gl_context *ctx, const struct marshal_cmd_CallList *cmd, const uint64_t *last) { const GLuint list = cmd->list; + uint64_t *ptr = (uint64_t *) cmd; + ptr += cmd->cmd_base.cmd_size; + + if (ptr < last) { + const struct marshal_cmd_base *next = + (const struct marshal_cmd_base *)ptr; + + /* If the 'next' is also a DISPATCH_CMD_CallList, we transform 'cmd' and 'next' in a CALL_CallLists. + * If the following commands are also CallList they're including in the CallLists we're building. + */ + if (next->cmd_id == DISPATCH_CMD_CallList) { + const int max_list_count = 2048; + struct marshal_cmd_CallList *next_callist = (struct marshal_cmd_CallList *) next; + uint32_t *lists = alloca(max_list_count * sizeof(uint32_t)); + + lists[0] = cmd->list; + lists[1] = next_callist->list; + + int count = 2; + + ptr += next->cmd_size; + while (ptr < last && count < max_list_count) { + next = (const struct marshal_cmd_base *)ptr; + if (next->cmd_id == DISPATCH_CMD_CallList) { + next_callist = (struct marshal_cmd_CallList *) next; + lists[count++] = next_callist->list; + ptr += next->cmd_size; + } else { + break; + } + } + + CALL_CallLists(ctx->CurrentServerDispatch, (count, GL_UNSIGNED_INT, lists)); + + return (uint32_t) (ptr - (uint64_t*)cmd); + } + } + CALL_CallList(ctx->CurrentServerDispatch, (list)); return cmd->cmd_base.cmd_size; } -- 2.7.4