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