Examples: Vulkan: Renamed QueuedFramesCount to FramesQueueSize. Moved Framebuffer, Backbuffer to FrameData structure. (#2071)
diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt
index 0220f23..6046f19 100644
--- a/docs/CHANGELOG.txt
+++ b/docs/CHANGELOG.txt
@@ -49,9 +49,9 @@
 - Examples: OpenGL3: Minor tweaks + not calling glBindBuffer more than necessary in the render loop.
 - Examples: Vulkan: Added missing support for 32-bit indices (#define ImDrawIdx unsigned int).
 - Examples: Vulkan: Avoid passing negative coordinates to vkCmdSetScissor, which debug validation layers do not like.
-- Examples: Vulkan: Added QueuedFramesCount field in ImGui_ImplVulkan_InitInfo, required during
+- Examples: Vulkan: Added FramesQueueSize field in ImGui_ImplVulkan_InitInfo, required during
   initialization (was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). (#2071) [@nathanvoglsam]
-  Added ImGui_ImplVulkan_SetQueuedFramesCount() to override QueuedFramesCount while running.
+  Added ImGui_ImplVulkan_SetFramesQueueSize() to override FramesQueueSize while running.
 - Examples: DirectX9: Fixed erroneous assert in ImGui_ImplDX9_InvalidateDeviceObjects(). (#2454)
 - Examples: GLUT: Fixed existing FreeGLUT example to work with regular GLUT. (#2465) [@andrewwillmott]
 - Examples: GLUT: Renamed imgui_impl_freeglut.cpp/.h to imgui_impl_glut.cpp/.h. (#2465) [@andrewwillmott]
diff --git a/examples/example_glfw_vulkan/main.cpp b/examples/example_glfw_vulkan/main.cpp
index b04bde3..cec1217 100644
--- a/examples/example_glfw_vulkan/main.cpp
+++ b/examples/example_glfw_vulkan/main.cpp
@@ -214,7 +214,7 @@
     // Create SwapChain, RenderPass, Framebuffer, etc.
     ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(g_PhysicalDevice, g_Device, wd, g_Allocator, width, height, g_MinImageCount);
     ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(g_PhysicalDevice, g_Device, g_QueueFamily, wd, g_Allocator);
-    IM_ASSERT(wd->BackBufferCount > 0);
+    IM_ASSERT(wd->FramesQueueSize >= 2);
 }
 
 static void CleanupVulkan()
@@ -262,7 +262,7 @@
         VkRenderPassBeginInfo info = {};
         info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
         info.renderPass = wd->RenderPass;
-        info.framebuffer = wd->Framebuffer[wd->FrameIndex];
+        info.framebuffer = fd->Framebuffer;
         info.renderArea.extent.width = wd->Width;
         info.renderArea.extent.height = wd->Height;
         info.clearValueCount = 1;
@@ -374,7 +374,7 @@
     init_info.PipelineCache = g_PipelineCache;
     init_info.DescriptorPool = g_DescriptorPool;
     init_info.Allocator = g_Allocator;
-    init_info.QueuedFramesCount = (int)wd->BackBufferCount;
+    init_info.FramesQueueSize = wd->FramesQueueSize;
     init_info.CheckVkResultFn = check_vk_result;
     ImGui_ImplVulkan_Init(&init_info, wd->RenderPass);
 
@@ -440,7 +440,7 @@
         {
             ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(g_PhysicalDevice, g_Device, &g_WindowData, g_Allocator, g_ResizeWidth, g_ResizeHeight, g_MinImageCount);
             ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(g_PhysicalDevice, g_Device, g_QueueFamily, &g_WindowData, g_Allocator);
-            ImGui_ImplVulkan_SetQueuedFramesCount(g_WindowData.BackBufferCount);
+            ImGui_ImplVulkan_SetFramesQueueSize(g_WindowData.FramesQueueSize);
             g_WindowData.FrameIndex = 0;
             g_WantSwapChainRebuild = false;
         }
diff --git a/examples/example_sdl_vulkan/main.cpp b/examples/example_sdl_vulkan/main.cpp
index 15eb62c..70ba5a2 100644
--- a/examples/example_sdl_vulkan/main.cpp
+++ b/examples/example_sdl_vulkan/main.cpp
@@ -205,7 +205,7 @@
     // Create SwapChain, RenderPass, Framebuffer, etc.
     ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(g_PhysicalDevice, g_Device, wd, g_Allocator, width, height, g_MinImageCount);
     ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(g_PhysicalDevice, g_Device, g_QueueFamily, wd, g_Allocator);
-    IM_ASSERT(wd->BackBufferCount > 0);
+    IM_ASSERT(wd->FramesQueueSize >= 2);
 }
 
 static void CleanupVulkan()
@@ -253,7 +253,7 @@
         VkRenderPassBeginInfo info = {};
         info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
         info.renderPass = wd->RenderPass;
-        info.framebuffer = wd->Framebuffer[wd->FrameIndex];
+        info.framebuffer = fd->Framebuffer;
         info.renderArea.extent.width = wd->Width;
         info.renderArea.extent.height = wd->Height;
         info.clearValueCount = 1;
@@ -357,7 +357,7 @@
     init_info.PipelineCache = g_PipelineCache;
     init_info.DescriptorPool = g_DescriptorPool;
     init_info.Allocator = g_Allocator;
-    init_info.QueuedFramesCount = wd->BackBufferCount;
+    init_info.FramesQueueSize = wd->FramesQueueSize;
     init_info.CheckVkResultFn = check_vk_result;
     ImGui_ImplVulkan_Init(&init_info, wd->RenderPass);
 
@@ -437,7 +437,7 @@
         {
             ImGui_ImplVulkanH_CreateWindowDataSwapChainAndFramebuffer(g_PhysicalDevice, g_Device, &g_WindowData, g_Allocator, g_WindowData.Width, g_WindowData.Height, g_MinImageCount);
             ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(g_PhysicalDevice, g_Device, g_QueueFamily, &g_WindowData, g_Allocator);
-            ImGui_ImplVulkan_SetQueuedFramesCount(g_WindowData.BackBufferCount);
+            ImGui_ImplVulkan_SetFramesQueueSize(g_WindowData.FramesQueueSize);
             g_WindowData.FrameIndex = 0;
             g_WantSwapChainRebuild = false;
         }
diff --git a/examples/imgui_impl_vulkan.cpp b/examples/imgui_impl_vulkan.cpp
index 9eff80f..2d6fc37 100644
--- a/examples/imgui_impl_vulkan.cpp
+++ b/examples/imgui_impl_vulkan.cpp
@@ -13,8 +13,7 @@
 
 // CHANGELOG
 // (minor and older changes stripped away, please see git history for details)
-//  2019-XX-XX: Vulkan: Added QueuedFramesCount field in ImGui_ImplVulkan_InitInfo, required for initialization (was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2).
-//  2019-XX-XX: Vulkan: Added ImGui_ImplVulkan_SetQueuedFramesCount() to override QueuedFramesCount while running.
+//  2019-XX-XX: Vulkan: Added FramesQueueSize field in ImGui_ImplVulkan_InitInfo, required for initialization (was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). Added ImGui_ImplVulkan_SetFramesQueueSize() to override FramesQueueSize while running.
 //  2019-04-04: Vulkan: Avoid passing negative coordinates to vkCmdSetScissor, which debug validation layers do not like.
 //  2019-04-01: Vulkan: Support for 32-bit index buffer (#define ImDrawIdx unsigned int).
 //  2019-02-16: Vulkan: Viewport and clipping rectangles correctly using draw_data->FramebufferScale to allow retina display.
@@ -764,7 +763,7 @@
     IM_ASSERT(info->Device != VK_NULL_HANDLE);
     IM_ASSERT(info->Queue != VK_NULL_HANDLE);
     IM_ASSERT(info->DescriptorPool != VK_NULL_HANDLE);
-    IM_ASSERT(info->QueuedFramesCount >= 2);
+    IM_ASSERT(info->FramesQueueSize >= 2);
     IM_ASSERT(render_pass != VK_NULL_HANDLE);
 
     g_Instance = info->Instance;
@@ -778,8 +777,8 @@
     g_Allocator = info->Allocator;
     g_CheckVkResultFn = info->CheckVkResultFn;
 
-    g_FramesDataBuffers.reserve(info->QueuedFramesCount);
-    for (int i = 0; i < info->QueuedFramesCount; i++)
+    g_FramesDataBuffers.reserve(info->FramesQueueSize);
+    for (int i = 0; i < info->FramesQueueSize; i++)
         g_FramesDataBuffers.push_back(FrameDataForRender());
 
     ImGui_ImplVulkan_CreateDeviceObjects();
@@ -797,15 +796,15 @@
 {
 }
 
-void ImGui_ImplVulkan_SetQueuedFramesCount(int count)
+void ImGui_ImplVulkan_SetFramesQueueSize(int frames_queue_size)
 {
-    if (count == g_FramesDataBuffers.Size)
+    if (frames_queue_size == g_FramesDataBuffers.Size)
         return;
     ImGui_ImplVulkan_InvalidateFrameDeviceObjects();
 
     g_FrameIndex = 0;
-    g_FramesDataBuffers.reserve(count);
-    for (int i = 0; i < count; i++)
+    g_FramesDataBuffers.reserve(frames_queue_size);
+    for (int i = 0; i < frames_queue_size; i++)
         g_FramesDataBuffers.push_back(FrameDataForRender());
 }
 
@@ -828,12 +827,14 @@
 
 ImGui_ImplVulkanH_FrameData::ImGui_ImplVulkanH_FrameData()
 {
-    BackbufferIndex = 0;
     CommandPool = VK_NULL_HANDLE;
     CommandBuffer = VK_NULL_HANDLE;
     Fence = VK_NULL_HANDLE;
     ImageAcquiredSemaphore = VK_NULL_HANDLE;
     RenderCompleteSemaphore = VK_NULL_HANDLE;
+    BackBuffer = VK_NULL_HANDLE;
+    BackBufferView = VK_NULL_HANDLE;
+    Framebuffer = VK_NULL_HANDLE;
 }
 
 ImGui_ImplVulkanH_WindowData::ImGui_ImplVulkanH_WindowData()
@@ -846,10 +847,7 @@
     RenderPass = VK_NULL_HANDLE;
     ClearEnable = true;
     memset(&ClearValue, 0, sizeof(ClearValue));
-    BackBufferCount = 0;
-    memset(&BackBuffer, 0, sizeof(BackBuffer));
-    memset(&BackBufferView, 0, sizeof(BackBufferView));
-    memset(&Framebuffer, 0, sizeof(Framebuffer));
+    FramesQueueSize = 0;
     FrameIndex = 0;
 }
 
@@ -985,14 +983,10 @@
     check_vk_result(err);
 
     // Destroy old Framebuffer
-    for (uint32_t i = 0; i < wd->BackBufferCount; i++)
-    {
-        if (wd->BackBufferView[i])
-            vkDestroyImageView(device, wd->BackBufferView[i], allocator);
-        if (wd->Framebuffer[i])
-            vkDestroyFramebuffer(device, wd->Framebuffer[i], allocator);
-    }
-    wd->BackBufferCount = 0;
+    for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
+        ImGui_ImplVulkanH_DestroyFrameData(g_Instance, device, &wd->Frames[i], allocator);
+    wd->Frames.clear();
+    wd->FramesQueueSize = 0;
     if (wd->RenderPass)
         vkDestroyRenderPass(device, wd->RenderPass, allocator);
 
@@ -1036,18 +1030,19 @@
         }
         err = vkCreateSwapchainKHR(device, &info, allocator, &wd->Swapchain);
         check_vk_result(err);
-        err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->BackBufferCount, NULL);
+        err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->FramesQueueSize, NULL);
         check_vk_result(err);
