Examples: Vulkan: Reduced duplicate code by skipping present on the first frame. Amend 201d589714 by @ParticlePeter

This commit is contained in:
omar 2018-03-02 19:59:34 +01:00
parent e927a6ac4a
commit 7b968b098e
2 changed files with 19 additions and 22 deletions

View File

@ -625,17 +625,7 @@ int main(int, char**)
bool show_another_window = false; bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// When IMGUI_UNLIMITED_FRAME_RATE is defined we render into latest image acquired from the swapchain but we display the image which was rendered before. bool swap_chain_has_at_least_one_image = false;
// Hence we must render once and increase the g_FrameIndex without presenting, which we do before entering the render loop.
// This is also the reason why frame_end() is split into frame_end() and frame_present(), the later one not being called here.
#ifdef IMGUI_UNLIMITED_FRAME_RATE
ImGui_ImplVulkan_NewFrame();
ImGui_ImplSDL2_NewFrame(window);
frame_begin();
ImGui_ImplVulkan_Render(g_Frames[g_FrameIndex].CommandBuffer);
frame_end();
g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;
#endif // IMGUI_UNLIMITED_FRAME_RATE
// Main loop // Main loop
bool done = false; bool done = false;
@ -699,7 +689,16 @@ int main(int, char**)
frame_begin(); frame_begin();
ImGui_ImplVulkan_Render(g_Frames[g_FrameIndex].CommandBuffer); ImGui_ImplVulkan_Render(g_Frames[g_FrameIndex].CommandBuffer);
frame_end(); frame_end();
// When IMGUI_UNLIMITED_FRAME_RATE is defined we render into latest image acquired from the swapchain but we display the image which was rendered before.
// Hence we must render once and increase the g_FrameIndex without presenting, which we do before entering the render loop.
#ifdef IMGUI_UNLIMITED_FRAME_RATE
if (swap_chain_has_at_least_one_image)
frame_present();
#else
frame_present(); frame_present();
#endif
swap_chain_has_at_least_one_image = true;
} }
// Cleanup // Cleanup

View File

@ -635,17 +635,7 @@ int main(int, char**)
bool show_another_window = false; bool show_another_window = false;
ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
// When IMGUI_UNLIMITED_FRAME_RATE is defined we render into latest image acquired from the swapchain but we display the image which was rendered before. bool swap_chain_has_at_least_one_image = false;
// Hence we must render once and increase the g_FrameIndex without presenting, which we do before entering the render loop.
// This is also the reason why frame_end() is split into frame_end() and frame_present(), the later one not being called here.
#ifdef IMGUI_UNLIMITED_FRAME_RATE
ImGui_ImplVulkan_NewFrame();
ImGui_ImplGlfw_NewFrame();
frame_begin();
ImGui_ImplVulkan_Render(g_Frames[g_FrameIndex].CommandBuffer);
frame_end();
g_FrameIndex = (g_FrameIndex + 1) % IMGUI_VK_QUEUED_FRAMES;
#endif // IMGUI_UNLIMITED_FRAME_RATE
// Main loop // Main loop
while (!glfwWindowShouldClose(window)) while (!glfwWindowShouldClose(window))
@ -700,7 +690,15 @@ int main(int, char**)
frame_begin(); frame_begin();
ImGui_ImplVulkan_Render(g_Frames[g_FrameIndex].CommandBuffer); ImGui_ImplVulkan_Render(g_Frames[g_FrameIndex].CommandBuffer);
frame_end(); frame_end();
// When IMGUI_UNLIMITED_FRAME_RATE is defined we render into latest image acquired from the swapchain but we display the image which was rendered before.
// Hence we must render once and increase the g_FrameIndex without presenting, which we do before entering the render loop.
#ifdef IMGUI_UNLIMITED_FRAME_RATE
if (swap_chain_has_at_least_one_image)
frame_present();
#else
frame_present(); frame_present();
#endif
ImGui::UpdatePlatformWindows(); ImGui::UpdatePlatformWindows();
ImGui::RenderPlatformWindows(); ImGui::RenderPlatformWindows();