Vulkan: Image error when recreating the swapchain after a window resize

asifkhana14 6 Reputation points
2021-06-23T19:19:25.827+00:00

So I'm trying to handle window resizing by recreating the swapchain and its image views and all that. This is the method that I'm using:

void VxRenderer::recreateSwapchain() {
    device.waitIdle();

    for (uint32_t i = 0; i < swapchainImageCount; ++i) {
        vkDestroyFramebuffer(device, framebuffers[i], nullptr);
        vkDestroyImageView(device, swapchainImageViews[i], nullptr);
    }

    vkResetCommandPool(device, commandPool, 0);
    vkDestroyPipeline(device, pipeline, nullptr);
    vkDestroySwapchainKHR(device, swapchain, nullptr);

    createSwapchain();
    getSwapchainImages();
    createSwapchainImageViews();
    createFramebuffers();
    createGraphicsPipeline();
    recordCommandBuffers();
}

The problem is that sometimes I get this error when resizing:

Validation Error: [ VUID-VkPresentInfoKHR-pImageIndices-01296 ] Object 0: handle = 0x1d7260c6cc8,
type = VK_OBJECT_TYPE_QUEUE; | MessageID = 0xc7aabc16 | vkQueuePresentKHR(): pSwapchains[0] images
passed to present must be in layout VK_IMAGE_LAYOUT_PRESENT_SRC_KHR or VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR
but is in VK_IMAGE_LAYOUT_UNDEFINED. The Vulkan spec states: Each element of pImageIndices must be the
index of a presentable image acquired from the swapchain specified by the corresponding element of the
pSwapchains array, and the presented image subresource must be in the VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
layout at the time the operation is executed on a VkDevice
(https://github.com/KhronosGroup/Vulkan-Docs/search?q=)VUID-VkPresentInfoKHR-pImageIndices-01296)

It says that the problem comes from the elements in pImageIndices in the VkPresentInfoKHR structure, which I wrote as:

uint32_t imageIndex;
VkResult result =
        vkAcquireNextImageKHR(device, swapchain, UINT64_MAX, imageAcquiredSemaphores[currentImage], VK_NULL_HANDLE, &imageIndex);

if (result == VK_ERROR_OUT_OF_DATE_KHR) {
    recreateSwapchain();
    return;
}

...

VkPresentInfoKHR presentInfo;
presentInfo.sType              = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
presentInfo.pNext              = nullptr;
presentInfo.waitSemaphoreCount = 1;
presentInfo.pWaitSemaphores    = &renderFinishedSemaphores[currentImage];
presentInfo.swapchainCount     = 1;
presentInfo.pSwapchains        = &swapchain;
presentInfo.pImageIndices      = &imageIndex;
presentInfo.pResults           = nullptr;
C++
C++
A high-level, general-purpose programming language, created as an extension of the C programming language, that has object-oriented, generic, and functional features in addition to facilities for low-level memory manipulation.
3,636 questions
{count} votes