-        err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->BackBufferCount, wd->BackBuffer);
+        VkImage backbuffers[16] = {};
+        IM_ASSERT(wd->FramesQueueSize < IM_ARRAYSIZE(backbuffers));
+        err = vkGetSwapchainImagesKHR(device, wd->Swapchain, &wd->FramesQueueSize, backbuffers);
         check_vk_result(err);
 
-        for (int i = 0; i < wd->Frames.Size; i++)
-            ImGui_ImplVulkanH_DestroyFrameData(g_Instance, device, &wd->Frames[i], allocator);
-        wd->Frames.clear();
-
-        wd->Frames.reserve((int)wd->BackBufferCount);
-        for (int i = 0; i < (int)wd->BackBufferCount; i++)
+        wd->Frames.reserve((int)wd->FramesQueueSize);
+        for (int i = 0; i < (int)wd->FramesQueueSize; i++)
+        {
             wd->Frames.push_back(ImGui_ImplVulkanH_FrameData());
+            wd->Frames[i].BackBuffer = backbuffers[i];
+        }
     }
     if (old_swapchain)
         vkDestroySwapchainKHR(device, old_swapchain, allocator);
@@ -1101,10 +1096,11 @@
         info.components.a = VK_COMPONENT_SWIZZLE_A;
         VkImageSubresourceRange image_range = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1 };
         info.subresourceRange = image_range;
