diff --git a/src/vulkan/wsi/wsi_common.c b/src/vulkan/wsi/wsi_common.c index a93dbb3a802b4..1ad8aa5561b55 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 daf0dc3fa9045..8caa882ec23df 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 6f8fc44c43df5..b8c66aac2ecdb 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;