|  |  | @@ -35,6 +35,7 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | // CHANGELOG |  |  |  | // CHANGELOG | 
			
		
	
		
		
			
				
					
					|  |  |  | // (minor and older changes stripped away, please see git history for details) |  |  |  | // (minor and older changes stripped away, please see git history for details) | 
			
		
	
		
		
			
				
					
					|  |  |  | //  2024-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. |  |  |  | //  2024-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface. | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | //  2024-01-19: Vulkan: Fixed vkAcquireNextImageKHR() validation errors in VulkanSDK 1.3.275 by allocating one extra semaphore than in-flight frames. (#7236) | 
			
		
	
		
		
			
				
					
					|  |  |  | //  2024-01-11: Vulkan: Fixed vkMapMemory() calls unnecessarily using full buffer size (#3957). Fixed MinAllocationSize handing (#7189). |  |  |  | //  2024-01-11: Vulkan: Fixed vkMapMemory() calls unnecessarily using full buffer size (#3957). Fixed MinAllocationSize handing (#7189). | 
			
		
	
		
		
			
				
					
					|  |  |  | //  2024-01-03: Vulkan: Added MinAllocationSize field in ImGui_ImplVulkan_InitInfo to workaround zealous "best practice" validation layer. (#7189, #4238) |  |  |  | //  2024-01-03: Vulkan: Added MinAllocationSize field in ImGui_ImplVulkan_InitInfo to workaround zealous "best practice" validation layer. (#7189, #4238) | 
			
		
	
		
		
			
				
					
					|  |  |  | //  2024-01-03: Vulkan: Stoped creating command pools with VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT as we don't reset them. |  |  |  | //  2024-01-03: Vulkan: Stoped creating command pools with VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT as we don't reset them. | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1354,15 +1355,13 @@ VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_d | 
			
		
	
		
		
			
				
					
					|  |  |  | void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator) |  |  |  | void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator) | 
			
		
	
		
		
			
				
					
					|  |  |  | { |  |  |  | { | 
			
		
	
		
		
			
				
					
					|  |  |  |     IM_ASSERT(physical_device != VK_NULL_HANDLE && device != VK_NULL_HANDLE); |  |  |  |     IM_ASSERT(physical_device != VK_NULL_HANDLE && device != VK_NULL_HANDLE); | 
			
		
	
		
		
			
				
					
					|  |  |  |     (void)physical_device; |  |  |  |     IM_UNUSED(physical_device); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     (void)allocator; |  |  |  |  | 
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     // Create Command Buffers |  |  |  |     // Create Command Buffers | 
			
		
	
		
		
			
				
					
					|  |  |  |     VkResult err; |  |  |  |     VkResult err; | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (uint32_t i = 0; i < wd->ImageCount; i++) |  |  |  |     for (uint32_t i = 0; i < wd->ImageCount; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |     { |  |  |  |     { | 
			
		
	
		
		
			
				
					
					|  |  |  |         ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i]; |  |  |  |         ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |         ImGui_ImplVulkanH_FrameSemaphores* fsd = &wd->FrameSemaphores[i]; |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |  |             VkCommandPoolCreateInfo info = {}; |  |  |  |             VkCommandPoolCreateInfo info = {}; | 
			
		
	
		
		
			
				
					
					|  |  |  |             info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; |  |  |  |             info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1387,6 +1386,11 @@ void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_devi | 
			
		
	
		
		
			
				
					
					|  |  |  |             err = vkCreateFence(device, &info, allocator, &fd->Fence); |  |  |  |             err = vkCreateFence(device, &info, allocator, &fd->Fence); | 
			
		
	
		
		
			
				
					
					|  |  |  |             check_vk_result(err); |  |  |  |             check_vk_result(err); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     for (uint32_t i = 0; i < wd->SemaphoreCount; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         ImGui_ImplVulkanH_FrameSemaphores* fsd = &wd->FrameSemaphores[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |         { |  |  |  |         { | 
			
		
	
		
		
			
				
					
					|  |  |  |             VkSemaphoreCreateInfo info = {}; |  |  |  |             VkSemaphoreCreateInfo info = {}; | 
			
		
	
		
		
			
				
					
					|  |  |  |             info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; |  |  |  |             info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1422,10 +1426,9 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V | 
			
		
	
		
		
			
				
					
					|  |  |  |     // We don't use ImGui_ImplVulkanH_DestroyWindow() because we want to preserve the old swapchain to create the new one. |  |  |  |     // We don't use ImGui_ImplVulkanH_DestroyWindow() because we want to preserve the old swapchain to create the new one. | 
			
		
	
		
		
			
				
					
					|  |  |  |     // Destroy old Framebuffer |  |  |  |     // Destroy old Framebuffer | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (uint32_t i = 0; i < wd->ImageCount; i++) |  |  |  |     for (uint32_t i = 0; i < wd->ImageCount; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |     { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); |  |  |  |         ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     for (uint32_t i = 0; i < wd->SemaphoreCount; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |         ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); |  |  |  |         ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     IM_FREE(wd->Frames); |  |  |  |     IM_FREE(wd->Frames); | 
			
		
	
		
		
			
				
					
					|  |  |  |     IM_FREE(wd->FrameSemaphores); |  |  |  |     IM_FREE(wd->FrameSemaphores); | 
			
		
	
		
		
			
				
					
					|  |  |  |     wd->Frames = nullptr; |  |  |  |     wd->Frames = nullptr; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1484,11 +1487,12 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V | 
			
		
	
		
		
			
				
					
					|  |  |  |         err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->ImageCount, backbuffers); |  |  |  |         err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->ImageCount, backbuffers); | 
			
		
	
		
		
			
				
					
					|  |  |  |         check_vk_result(err); |  |  |  |         check_vk_result(err); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         IM_ASSERT(wd->Frames == nullptr); |  |  |  |         IM_ASSERT(wd->Frames == nullptr && wd->FrameSemaphores == nullptr); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         wd->SemaphoreCount = wd->ImageCount + 1; | 
			
		
	
		
		
			
				
					
					|  |  |  |         wd->Frames = (ImGui_ImplVulkanH_Frame*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_Frame) * wd->ImageCount); |  |  |  |         wd->Frames = (ImGui_ImplVulkanH_Frame*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_Frame) * wd->ImageCount); | 
			
		
	
		
		
			
				
					
					|  |  |  |         wd->FrameSemaphores = (ImGui_ImplVulkanH_FrameSemaphores*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameSemaphores) * wd->ImageCount); |  |  |  |         wd->FrameSemaphores = (ImGui_ImplVulkanH_FrameSemaphores*)IM_ALLOC(sizeof(ImGui_ImplVulkanH_FrameSemaphores) * wd->SemaphoreCount); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->ImageCount); |  |  |  |         memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->ImageCount); | 
			
		
	
		
		
			
				
					
					|  |  |  |         memset(wd->FrameSemaphores, 0, sizeof(wd->FrameSemaphores[0]) * wd->ImageCount); |  |  |  |         memset(wd->FrameSemaphores, 0, sizeof(wd->FrameSemaphores[0]) * wd->SemaphoreCount); | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         for (uint32_t i = 0; i < wd->ImageCount; i++) |  |  |  |         for (uint32_t i = 0; i < wd->ImageCount; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |             wd->Frames[i].Backbuffer = backbuffers[i]; |  |  |  |             wd->Frames[i].Backbuffer = backbuffers[i]; | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1596,10 +1600,9 @@ void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui | 
			
		
	
		
		
			
				
					
					|  |  |  |     //vkQueueWaitIdle(bd->Queue); |  |  |  |     //vkQueueWaitIdle(bd->Queue); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     for (uint32_t i = 0; i < wd->ImageCount; i++) |  |  |  |     for (uint32_t i = 0; i < wd->ImageCount; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |     { |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); |  |  |  |         ImGui_ImplVulkanH_DestroyFrame(device, &wd->Frames[i], allocator); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     for (uint32_t i = 0; i < wd->SemaphoreCount; i++) | 
			
		
	
		
		
			
				
					
					|  |  |  |         ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); |  |  |  |         ImGui_ImplVulkanH_DestroyFrameSemaphores(device, &wd->FrameSemaphores[i], allocator); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     IM_FREE(wd->Frames); |  |  |  |     IM_FREE(wd->Frames); | 
			
		
	
		
		
			
				
					
					|  |  |  |     IM_FREE(wd->FrameSemaphores); |  |  |  |     IM_FREE(wd->FrameSemaphores); | 
			
		
	
		
		
			
				
					
					|  |  |  |     wd->Frames = nullptr; |  |  |  |     wd->Frames = nullptr; | 
			
		
	
	
		
		
			
				
					
					|  |  | @@ -1873,8 +1876,8 @@ static void ImGui_ImplVulkan_SwapBuffers(ImGuiViewport* viewport, void*) | 
			
		
	
		
		
			
				
					
					|  |  |  |     else |  |  |  |     else | 
			
		
	
		
		
			
				
					
					|  |  |  |         check_vk_result(err); |  |  |  |         check_vk_result(err); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     wd->FrameIndex = (wd->FrameIndex + 1) % wd->ImageCount;         // This is for the next vkWaitForFences() |  |  |  |     wd->FrameIndex = (wd->FrameIndex + 1) % wd->ImageCount;             // This is for the next vkWaitForFences() | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->ImageCount; // Now we can use the next set of semaphores |  |  |  |     wd->SemaphoreIndex = (wd->SemaphoreIndex + 1) % wd->SemaphoreCount; // Now we can use the next set of semaphores | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | void ImGui_ImplVulkan_InitPlatformInterface() |  |  |  | void ImGui_ImplVulkan_InitPlatformInterface() | 
			
		
	
	
		
		
			
				
					
					|  |  |   |