-        for (uint32_t i = 0; i < wd->BackBufferCount; i++)
+        for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
         {
-            info.image = wd->BackBuffer[i];
-            err = vkCreateImageView(device, &info, allocator, &wd->BackBufferView[i]);
+            ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[i];
+            info.image = fd->BackBuffer;
+            err = vkCreateImageView(device, &info, allocator, &fd->BackBufferView);
             check_vk_result(err);
         }
     }
@@ -1120,10 +1116,11 @@
         info.width = wd->Width;
         info.height = wd->Height;
         info.layers = 1;
-        for (uint32_t i = 0; i < wd->BackBufferCount; i++)
+        for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
         {
-            attachment[0] = wd->BackBufferView[i];
-            err = vkCreateFramebuffer(device, &info, allocator, &wd->Framebuffer[i]);
+            ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[i];
+            attachment[0] = fd->BackBufferView;
+            err = vkCreateFramebuffer(device, &info, allocator, &fd->Framebuffer);
             check_vk_result(err);
         }
     }
@@ -1135,15 +1132,7 @@
     //vkQueueWaitIdle(g_Queue);
 
     for (int i = 0; i < wd->Frames.Size; i++)
-    {
-        ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[i];
-        ImGui_ImplVulkanH_DestroyFrameData(instance, device, fd, allocator);
-    }
-    for (uint32_t i = 0; i < wd->BackBufferCount; i++)
-    {
-        vkDestroyImageView(device, wd->BackBufferView[i], allocator);
-        vkDestroyFramebuffer(device, wd->Framebuffer[i], allocator);
-    }
+        ImGui_ImplVulkanH_DestroyFrameData(instance, device, &wd->Frames[i], allocator);
     vkDestroyRenderPass(device, wd->RenderPass, allocator);
     vkDestroySwapchainKHR(device, wd->Swapchain, allocator);
     vkDestroySurfaceKHR(instance, wd->Surface, allocator);
