Browse Source

Examples: Vulkan: Only resize swap chain and framebuffer once. (#1042)

omar 7 years ago
parent
commit
37cb177745
1 changed files with 19 additions and 5 deletions
  1. 19 5
      examples/vulkan_example/main.cpp

+ 19 - 5
examples/vulkan_example/main.cpp

@@ -34,7 +34,9 @@ static VkPresentModeKHR         g_PresentMode;
 static VkPipelineCache          g_PipelineCache = VK_NULL_HANDLE;
 static VkDescriptorPool         g_DescriptorPool = VK_NULL_HANDLE;
 
-static int                      fb_width, fb_height;
+static int                      fb_width = 0, fb_height = 0;
+static bool                     g_ResizeWanted = false;
+static int                      g_ResizeWidth = 0, g_ResizeHeight = 0;
 static uint32_t                 g_BackbufferIndices[IMGUI_VK_QUEUED_FRAMES];    // keep track of recently rendered swapchain frame indices
 static uint32_t                 g_BackBufferCount = 0;
 static VkImage                  g_BackBuffer[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {};
@@ -58,7 +60,7 @@ static void check_vk_result(VkResult err)
         abort();
 }
 
-static void resize_vulkan(GLFWwindow* /*window*/, int w, int h)
+static void resize_vulkan(int w, int h)
 {
     VkResult err;
     VkSwapchainKHR old_swapchain = g_Swapchain;
@@ -355,7 +357,7 @@ static void setup_vulkan(GLFWwindow* window)
 
     // Get Present Mode
     {
-        // Requst a certain mode and confirm that it is available. If not use VK_PRESENT_MODE_FIFO_KHR which is mandatory
+        // Request a certain mode and confirm that it is available. If not use VK_PRESENT_MODE_FIFO_KHR which is mandatory
 #ifdef IMGUI_UNLIMITED_FRAME_RATE
         g_PresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR;
 #else
@@ -406,8 +408,7 @@ static void setup_vulkan(GLFWwindow* window)
     {
         int w, h;
         glfwGetFramebufferSize(window, &w, &h);
-        resize_vulkan(window, w, h);
-        glfwSetFramebufferSizeCallback(window, resize_vulkan);
+        resize_vulkan(w, h);
     }
 
     // Create Command Buffers
@@ -588,6 +589,13 @@ static void glfw_error_callback(int error, const char* description)
     fprintf(stderr, "Error %d: %s\n", error, description);
 }
 
+static void glfw_resize_callback(GLFWwindow*, int w, int h)
+{
+    g_ResizeWanted = true;
+    g_ResizeWidth = w;
+    g_ResizeHeight = h;
+}
+
 int main(int, char**)
 {
     // Setup window
@@ -605,6 +613,7 @@ int main(int, char**)
         return 1;
     }
     setup_vulkan(window);
+    glfwSetFramebufferSizeCallback(window, glfw_resize_callback);
 
     // Setup ImGui binding
     ImGui::CreateContext();
@@ -680,6 +689,11 @@ int main(int, char**)
         // - When io.WantCaptureKeyboard is true, do not dispatch keyboard input data to your main application.
         // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags.
         glfwPollEvents();
+
+        if (g_ResizeWanted)
+            resize_vulkan(g_ResizeWidth, g_ResizeHeight);
+        g_ResizeWanted = false;
+
         ImGui_ImplGlfwVulkan_NewFrame();
 
         // 1. Show a simple window.