mirror of
				https://github.com/Drezil/imgui.git
				synced 2025-10-31 21:21:06 +01:00 
			
		
		
		
	Examples: Vulkan: Only resize swap chain and framebuffer once. (#1042)
This commit is contained in:
		| @@ -34,7 +34,9 @@ static VkPresentModeKHR         g_PresentMode; | |||||||
| static VkPipelineCache          g_PipelineCache = VK_NULL_HANDLE; | static VkPipelineCache          g_PipelineCache = VK_NULL_HANDLE; | ||||||
| static VkDescriptorPool         g_DescriptorPool = 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_BackbufferIndices[IMGUI_VK_QUEUED_FRAMES];    // keep track of recently rendered swapchain frame indices | ||||||
| static uint32_t                 g_BackBufferCount = 0; | static uint32_t                 g_BackBufferCount = 0; | ||||||
| static VkImage                  g_BackBuffer[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {}; | static VkImage                  g_BackBuffer[IMGUI_MAX_POSSIBLE_BACK_BUFFERS] = {}; | ||||||
| @@ -58,7 +60,7 @@ static void check_vk_result(VkResult err) | |||||||
|         abort(); |         abort(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void resize_vulkan(GLFWwindow* /*window*/, int w, int h) | static void resize_vulkan(int w, int h) | ||||||
| { | { | ||||||
|     VkResult err; |     VkResult err; | ||||||
|     VkSwapchainKHR old_swapchain = g_Swapchain; |     VkSwapchainKHR old_swapchain = g_Swapchain; | ||||||
| @@ -355,7 +357,7 @@ static void setup_vulkan(GLFWwindow* window) | |||||||
|  |  | ||||||
|     // Get Present Mode |     // 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 | #ifdef IMGUI_UNLIMITED_FRAME_RATE | ||||||
|         g_PresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; |         g_PresentMode = VK_PRESENT_MODE_IMMEDIATE_KHR; | ||||||
| #else | #else | ||||||
| @@ -406,8 +408,7 @@ static void setup_vulkan(GLFWwindow* window) | |||||||
|     { |     { | ||||||
|         int w, h; |         int w, h; | ||||||
|         glfwGetFramebufferSize(window, &w, &h); |         glfwGetFramebufferSize(window, &w, &h); | ||||||
|         resize_vulkan(window, w, h); |         resize_vulkan(w, h); | ||||||
|         glfwSetFramebufferSizeCallback(window, resize_vulkan); |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Create Command Buffers |     // 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); |     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**) | int main(int, char**) | ||||||
| { | { | ||||||
|     // Setup window |     // Setup window | ||||||
| @@ -605,6 +613,7 @@ int main(int, char**) | |||||||
|         return 1; |         return 1; | ||||||
|     } |     } | ||||||
|     setup_vulkan(window); |     setup_vulkan(window); | ||||||
|  |     glfwSetFramebufferSizeCallback(window, glfw_resize_callback); | ||||||
|  |  | ||||||
|     // Setup ImGui binding |     // Setup ImGui binding | ||||||
|     ImGui::CreateContext(); |     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. |         // - 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. |         // Generally you may always pass all inputs to dear imgui, and hide them from your application based on those two flags. | ||||||
|         glfwPollEvents(); |         glfwPollEvents(); | ||||||
|  |  | ||||||
|  |         if (g_ResizeWanted) | ||||||
|  |             resize_vulkan(g_ResizeWidth, g_ResizeHeight); | ||||||
|  |         g_ResizeWanted = false; | ||||||
|  |  | ||||||
|         ImGui_ImplGlfwVulkan_NewFrame(); |         ImGui_ImplGlfwVulkan_NewFrame(); | ||||||
|  |  | ||||||
|         // 1. Show a simple window. |         // 1. Show a simple window. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user