From b315aa43f1c2d2f17bdd6a78cf402daae060d31c Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 16 Jun 2021 21:40:37 -0400 Subject: [PATCH] zink: move some end-of-batch stuff to submit thread no reason to do this on the driver thread when it could be async Acked-by: Dave Airlie Part-of: --- src/gallium/drivers/zink/zink_batch.c | 39 ++++++++++++++++------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index c87d0c4..9d39799 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -371,11 +371,29 @@ submit_queue(void *data, void *gdata, int thread_index) si.pNext = &mem_signal; } + if (vkEndCommandBuffer(bs->cmdbuf) != VK_SUCCESS) { + debug_printf("vkEndCommandBuffer failed\n"); + bs->is_device_lost = true; + goto end; + } + if (vkEndCommandBuffer(bs->barrier_cmdbuf) != VK_SUCCESS) { + debug_printf("vkEndCommandBuffer failed\n"); + bs->is_device_lost = true; + goto end; + } + + while (util_dynarray_contains(&bs->persistent_resources, struct zink_resource_object*)) { + struct zink_resource_object *obj = util_dynarray_pop(&bs->persistent_resources, struct zink_resource_object*); + VkMappedMemoryRange range = zink_resource_init_mem_range(screen, obj, 0, obj->size); + vkFlushMappedMemoryRanges(screen->dev, 1, &range); + } + if (vkQueueSubmit(bs->queue, 1, &si, bs->fence.fence) != VK_SUCCESS) { debug_printf("ZINK: vkQueueSubmit() failed\n"); bs->is_device_lost = true; } bs->submit_count++; +end: cnd_broadcast(&bs->usage.flush); p_atomic_set(&bs->fence.submitted, true); @@ -527,28 +545,7 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch *batch) tc_driver_internal_flush_notify(ctx->tc); - if (vkEndCommandBuffer(batch->state->cmdbuf) != VK_SUCCESS) { - debug_printf("vkEndCommandBuffer failed\n"); - return; - } - if (vkEndCommandBuffer(batch->state->barrier_cmdbuf) != VK_SUCCESS) { - debug_printf("vkEndCommandBuffer failed\n"); - return; - } - struct zink_screen *screen = zink_screen(ctx->base.screen); - while (util_dynarray_contains(&batch->state->persistent_resources, struct zink_resource_object*)) { - struct zink_resource_object *obj = util_dynarray_pop(&batch->state->persistent_resources, struct zink_resource_object*); - assert(!obj->offset); - VkMappedMemoryRange range = { - VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE, - NULL, - obj->mem, - obj->offset, - VK_WHOLE_SIZE, - }; - vkFlushMappedMemoryRanges(screen->dev, 1, &range); - } ctx->resource_size += batch->state->resource_size; ctx->last_fence = &batch->state->fence; -- 2.7.4