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;
{
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;
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;
}
{
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;
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;
}
struct kopper_swapchain_image {
bool init;
+ bool acquired;
VkImage image;
VkSemaphore acquire;
};
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,
/* 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 */
}
}
- 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);