I am using SDL-3 and vulkan 1.3.280.0.
I have a wrapper class for VkSwapchainKHR containing all that’s needed for my swapchain:
class VulkanSwapchain
{
private:
// external:
VulkanContext* context;
SDL_Window* window;
public:
// internal:
VkSwapchainKHR swapchain;
VkSurfaceKHR surface;
VkExtent2D imageExtent;
VkSurfaceFormatKHR surfaceFormat;
std::vector<VkImage> images;
std::vector<VkImageView> imageViews;
// Constructor:
VulkanSwapchain(VulkanContext* context, SDL_Window* window, VkImageUsageFlags usage, VulkanSwapchain* oldSwapchain = nullptr);
// Destructor:
~VulkanSwapchain();
private:
void CreateSurface();
void CreateSurfaceFormat();
void SetImageExtent();
void CreateSwapchain(VkImageUsageFlags usage, VulkanSwapchain* oldSwapchain);
void CreateImages();
void CreateImageViews();
};
When changing the window size, I need to create a new swapchain and destroy the old one:
void Application::RecreateSwapchain()
{
...
std::unique_ptr<VulkanSwapchain> newSwapchain = std::make_unique<VulkanSwapchain>(context.get(), window, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, swapchain.get());
swapchain.swap(newSwapchain);
...
}
Once RecreateSwapchain() is finished, the old swapchain (now referenced by newSwapchain) goes out of scope, and the destructor is called:
VulkanSwapchain::~VulkanSwapchain()
{
LOG_INFO("Destroying Swapchain.");
VKA(vkDeviceWaitIdle(context->device));
for (uint32_t i = 0; i < imageViews.size(); i++)
vkDestroyImageView(context->device, imageViews[i], nullptr);
vkDestroySwapchainKHR(context->device, swapchain, nullptr);
vkDestroySurfaceKHR(context->instance, surface, nullptr);
LOG_INFO("Swapchain Destroyed.");
}
Note how I call vkDestroySwapchainKHR(…) BEFORE vkDestroySurfaceKHR(…).
So why do I get the following message from the validation layer?
[22:06:49] VulkanTutorial: Destroying Swapchain.
VUID-vkDestroySurfaceKHR-surface-01266(ERROR / SPEC): msgNum: -1093400348 – Validation Error: [ VUID-vkDestroySurfaceKHR-surface-01266 ] Object 0: handle = 0x162793cff20, type = VK_OBJECT_TYPE_INSTANCE; | MessageID = 0xbed408e4 | vkDestroySurfaceKHR(): called before its associated VkSwapchainKHR was destroyed. The Vulkan spec states: All VkSwapchainKHR objects created for surface must have been destroyed prior to destroying surface (https://vulkan.lunarg.com/doc/view/1.3.280.0/windows/1.3-extensions/vkspec.html#VUID-vkDestroySurfaceKHR-surface-01266)
Objects: 1
[0] 0x162793cff20, type: 1, name: NULL
[22:06:49] VulkanTutorial: Swapchain Destroyed.