diff options
author | Joshua Ashton <joshua@froggi.es> | 2024-03-21 16:11:11 +0000 |
---|---|---|
committer | Joshua Ashton <joshua@froggi.es> | 2024-03-25 21:00:54 +0000 |
commit | d9cbc79941b2fbfdba8d5d7b943ffa7c9301244c (patch) | |
tree | ae63463de374dfd06c1f14ab014bd0c1f94de743 | |
parent | e209b02b970deb4afb88bd671b9b0ee4bbb2709a (diff) |
wsi: Add acquired member to wsi_image
Tracks whether this wsi_image has been acquired by the app
Signed-off-by: Joshua Ashton <joshua@froggi.es>
-rw-r--r-- | src/vulkan/wsi/wsi_common.c | 15 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common_private.h | 4 | ||||
-rw-r--r-- | src/vulkan/wsi/wsi_common_wayland.c | 1 |
3 files changed, 19 insertions, 1 deletions
diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index a93dbb3a802..1ad8aa5561b 100644 --- a/src/vulkan/wsi/wsi_common.c +++ b/src/vulkan/wsi/wsi_common.c @@ -1049,6 +1049,15 @@ wsi_ReleaseSwapchainImagesEXT(VkDevice _device, const VkReleaseSwapchainImagesInfoEXT *pReleaseInfo) { VK_FROM_HANDLE(wsi_swapchain, swapchain, pReleaseInfo->swapchain); + + for (uint32_t i = 0; i < pReleaseInfo->imageIndexCount; i++) { + uint32_t index = pReleaseInfo->pImageIndices[i]; + assert(index < swapchain->image_count); + struct wsi_image *image = swapchain->get_wsi_image(swapchain, index); + assert(image->acquired); + image->acquired = false; + } + VkResult result = swapchain->release_images(swapchain, pReleaseInfo->imageIndexCount, pReleaseInfo->pImageIndices); @@ -1208,6 +1217,8 @@ wsi_common_acquire_next_image2(const struct wsi_device *wsi, struct wsi_image *image = swapchain->get_wsi_image(swapchain, *pImageIndex); + image->acquired = true; + if (pAcquireInfo->semaphore != VK_NULL_HANDLE) { VkResult signal_result = wsi_signal_semaphore_for_image(device, swapchain, image, @@ -1458,6 +1469,10 @@ wsi_common_queue_present(const struct wsi_device *wsi, if (result != VK_SUCCESS) goto fail_present; + /* The app can only submit images they have acquired. */ + assert(image->acquired); + image->acquired = false; + #ifdef HAVE_LIBDRM if (has_signal_dma_buf) { result = wsi_signal_dma_buf_from_semaphore(swapchain, image); diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h index daf0dc3fa90..8caa882ec23 100644 --- a/src/vulkan/wsi/wsi_common_private.h +++ b/src/vulkan/wsi/wsi_common_private.h @@ -130,6 +130,10 @@ struct wsi_image { VkDeviceMemory memory; VkCommandBuffer *cmd_buffers; } blit; + /* Whether or not the image has been acquired + * on the CPU side via acquire_next_image. + */ + bool acquired; #ifndef _WIN32 uint64_t drm_modifier; diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c index 2b529397aa4..6f249bcafb9 100644 --- a/src/vulkan/wsi/wsi_common_wayland.c +++ b/src/vulkan/wsi/wsi_common_wayland.c @@ -1666,7 +1666,6 @@ wsi_wl_swapchain_release_images(struct wsi_swapchain *wsi_chain, struct wsi_wl_swapchain *chain = (struct wsi_wl_swapchain *)wsi_chain; for (uint32_t i = 0; i < count; i++) { uint32_t index = indices[i]; - assert(chain->images[index].busy); chain->images[index].busy = false; } return VK_SUCCESS; |