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