|
|
|
@ -64,6 +64,7 @@ static VkBuffer g_UploadBuffer = VK_NULL_HANDLE;
|
|
|
|
|
|
|
|
|
|
// Forward Declarations
|
|
|
|
|
void ImGui_ImplVulkanH_DestroyFrame(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator);
|
|
|
|
|
void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator);
|
|
|
|
|
void ImGui_ImplVulkanH_CreateWindowSwapChain(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
|
|
|
|
|
void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator);
|
|
|
|
|
|
|
|
|
@ -889,6 +890,7 @@ void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkInstance instance, VkPhysica
|
|
|
|
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
|
|
|
|
{
|
|
|
|
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i];
|
|
|
|
|
ImGui_ImplVulkanH_FrameSemaphores* fsd = &wd->FrameSemaphores[i];
|
|
|
|
|
{
|
|
|
|
|
VkCommandPoolCreateInfo info = {};
|
|
|
|
|
info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
|
|
|
@ -916,9 +918,9 @@ void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkInstance instance, VkPhysica
|
|
|
|
|
{
|
|
|
|
|
VkSemaphoreCreateInfo info = {};
|
|
|
|
|
info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
|
|
|
|
|
err = vkCreateSemaphore(device, &info, allocator, &fd->ImageAcquiredSemaphore);
|
|
|
|
|
err = vkCreateSemaphore(device, &info, allocator, &fsd->ImageAcquiredSemaphore);
|
|
|
|
|
check_vk_result(err);
|
|
|
|
|
err = vkCreateSemaphore(device, &info, allocator, &fd->RenderCompleteSemaphore);
|
|
|
|
|
err = vkCreateSemaphore(device, &info, allocator, &fsd->RenderCompleteSemaphore);
|
|
|
|
|
check_vk_result(err);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -947,9 +949,14 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkInstance instance, VkPhysicalDevi
|
|
|
|
|
// We don't use ImGui_ImplVulkanH_DestroyWindow() because we want to preserve the old swapchain to create the new one.
|
|
|
|
|
// Destroy old Framebuffer
|
|
|
|
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
|
|
|
|
{
|
|
|
|
|
ImGui_ImplVulkanH_DestroyFrame(instance, device, &wd->Frames[i], allocator);
|
|
|
|
|
ImGui_ImplVulkanH_DestroyFrameSemaphores(instance, device, &wd->FrameSemaphores[i], allocator);
|
|
|
|
|
}
|
|
|
|
|
delete[] wd->Frames;
|
|
|
|
|
delete[] wd->FrameSemaphores;
|
|
|
|
|
wd->Frames = NULL;
|
|
|
|
|
wd->FrameSemaphores = NULL;
|
|
|
|
|
wd->FramesQueueSize = 0;
|
|
|
|
|
if (wd->RenderPass)
|
|
|
|
|
vkDestroyRenderPass(device, wd->RenderPass, allocator);
|
|
|
|
@ -1004,7 +1011,9 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkInstance instance, VkPhysicalDevi
|
|
|
|
|
|
|
|
|
|
IM_ASSERT(wd->Frames == NULL);
|
|
|
|
|
wd->Frames = new ImGui_ImplVulkanH_Frame[wd->FramesQueueSize];
|
|
|
|
|
wd->FrameSemaphores = new ImGui_ImplVulkanH_FrameSemaphores[wd->FramesQueueSize];
|
|
|
|
|
memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->FramesQueueSize);
|
|
|
|
|
memset(wd->FrameSemaphores, 0, sizeof(wd->FrameSemaphores[0]) * wd->FramesQueueSize);
|
|
|
|
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
|
|
|
|
wd->Frames[i].Backbuffer = backbuffers[i];
|
|
|
|
|
}
|
|
|
|
@ -1102,9 +1111,14 @@ void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui
|
|
|
|
|
//vkQueueWaitIdle(g_Queue);
|
|
|
|
|
|
|
|
|
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
|
|
|
|
{
|
|
|
|
|
ImGui_ImplVulkanH_DestroyFrame(instance, device, &wd->Frames[i], allocator);
|
|
|
|
|
ImGui_ImplVulkanH_DestroyFrameSemaphores(instance, device, &wd->FrameSemaphores[i], allocator);
|
|
|
|
|
}
|
|
|
|
|
delete[] wd->Frames;
|
|
|
|
|
delete[] wd->FrameSemaphores;
|
|
|
|
|
wd->Frames = NULL;
|
|
|
|
|
wd->FrameSemaphores = NULL;
|
|
|
|
|
vkDestroyRenderPass(device, wd->RenderPass, allocator);
|
|
|
|
|
vkDestroySwapchainKHR(device, wd->Swapchain, allocator);
|
|
|
|
|
vkDestroySurfaceKHR(instance, wd->Surface, allocator);
|
|
|
|
@ -1112,22 +1126,26 @@ void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui
|
|
|
|
|
*wd = ImGui_ImplVulkanH_Window();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator)
|
|
|
|
|
{
|
|
|
|
|
(void)instance;
|
|
|
|
|
vkDestroySemaphore(device, fsd->ImageAcquiredSemaphore, allocator);
|
|
|
|
|
vkDestroySemaphore(device, fsd->RenderCompleteSemaphore, allocator);
|
|
|
|
|
fsd->ImageAcquiredSemaphore = fsd->RenderCompleteSemaphore = VK_NULL_HANDLE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImGui_ImplVulkanH_DestroyFrame(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator)
|
|
|
|
|
{
|
|
|
|
|
(void)instance;
|
|
|
|
|
vkDestroyFence(device, fd->Fence, allocator);
|
|
|
|
|
vkFreeCommandBuffers(device, fd->CommandPool, 1, &fd->CommandBuffer);
|
|
|
|
|
vkDestroyCommandPool(device, fd->CommandPool, allocator);
|
|
|
|
|
vkDestroySemaphore(device, fd->ImageAcquiredSemaphore, allocator);
|
|
|
|
|
vkDestroySemaphore(device, fd->RenderCompleteSemaphore, allocator);
|
|
|
|
|
fd->Fence = VK_NULL_HANDLE;
|
|
|
|
|
fd->CommandBuffer = VK_NULL_HANDLE;
|
|
|
|
|
fd->CommandPool = VK_NULL_HANDLE;
|
|
|
|
|
fd->ImageAcquiredSemaphore = fd->RenderCompleteSemaphore = VK_NULL_HANDLE;
|
|
|
|
|
|
|
|
|
|
vkDestroyImageView(device, fd->BackbufferView, allocator);
|
|
|
|
|
vkDestroyFramebuffer(device, fd->Framebuffer, allocator);
|
|
|
|
|
|
|
|
|
|
ImGui_ImplVulkan_DestroyFrameRenderBuffers(instance, device, &fd->RenderBuffers, allocator);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|