nvk: Mark the push before an indirect push as incomplete

This fixes dEQP-VK.api.command_buffers.many_indirect_draws_on_secondary
on pre-Turing hardware.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34127>
This commit is contained in:
Faith Ekstrand 2025-03-17 11:53:42 -05:00 committed by Marge Bot
parent 0915b3131f
commit c12583fc4b
3 changed files with 8 additions and 5 deletions

View file

@ -144,7 +144,7 @@ nvk_cmd_buffer_alloc_mem(struct nvk_cmd_buffer *cmd, bool force_gart,
}
static void
nvk_cmd_buffer_flush_push(struct nvk_cmd_buffer *cmd)
nvk_cmd_buffer_flush_push(struct nvk_cmd_buffer *cmd, bool incomplete)
{
if (likely(cmd->push_mem != NULL)) {
const uint32_t mem_offset =
@ -154,6 +154,7 @@ nvk_cmd_buffer_flush_push(struct nvk_cmd_buffer *cmd)
.map = cmd->push.start,
.addr = cmd->push_mem->mem->va->addr + mem_offset,
.range = nv_push_dw_count(&cmd->push) * 4,
.incomplete = incomplete,
};
util_dynarray_append(&cmd->pushes, struct nvk_cmd_push, push);
}
@ -164,7 +165,7 @@ nvk_cmd_buffer_flush_push(struct nvk_cmd_buffer *cmd)
void
nvk_cmd_buffer_new_push(struct nvk_cmd_buffer *cmd)
{
nvk_cmd_buffer_flush_push(cmd);
nvk_cmd_buffer_flush_push(cmd, false);
VkResult result = nvk_cmd_buffer_alloc_mem(cmd, false, &cmd->push_mem);
if (unlikely(result != VK_SUCCESS)) {
@ -184,7 +185,7 @@ void
nvk_cmd_buffer_push_indirect(struct nvk_cmd_buffer *cmd,
uint64_t addr, uint32_t range)
{
nvk_cmd_buffer_flush_push(cmd);
nvk_cmd_buffer_flush_push(cmd, true);
struct nvk_cmd_push push = {
.addr = addr,
@ -363,7 +364,7 @@ nvk_EndCommandBuffer(VkCommandBuffer commandBuffer)
{
VK_FROM_HANDLE(nvk_cmd_buffer, cmd, commandBuffer);
nvk_cmd_buffer_flush_push(cmd);
nvk_cmd_buffer_flush_push(cmd, false);
return vk_command_buffer_get_record_result(&cmd->vk);
}
@ -378,7 +379,7 @@ nvk_CmdExecuteCommands(VkCommandBuffer commandBuffer,
if (commandBufferCount == 0)
return;
nvk_cmd_buffer_flush_push(cmd);
nvk_cmd_buffer_flush_push(cmd, false);
for (uint32_t i = 0; i < commandBufferCount; i++) {
VK_FROM_HANDLE(nvk_cmd_buffer, other, pCommandBuffers[i]);

View file

@ -196,6 +196,7 @@ struct nvk_cmd_push {
void *map;
uint64_t addr;
uint32_t range;
bool incomplete;
bool no_prefetch;
};

View file

@ -319,6 +319,7 @@ nvk_queue_submit_exec(struct nvk_queue *queue,
execs[exec_count++] = (struct nvkmd_ctx_exec) {
.addr = push->addr,
.size_B = push->range,
.incomplete = push->incomplete,
.no_prefetch = push->no_prefetch,
};
}