Mesa (main): zink: use a dynarray for semaphore wait flags
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jun 16 02:17:41 UTC 2022
Module: Mesa
Branch: main
Commit: 48b56d2efdde0409fb66b8bb713e03aef8f82086
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=48b56d2efdde0409fb66b8bb713e03aef8f82086
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Fri Jun 10 15:27:46 2022 -0400
zink: use a dynarray for semaphore wait flags
ensure that any number of semaphore waits is handled as expected
Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17066>
---
src/gallium/drivers/zink/zink_batch.c | 13 ++++++++-----
src/gallium/drivers/zink/zink_batch.h | 1 +
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 29221e29eea..144e55f95ee 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -177,6 +177,7 @@ zink_batch_state_destroy(struct zink_screen *screen, struct zink_batch_state *bs
util_dynarray_fini(&bs->bindless_releases[0]);
util_dynarray_fini(&bs->bindless_releases[1]);
util_dynarray_fini(&bs->acquires);
+ util_dynarray_fini(&bs->acquire_flags);
util_dynarray_fini(&bs->dead_swapchains);
_mesa_set_destroy(bs->surfaces, NULL);
_mesa_set_destroy(bs->bufferviews, NULL);
@@ -228,6 +229,7 @@ create_batch_state(struct zink_context *ctx)
util_dynarray_init(&bs->persistent_resources, NULL);
util_dynarray_init(&bs->unref_resources, NULL);
util_dynarray_init(&bs->acquires, NULL);
+ util_dynarray_init(&bs->acquire_flags, NULL);
util_dynarray_init(&bs->dead_swapchains, NULL);
util_dynarray_init(&bs->bindless_releases[0], NULL);
util_dynarray_init(&bs->bindless_releases[1], NULL);
@@ -354,11 +356,12 @@ submit_queue(void *data, void *gdata, int thread_index)
si[0].sType = si[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
si[0].waitSemaphoreCount = util_dynarray_num_elements(&bs->acquires, VkSemaphore);
si[0].pWaitSemaphores = bs->acquires.data;
- VkPipelineStageFlags mask[32]; //can't imagine having more dumbass than this
- assert(util_dynarray_num_elements(&bs->acquires, VkSemaphore) < ARRAY_SIZE(mask));
- for (unsigned i = 0; i < ARRAY_SIZE(mask); i++)
- mask[i] = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
- si[0].pWaitDstStageMask = mask;
+ while (util_dynarray_num_elements(&bs->acquire_flags, VkPipelineStageFlags) < si[0].waitSemaphoreCount) {
+ VkPipelineStageFlags mask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
+ util_dynarray_append(&bs->acquire_flags, VkPipelineStageFlags, mask);
+ }
+ assert(util_dynarray_num_elements(&bs->acquires, VkSemaphore) <= util_dynarray_num_elements(&bs->acquire_flags, VkPipelineStageFlags));
+ si[0].pWaitDstStageMask = bs->acquire_flags.data;
if (si[0].waitSemaphoreCount == 0)
num_si--;
diff --git a/src/gallium/drivers/zink/zink_batch.h b/src/gallium/drivers/zink/zink_batch.h
index a6af00ac4fa..7606b970920 100644
--- a/src/gallium/drivers/zink/zink_batch.h
+++ b/src/gallium/drivers/zink/zink_batch.h
@@ -105,6 +105,7 @@ struct zink_batch_state {
VkSemaphore present;
struct zink_resource *swapchain;
struct util_dynarray acquires;
+ struct util_dynarray acquire_flags;
struct util_dynarray dead_swapchains;
struct util_queue_fence flush_completed;
More information about the mesa-commit
mailing list