Mesa (main): zink: move 'acquired' flag onto swapchain struct

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jun 28 02:57:46 UTC 2022


Module: Mesa
Branch: main
Commit: 92228a6d283c763aa80b955d68420dec293bdd4b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=92228a6d283c763aa80b955d68420dec293bdd4b

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Tue Jun 21 10:59:55 2022 -0400

zink: move 'acquired' flag onto swapchain struct

Reviewed-by: Adam Jackson <ajax at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17149>

---

 src/gallium/drivers/zink/zink_batch.c    |  2 +-
 src/gallium/drivers/zink/zink_kopper.c   | 13 +++++++------
 src/gallium/drivers/zink/zink_kopper.h   |  7 +++++++
 src/gallium/drivers/zink/zink_resource.h |  1 -
 src/gallium/drivers/zink/zink_screen.c   |  4 ++--
 5 files changed, 17 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c
index 1b3b5d62e45..31e17d53468 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -469,7 +469,7 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch *batch)
    batch->work_count = 0;
 
    if (batch->swapchain) {
-      if (batch->swapchain->obj->acquired && !batch->swapchain->obj->present) {
+      if (zink_kopper_acquired(batch->swapchain->obj->dt, batch->swapchain->obj->dt_idx) && !batch->swapchain->obj->present) {
          batch->state->present = zink_kopper_present(screen, batch->swapchain);
          batch->state->swapchain = batch->swapchain;
       }
diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c
index b07f4b030ad..49179357a00 100644
--- a/src/gallium/drivers/zink/zink_kopper.c
+++ b/src/gallium/drivers/zink/zink_kopper.c
@@ -498,7 +498,7 @@ kopper_acquire(struct zink_screen *screen, struct zink_resource *res, uint64_t t
 
    cdt->swapchain->images[res->obj->dt_idx].acquire = res->obj->acquire = acquire;
    res->obj->image = cdt->swapchain->images[res->obj->dt_idx].image;
-   res->obj->acquired = false;
+   cdt->swapchain->images[res->obj->dt_idx].acquired = false;
    if (!cdt->swapchain->images[res->obj->dt_idx].init) {
       /* swapchain images are initially in the UNDEFINED layout */
       res->layout = VK_IMAGE_LAYOUT_UNDEFINED;
@@ -569,10 +569,10 @@ zink_kopper_acquire_submit(struct zink_screen *screen, struct zink_resource *res
 {
    assert(res->obj->dt);
    struct kopper_displaytarget *cdt = kopper_displaytarget(res->obj->dt);
-   if (res->obj->acquired)
+   if (zink_kopper_acquired(res->obj->dt, res->obj->dt_idx))
       return VK_NULL_HANDLE;
    assert(res->obj->acquire);
-   res->obj->acquired = true;
+   cdt->swapchain->images[res->obj->dt_idx].acquired = true;
    /* this is now owned by the batch */
    cdt->swapchain->images[res->obj->dt_idx].acquire = VK_NULL_HANDLE;
    cdt->swapchain->dt_has_data = true;
@@ -589,7 +589,7 @@ zink_kopper_present(struct zink_screen *screen, struct zink_resource *res)
       NULL,
       0
    };
-   assert(res->obj->acquired);
+   assert(zink_kopper_acquired(res->obj->dt, res->obj->dt_idx));
    VkResult ret = VKSCR(CreateSemaphore)(screen->dev, &sci, NULL, &res->obj->present);
    return zink_screen_handle_vkresult(screen, ret) ? res->obj->present : VK_NULL_HANDLE;
 }
@@ -698,7 +698,7 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res)
 {
    assert(res->obj->dt);
    struct kopper_displaytarget *cdt = kopper_displaytarget(res->obj->dt);
-   assert(res->obj->acquired);
+   assert(zink_kopper_acquired(res->obj->dt, res->obj->dt_idx));
    assert(res->obj->present);
    struct kopper_present_info *cpi = malloc(sizeof(struct kopper_present_info));
    cpi->sem = res->obj->present;
@@ -723,7 +723,8 @@ zink_kopper_present_queue(struct zink_screen *screen, struct zink_resource *res)
       kopper_present(cpi, screen, -1);
    }
    res->obj->acquire = VK_NULL_HANDLE;
-   res->obj->indefinite_acquire = res->obj->acquired = false;
+   res->obj->indefinite_acquire = false;
+   cdt->swapchain->images[res->obj->dt_idx].acquired = false;
    res->obj->dt_idx = UINT32_MAX;
 }
 
diff --git a/src/gallium/drivers/zink/zink_kopper.h b/src/gallium/drivers/zink/zink_kopper.h
index d261c2c5a24..a62c6a14860 100644
--- a/src/gallium/drivers/zink/zink_kopper.h
+++ b/src/gallium/drivers/zink/zink_kopper.h
@@ -31,6 +31,7 @@
 
 struct kopper_swapchain_image {
    bool init;
+   bool acquired;
    VkImage image;
    VkSemaphore acquire;
 };
@@ -97,6 +98,12 @@ zink_kopper_last_present_eq(const struct kopper_displaytarget *cdt, uint32_t idx
    return cdt->swapchain->last_present == idx;
 }
 
+static inline bool
+zink_kopper_acquired(const struct kopper_displaytarget *cdt, uint32_t idx)
+{
+   return idx != UINT32_MAX && cdt->swapchain->images[idx].acquired;
+}
+
 struct kopper_displaytarget *
 zink_kopper_displaytarget_create(struct zink_screen *screen, unsigned tex_usage,
                                  enum pipe_format format, unsigned width,
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index ea091ceb366..84bdec3798c 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -90,7 +90,6 @@ struct zink_resource_object {
    uint32_t last_dt_idx;
    VkSemaphore acquire;
    VkSemaphore present;
-   bool acquired;
    bool new_dt;
    bool dt_has_data;
    bool indefinite_acquire;
diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c
index 6d47b67cab3..b3b53ae7686 100644
--- a/src/gallium/drivers/zink/zink_screen.c
+++ b/src/gallium/drivers/zink/zink_screen.c
@@ -1422,7 +1422,7 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen,
 
    /* if the surface has never been acquired, there's nothing to present,
     * so this is a no-op */
-   if (!res->obj->acquired && res->obj->last_dt_idx == UINT32_MAX)
+   if (!zink_kopper_acquired(res->obj->dt, res->obj->dt_idx) && res->obj->last_dt_idx == UINT32_MAX)
       return;
 
    /* need to get the actual zink_context, not the threaded context */
@@ -1438,7 +1438,7 @@ zink_flush_frontbuffer(struct pipe_screen *pscreen,
       }
    }
 
-   if (res->obj->acquired)
+   if (zink_kopper_acquired(res->obj->dt, res->obj->dt_idx))
       zink_kopper_present_queue(screen, res);
    else {
       assert(res->obj->last_dt_idx != UINT32_MAX);



More information about the mesa-commit mailing list