@@ -1158,9 +1147,11 @@
     vkDestroyCommandPool(device, fd->CommandPool, allocator);
     vkDestroySemaphore(device, fd->ImageAcquiredSemaphore, allocator);
     vkDestroySemaphore(device, fd->RenderCompleteSemaphore, allocator);
-    fd->BackbufferIndex = 0;
     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);
 }
diff --git a/examples/imgui_impl_vulkan.h b/examples/imgui_impl_vulkan.h
index f54caf3..495f6d4 100644
--- a/examples/imgui_impl_vulkan.h
+++ b/examples/imgui_impl_vulkan.h
@@ -27,7 +27,7 @@
     VkQueue                         Queue;
     VkPipelineCache                 PipelineCache;
     VkDescriptorPool                DescriptorPool;
-    int                             QueuedFramesCount;
+    int                             FramesQueueSize;        // >= 2, generally matches the image count returned by vkGetSwapchainImagesKHR
     const VkAllocationCallbacks*    Allocator;
     void                            (*CheckVkResultFn)(VkResult err);
 };
@@ -36,7 +36,7 @@
 IMGUI_IMPL_API bool     ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass render_pass);
 IMGUI_IMPL_API void     ImGui_ImplVulkan_Shutdown();
 IMGUI_IMPL_API void     ImGui_ImplVulkan_NewFrame();
-IMGUI_IMPL_API void     ImGui_ImplVulkan_SetQueuedFramesCount(int queued_frames_count); // To override QueuedFramesCount after initialization
+IMGUI_IMPL_API void     ImGui_ImplVulkan_SetFramesQueueSize(int frames_queue_size); // To override FramesQueueSize after initialization
 IMGUI_IMPL_API void     ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer);
 IMGUI_IMPL_API bool     ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer);
 IMGUI_IMPL_API void     ImGui_ImplVulkan_InvalidateFontUploadObjects();
@@ -77,12 +77,14 @@
 // (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own app.)
 struct ImGui_ImplVulkanH_FrameData
 {
-    uint32_t            BackbufferIndex;        // Keep track of recently rendered swapchain frame indices
     VkCommandPool       CommandPool;
     VkCommandBuffer     CommandBuffer;
     VkFence             Fence;
     VkSemaphore         ImageAcquiredSemaphore;
     VkSemaphore         RenderCompleteSemaphore;
+    VkImage             BackBuffer;
+    VkImageView         BackBufferView;
+    VkFramebuffer       Framebuffer;
 
     IMGUI_IMPL_API ImGui_ImplVulkanH_FrameData();
 };
@@ -100,11 +102,8 @@
     VkRenderPass        RenderPass;
     bool                ClearEnable;
     VkClearValue        ClearValue;
-    uint32_t            BackBufferCount;
-    VkImage             BackBuffer[16];
-    VkImageView         BackBufferView[16];
-    VkFramebuffer       Framebuffer[16];
-    uint32_t            FrameIndex;
+    uint32_t            FramesQueueSize;            // Number of simultaneous in-flight frames (returned by vkGetSwapchainImagesKHR)
+    uint32_t            FrameIndex;                 // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount)
     ImVector<ImGui_ImplVulkanH_FrameData> Frames;
 
     IMGUI_IMPL_API ImGui_ImplVulkanH_WindowData();