zink: move 'acquired' flag onto swapchain struct
Reviewed-by: Adam Jackson <ajax@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17149>
This commit is contained in:

committed by
Marge Bot

parent
c47378fb0f
commit
92228a6d28
@@ -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;
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user