mirror of
https://github.com/ocornut/imgui.git
synced 2024-11-24 05:19:02 +08:00
Vulkan: Renaming demo/helper structures. Tidying up examples main.cpp.
This commit is contained in:
parent
4f54a527ab
commit
0034e65c26
@ -36,10 +36,12 @@ HOW TO UPDATE?
|
|||||||
Breaking Changes:
|
Breaking Changes:
|
||||||
- Examples: Vulkan: Added extra parameter to ImGui_ImplVulkan_RenderDrawData(). Engine/app is
|
- Examples: Vulkan: Added extra parameter to ImGui_ImplVulkan_RenderDrawData(). Engine/app is
|
||||||
in charge of owning/storing 1 ImGui_ImplVulkan_FrameRenderBuffers per in-flight rendering frame.
|
in charge of owning/storing 1 ImGui_ImplVulkan_FrameRenderBuffers per in-flight rendering frame.
|
||||||
(The demo helper ImGui_ImplVulkanH_WindowData structure carries them.) (#2461, #2348, #2378, #2097)
|
(The demo helper ImGui_ImplVulkanH_Window structure carries them.) (#2461, #2348, #2378, #2097)
|
||||||
- Examples: Vulkan: Added MinImageCount field in ImGui_ImplVulkan_InitInfo, required during
|
- Examples: Vulkan: Added MinImageCount field in ImGui_ImplVulkan_InitInfo, required during
|
||||||
initialization to specify the number of in-flight image requested by swap chains.
|
initialization to specify the number of in-flight image requested by swap chains.
|
||||||
(was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). (#2071, #1677) [@nathanvoglsam]
|
(was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). (#2071, #1677) [@nathanvoglsam]
|
||||||
|
- Examples: Vulkan: Tidying up the demo/internals helpers (most engine/app should not rely
|
||||||
|
on them but it is possible you have!).
|
||||||
|
|
||||||
|
|
||||||
Other Changes:
|
Other Changes:
|
||||||
|
@ -30,20 +30,21 @@
|
|||||||
#define IMGUI_VULKAN_DEBUG_REPORT
|
#define IMGUI_VULKAN_DEBUG_REPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static VkAllocationCallbacks* g_Allocator = NULL;
|
static VkAllocationCallbacks* g_Allocator = NULL;
|
||||||
static VkInstance g_Instance = VK_NULL_HANDLE;
|
static VkInstance g_Instance = VK_NULL_HANDLE;
|
||||||
static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE;
|
static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE;
|
||||||
static VkDevice g_Device = VK_NULL_HANDLE;
|
static VkDevice g_Device = VK_NULL_HANDLE;
|
||||||
static uint32_t g_QueueFamily = (uint32_t)-1;
|
static uint32_t g_QueueFamily = (uint32_t)-1;
|
||||||
static VkQueue g_Queue = VK_NULL_HANDLE;
|
static VkQueue g_Queue = VK_NULL_HANDLE;
|
||||||
static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE;
|
static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE;
|
||||||
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 ImGui_ImplVulkanH_WindowData g_WindowData;
|
static ImGui_ImplVulkanH_Window g_WindowData;
|
||||||
static int g_MinImageCount = 2;
|
static int g_MinImageCount = 2;
|
||||||
static bool g_WantSwapChainRebuild = false;
|
static bool g_SwapChainRebuild = false;
|
||||||
static int g_ResizeWidth = 0, g_ResizeHeight = 0;
|
static int g_SwapChainResizeWidth = 0;
|
||||||
|
static int g_SwapChainResizeHeight = 0;
|
||||||
|
|
||||||
static void check_vk_result(VkResult err)
|
static void check_vk_result(VkResult err)
|
||||||
{
|
{
|
||||||
@ -192,7 +193,7 @@ static void SetupVulkan(const char** extensions, uint32_t extensions_count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetupVulkanWindow(ImGui_ImplVulkanH_WindowData* wd, VkSurfaceKHR surface, int width, int height)
|
static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height)
|
||||||
{
|
{
|
||||||
wd->Surface = surface;
|
wd->Surface = surface;
|
||||||
|
|
||||||
@ -220,8 +221,8 @@ static void SetupVulkanWindow(ImGui_ImplVulkanH_WindowData* wd, VkSurfaceKHR sur
|
|||||||
//printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode);
|
//printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode);
|
||||||
|
|
||||||
// Create SwapChain, RenderPass, Framebuffer, etc.
|
// Create SwapChain, RenderPass, Framebuffer, etc.
|
||||||
ImGui_ImplVulkanH_CreateWindowData(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount);
|
IM_ASSERT(g_MinImageCount >= 2);
|
||||||
IM_ASSERT(wd->FramesQueueSize >= 2);
|
ImGui_ImplVulkanH_CreateWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CleanupVulkan()
|
static void CleanupVulkan()
|
||||||
@ -240,14 +241,14 @@ static void CleanupVulkan()
|
|||||||
|
|
||||||
static void CleanupVulkanWindow()
|
static void CleanupVulkanWindow()
|
||||||
{
|
{
|
||||||
// In a normal engine/app integration, you wouldn't use the ImGui_ImplVulkanH_WindowData helpers,
|
// In a normal engine/app integration, you wouldn't use the ImGui_ImplVulkanH_Window helpers,
|
||||||
// however you would instead need to call ImGui_ImplVulkan_DestroyFrameRenderBuffers() on each
|
// however you would instead need to call ImGui_ImplVulkan_DestroyFrameRenderBuffers() on each
|
||||||
// ImGui_ImplVulkan_FrameRenderBuffers structure that you own.
|
// ImGui_ImplVulkan_FrameRenderBuffers structure that you own.
|
||||||
ImGui_ImplVulkanH_WindowData* wd = &g_WindowData;
|
ImGui_ImplVulkanH_Window* wd = &g_WindowData;
|
||||||
ImGui_ImplVulkanH_DestroyWindowData(g_Instance, g_Device, wd, g_Allocator);
|
ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, wd, g_Allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FrameRender(ImGui_ImplVulkanH_WindowData* wd)
|
static void FrameRender(ImGui_ImplVulkanH_Window* wd)
|
||||||
{
|
{
|
||||||
VkResult err;
|
VkResult err;
|
||||||
|
|
||||||
@ -255,7 +256,7 @@ static void FrameRender(ImGui_ImplVulkanH_WindowData* wd)
|
|||||||
err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex);
|
err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
|
|
||||||
ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[wd->FrameIndex];
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex];
|
||||||
{
|
{
|
||||||
err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking
|
err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
@ -308,9 +309,9 @@ static void FrameRender(ImGui_ImplVulkanH_WindowData* wd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FramePresent(ImGui_ImplVulkanH_WindowData* wd)
|
static void FramePresent(ImGui_ImplVulkanH_Window* wd)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[wd->FrameIndex];
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex];
|
||||||
VkPresentInfoKHR info = {};
|
VkPresentInfoKHR info = {};
|
||||||
info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
info.waitSemaphoreCount = 1;
|
info.waitSemaphoreCount = 1;
|
||||||
@ -329,14 +330,14 @@ static void glfw_error_callback(int error, const char* description)
|
|||||||
|
|
||||||
static void glfw_resize_callback(GLFWwindow*, int w, int h)
|
static void glfw_resize_callback(GLFWwindow*, int w, int h)
|
||||||
{
|
{
|
||||||
g_WantSwapChainRebuild = true;
|
g_SwapChainRebuild = true;
|
||||||
g_ResizeWidth = w;
|
g_SwapChainResizeWidth = w;
|
||||||
g_ResizeHeight = h;
|
g_SwapChainResizeHeight = h;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int, char**)
|
int main(int, char**)
|
||||||
{
|
{
|
||||||
// Setup window
|
// Setup GLFW window
|
||||||
glfwSetErrorCallback(glfw_error_callback);
|
glfwSetErrorCallback(glfw_error_callback);
|
||||||
if (!glfwInit())
|
if (!glfwInit())
|
||||||
return 1;
|
return 1;
|
||||||
@ -363,7 +364,7 @@ int main(int, char**)
|
|||||||
int w, h;
|
int w, h;
|
||||||
glfwGetFramebufferSize(window, &w, &h);
|
glfwGetFramebufferSize(window, &w, &h);
|
||||||
glfwSetFramebufferSizeCallback(window, glfw_resize_callback);
|
glfwSetFramebufferSizeCallback(window, glfw_resize_callback);
|
||||||
ImGui_ImplVulkanH_WindowData* wd = &g_WindowData;
|
ImGui_ImplVulkanH_Window* wd = &g_WindowData;
|
||||||
SetupVulkanWindow(wd, surface, w, h);
|
SetupVulkanWindow(wd, surface, w, h);
|
||||||
|
|
||||||
// Setup Dear ImGui context
|
// Setup Dear ImGui context
|
||||||
@ -450,12 +451,13 @@ 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_WantSwapChainRebuild)
|
|
||||||
|
if (g_SwapChainRebuild)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_CreateWindowData(g_Instance, g_PhysicalDevice, g_Device, &g_WindowData, g_QueueFamily, g_Allocator, g_ResizeWidth, g_ResizeHeight, g_MinImageCount);
|
g_SwapChainRebuild = false;
|
||||||
|
ImGui_ImplVulkanH_CreateWindow(g_Instance, g_PhysicalDevice, g_Device, &g_WindowData, g_QueueFamily, g_Allocator, g_SwapChainResizeWidth, g_SwapChainResizeHeight, g_MinImageCount);
|
||||||
ImGui_ImplVulkan_SetSwapChainMinImageCount(g_MinImageCount);
|
ImGui_ImplVulkan_SetSwapChainMinImageCount(g_MinImageCount);
|
||||||
g_WindowData.FrameIndex = 0;
|
g_WindowData.FrameIndex = 0;
|
||||||
g_WantSwapChainRebuild = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the Dear ImGui frame
|
// Start the Dear ImGui frame
|
||||||
|
@ -22,19 +22,21 @@
|
|||||||
#define IMGUI_VULKAN_DEBUG_REPORT
|
#define IMGUI_VULKAN_DEBUG_REPORT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static VkAllocationCallbacks* g_Allocator = NULL;
|
static VkAllocationCallbacks* g_Allocator = NULL;
|
||||||
static VkInstance g_Instance = VK_NULL_HANDLE;
|
static VkInstance g_Instance = VK_NULL_HANDLE;
|
||||||
static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE;
|
static VkPhysicalDevice g_PhysicalDevice = VK_NULL_HANDLE;
|
||||||
static VkDevice g_Device = VK_NULL_HANDLE;
|
static VkDevice g_Device = VK_NULL_HANDLE;
|
||||||
static uint32_t g_QueueFamily = (uint32_t)-1;
|
static uint32_t g_QueueFamily = (uint32_t)-1;
|
||||||
static VkQueue g_Queue = VK_NULL_HANDLE;
|
static VkQueue g_Queue = VK_NULL_HANDLE;
|
||||||
static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE;
|
static VkDebugReportCallbackEXT g_DebugReport = VK_NULL_HANDLE;
|
||||||
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 ImGui_ImplVulkanH_WindowData g_WindowData;
|
static ImGui_ImplVulkanH_Window g_WindowData;
|
||||||
static uint32_t g_MinImageCount = 2;
|
static uint32_t g_MinImageCount = 2;
|
||||||
static bool g_WantSwapChainRebuild = false;
|
static bool g_SwapChainRebuild = false;
|
||||||
|
static int g_SwapChainResizeWidth = 0;
|
||||||
|
static int g_SwapChainResizeHeight = 0;
|
||||||
|
|
||||||
static void check_vk_result(VkResult err)
|
static void check_vk_result(VkResult err)
|
||||||
{
|
{
|
||||||
@ -183,7 +185,7 @@ static void SetupVulkan(const char** extensions, uint32_t extensions_count)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SetupVulkanWindow(ImGui_ImplVulkanH_WindowData* wd, VkSurfaceKHR surface, int width, int height)
|
static void SetupVulkanWindow(ImGui_ImplVulkanH_Window* wd, VkSurfaceKHR surface, int width, int height)
|
||||||
{
|
{
|
||||||
wd->Surface = surface;
|
wd->Surface = surface;
|
||||||
|
|
||||||
@ -211,8 +213,8 @@ static void SetupVulkanWindow(ImGui_ImplVulkanH_WindowData* wd, VkSurfaceKHR sur
|
|||||||
//printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode);
|
//printf("[vulkan] Selected PresentMode = %d\n", wd->PresentMode);
|
||||||
|
|
||||||
// Create SwapChain, RenderPass, Framebuffer, etc.
|
// Create SwapChain, RenderPass, Framebuffer, etc.
|
||||||
ImGui_ImplVulkanH_CreateWindowData(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount);
|
IM_ASSERT(g_MinImageCount >= 2);
|
||||||
IM_ASSERT(wd->FramesQueueSize >= 2);
|
ImGui_ImplVulkanH_CreateWindow(g_Instance, g_PhysicalDevice, g_Device, wd, g_QueueFamily, g_Allocator, width, height, g_MinImageCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void CleanupVulkan()
|
static void CleanupVulkan()
|
||||||
@ -231,14 +233,14 @@ static void CleanupVulkan()
|
|||||||
|
|
||||||
static void CleanupVulkanWindow()
|
static void CleanupVulkanWindow()
|
||||||
{
|
{
|
||||||
// In a normal engine/app integration, you wouldn't use the ImGui_ImplVulkanH_WindowData helpers,
|
// In a normal engine/app integration, you wouldn't use the ImGui_ImplVulkanH_Window helpers,
|
||||||
// however you would instead need to call ImGui_ImplVulkan_DestroyFrameRenderBuffers() on each
|
// however you would instead need to call ImGui_ImplVulkan_DestroyFrameRenderBuffers() on each
|
||||||
// ImGui_ImplVulkan_FrameRenderBuffers structure that you own.
|
// ImGui_ImplVulkan_FrameRenderBuffers structure that you own.
|
||||||
ImGui_ImplVulkanH_WindowData* wd = &g_WindowData;
|
ImGui_ImplVulkanH_Window* wd = &g_WindowData;
|
||||||
ImGui_ImplVulkanH_DestroyWindowData(g_Instance, g_Device, wd, g_Allocator);
|
ImGui_ImplVulkanH_DestroyWindow(g_Instance, g_Device, wd, g_Allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FrameRender(ImGui_ImplVulkanH_WindowData* wd)
|
static void FrameRender(ImGui_ImplVulkanH_Window* wd)
|
||||||
{
|
{
|
||||||
VkResult err;
|
VkResult err;
|
||||||
|
|
||||||
@ -246,7 +248,7 @@ static void FrameRender(ImGui_ImplVulkanH_WindowData* wd)
|
|||||||
err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex);
|
err = vkAcquireNextImageKHR(g_Device, wd->Swapchain, UINT64_MAX, image_acquired_semaphore, VK_NULL_HANDLE, &wd->FrameIndex);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
|
|
||||||
ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[wd->FrameIndex];
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex];
|
||||||
{
|
{
|
||||||
err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking
|
err = vkWaitForFences(g_Device, 1, &fd->Fence, VK_TRUE, UINT64_MAX); // wait indefinitely instead of periodically checking
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
@ -299,9 +301,9 @@ static void FrameRender(ImGui_ImplVulkanH_WindowData* wd)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FramePresent(ImGui_ImplVulkanH_WindowData* wd)
|
static void FramePresent(ImGui_ImplVulkanH_Window* wd)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[wd->FrameIndex];
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[wd->FrameIndex];
|
||||||
VkPresentInfoKHR info = {};
|
VkPresentInfoKHR info = {};
|
||||||
info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
info.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||||
info.waitSemaphoreCount = 1;
|
info.waitSemaphoreCount = 1;
|
||||||
@ -348,7 +350,7 @@ int main(int, char**)
|
|||||||
// Create Framebuffers
|
// Create Framebuffers
|
||||||
int w, h;
|
int w, h;
|
||||||
SDL_GetWindowSize(window, &w, &h);
|
SDL_GetWindowSize(window, &w, &h);
|
||||||
ImGui_ImplVulkanH_WindowData* wd = &g_WindowData;
|
ImGui_ImplVulkanH_Window* wd = &g_WindowData;
|
||||||
SetupVulkanWindow(wd, surface, w, h);
|
SetupVulkanWindow(wd, surface, w, h);
|
||||||
|
|
||||||
// Setup Dear ImGui context
|
// Setup Dear ImGui context
|
||||||
@ -441,18 +443,18 @@ int main(int, char**)
|
|||||||
done = true;
|
done = true;
|
||||||
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED && event.window.windowID == SDL_GetWindowID(window))
|
if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED && event.window.windowID == SDL_GetWindowID(window))
|
||||||
{
|
{
|
||||||
g_WindowData.Width = (int)event.window.data1;
|
g_SwapChainResizeWidth = (int)event.window.data1;
|
||||||
g_WindowData.Height = (int)event.window.data2;
|
g_SwapChainResizeHeight = (int)event.window.data2;
|
||||||
g_WantSwapChainRebuild = true;
|
g_SwapChainRebuild = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_WantSwapChainRebuild)
|
if (g_SwapChainRebuild)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_CreateWindowData(g_Instance, g_PhysicalDevice, g_Device, &g_WindowData, g_QueueFamily, g_Allocator, g_WindowData.Width, g_WindowData.Height, g_MinImageCount);
|
g_SwapChainRebuild = false;
|
||||||
|
ImGui_ImplVulkanH_CreateWindow(g_Instance, g_PhysicalDevice, g_Device, &g_WindowData, g_QueueFamily, g_Allocator, g_SwapChainResizeWidth, g_SwapChainResizeHeight, g_MinImageCount);
|
||||||
ImGui_ImplVulkan_SetSwapChainMinImageCount(g_MinImageCount);
|
ImGui_ImplVulkan_SetSwapChainMinImageCount(g_MinImageCount);
|
||||||
g_WindowData.FrameIndex = 0;
|
g_WindowData.FrameIndex = 0;
|
||||||
g_WantSwapChainRebuild = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start the Dear ImGui frame
|
// Start the Dear ImGui frame
|
||||||
|
@ -20,9 +20,9 @@
|
|||||||
|
|
||||||
// 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)
|
||||||
// 2019-XX-XX: *BREAKING CHANGE*: Vulkan: Added extra parameter to ImGui_ImplVulkan_RenderDrawData(). Engine/app is in charge of owning/storing 1 ImGui_ImplVulkan_FrameRenderBuffers per in-flight rendering frame. (The demo helper ImGui_ImplVulkanH_WindowData structure carries them.)
|
// 2019-XX-XX: *BREAKING CHANGE*: Vulkan: Added extra parameter to ImGui_ImplVulkan_RenderDrawData(). Engine/app is in charge of owning/storing 1 ImGui_ImplVulkan_FrameRenderBuffers per in-flight rendering frame. (The demo helper ImGui_ImplVulkanH_Window structure carries them.)
|
||||||
// 2019-XX-XX: *BREAKING CHANGE*: Vulkan: Added MinImageCount field in ImGui_ImplVulkan_InitInfo, required for initialization (was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). Added ImGui_ImplVulkan_SetSwapChainMinImageCount().
|
// 2019-XX-XX: *BREAKING CHANGE*: Vulkan: Added MinImageCount field in ImGui_ImplVulkan_InitInfo, required for initialization (was previously a hard #define IMGUI_VK_QUEUED_FRAMES 2). Added ImGui_ImplVulkan_SetSwapChainMinImageCount().
|
||||||
// 2019-XX-XX: Vulkan: Added VkInstance argument to ImGui_ImplVulkanH_CreateWindowData() optional helper.
|
// 2019-XX-XX: Vulkan: Added VkInstance argument to ImGui_ImplVulkanH_CreateWindow() optional helper.
|
||||||
// 2019-04-04: Vulkan: Avoid passing negative coordinates to vkCmdSetScissor, which debug validation layers do not like.
|
// 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-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.
|
// 2019-02-16: Vulkan: Viewport and clipping rectangles correctly using draw_data->FramebufferScale to allow retina display.
|
||||||
@ -63,9 +63,9 @@ static VkDeviceMemory g_UploadBufferMemory = VK_NULL_HANDLE;
|
|||||||
static VkBuffer g_UploadBuffer = VK_NULL_HANDLE;
|
static VkBuffer g_UploadBuffer = VK_NULL_HANDLE;
|
||||||
|
|
||||||
// Forward Declarations
|
// Forward Declarations
|
||||||
void ImGui_ImplVulkanH_DestroyFrameData(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_FrameData* fd, const VkAllocationCallbacks* allocator);
|
void ImGui_ImplVulkanH_DestroyFrame(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator);
|
||||||
void ImGui_ImplVulkanH_CreateWindowDataSwapChain(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
|
void ImGui_ImplVulkanH_CreateWindowSwapChain(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
|
||||||
void ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator);
|
void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator);
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// SHADERS
|
// SHADERS
|
||||||
@ -877,7 +877,7 @@ VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_d
|
|||||||
return VK_PRESENT_MODE_FIFO_KHR; // Always available
|
return VK_PRESENT_MODE_FIFO_KHR; // Always available
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator)
|
void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator)
|
||||||
{
|
{
|
||||||
IM_ASSERT(instance != VK_NULL_HANDLE && physical_device != VK_NULL_HANDLE && device != VK_NULL_HANDLE);
|
IM_ASSERT(instance != VK_NULL_HANDLE && physical_device != VK_NULL_HANDLE && device != VK_NULL_HANDLE);
|
||||||
(void)instance;
|
(void)instance;
|
||||||
@ -888,7 +888,7 @@ void ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(VkInstance instance, VkPhy
|
|||||||
VkResult err;
|
VkResult err;
|
||||||
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[i];
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i];
|
||||||
{
|
{
|
||||||
VkCommandPoolCreateInfo info = {};
|
VkCommandPoolCreateInfo info = {};
|
||||||
info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
@ -937,17 +937,17 @@ int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_m
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Also destroy old swap chain and in-flight frames data, if any.
|
// Also destroy old swap chain and in-flight frames data, if any.
|
||||||
void ImGui_ImplVulkanH_CreateWindowDataSwapChain(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count)
|
void ImGui_ImplVulkanH_CreateWindowSwapChain(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count)
|
||||||
{
|
{
|
||||||
VkResult err;
|
VkResult err;
|
||||||
VkSwapchainKHR old_swapchain = wd->Swapchain;
|
VkSwapchainKHR old_swapchain = wd->Swapchain;
|
||||||
err = vkDeviceWaitIdle(device);
|
err = vkDeviceWaitIdle(device);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
|
|
||||||
// We don't use ImGui_ImplVulkanH_DestroyWindowData() 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->FramesQueueSize; i++)
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
||||||
ImGui_ImplVulkanH_DestroyFrameData(instance, device, &wd->Frames[i], allocator);
|
ImGui_ImplVulkanH_DestroyFrame(instance, device, &wd->Frames[i], allocator);
|
||||||
delete[] wd->Frames;
|
delete[] wd->Frames;
|
||||||
wd->Frames = NULL;
|
wd->Frames = NULL;
|
||||||
wd->FramesQueueSize = 0;
|
wd->FramesQueueSize = 0;
|
||||||
@ -1003,7 +1003,7 @@ void ImGui_ImplVulkanH_CreateWindowDataSwapChain(VkInstance instance, VkPhysical
|
|||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
|
|
||||||
IM_ASSERT(wd->Frames == NULL);
|
IM_ASSERT(wd->Frames == NULL);
|
||||||
wd->Frames = new ImGui_ImplVulkanH_FrameData[wd->FramesQueueSize];
|
wd->Frames = new ImGui_ImplVulkanH_Frame[wd->FramesQueueSize];
|
||||||
memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->FramesQueueSize);
|
memset(wd->Frames, 0, sizeof(wd->Frames[0]) * wd->FramesQueueSize);
|
||||||
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
||||||
wd->Frames[i].Backbuffer = backbuffers[i];
|
wd->Frames[i].Backbuffer = backbuffers[i];
|
||||||
@ -1062,7 +1062,7 @@ void ImGui_ImplVulkanH_CreateWindowDataSwapChain(VkInstance instance, VkPhysical
|
|||||||
info.subresourceRange = image_range;
|
info.subresourceRange = image_range;
|
||||||
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[i];
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i];
|
||||||
info.image = fd->Backbuffer;
|
info.image = fd->Backbuffer;
|
||||||
err = vkCreateImageView(device, &info, allocator, &fd->BackbufferView);
|
err = vkCreateImageView(device, &info, allocator, &fd->BackbufferView);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
@ -1082,7 +1082,7 @@ void ImGui_ImplVulkanH_CreateWindowDataSwapChain(VkInstance instance, VkPhysical
|
|||||||
info.layers = 1;
|
info.layers = 1;
|
||||||
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_FrameData* fd = &wd->Frames[i];
|
ImGui_ImplVulkanH_Frame* fd = &wd->Frames[i];
|
||||||
attachment[0] = fd->BackbufferView;
|
attachment[0] = fd->BackbufferView;
|
||||||
err = vkCreateFramebuffer(device, &info, allocator, &fd->Framebuffer);
|
err = vkCreateFramebuffer(device, &info, allocator, &fd->Framebuffer);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
@ -1090,29 +1090,29 @@ void ImGui_ImplVulkanH_CreateWindowDataSwapChain(VkInstance instance, VkPhysical
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplVulkanH_CreateWindowData(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int width, int height, uint32_t min_image_count)
|
void ImGui_ImplVulkanH_CreateWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int width, int height, uint32_t min_image_count)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkanH_CreateWindowDataSwapChain(instance, physical_device, device, wd, allocator, width, height, min_image_count);
|
ImGui_ImplVulkanH_CreateWindowSwapChain(instance, physical_device, device, wd, allocator, width, height, min_image_count);
|
||||||
ImGui_ImplVulkanH_CreateWindowDataCommandBuffers(instance, physical_device, device, wd, queue_family, allocator);
|
ImGui_ImplVulkanH_CreateWindowCommandBuffers(instance, physical_device, device, wd, queue_family, allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplVulkanH_DestroyWindowData(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, const VkAllocationCallbacks* allocator)
|
void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator)
|
||||||
{
|
{
|
||||||
vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals)
|
vkDeviceWaitIdle(device); // FIXME: We could wait on the Queue if we had the queue in wd-> (otherwise VulkanH functions can't use globals)
|
||||||
//vkQueueWaitIdle(g_Queue);
|
//vkQueueWaitIdle(g_Queue);
|
||||||
|
|
||||||
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
for (uint32_t i = 0; i < wd->FramesQueueSize; i++)
|
||||||
ImGui_ImplVulkanH_DestroyFrameData(instance, device, &wd->Frames[i], allocator);
|
ImGui_ImplVulkanH_DestroyFrame(instance, device, &wd->Frames[i], allocator);
|
||||||
delete[] wd->Frames;
|
delete[] wd->Frames;
|
||||||
wd->Frames = NULL;
|
wd->Frames = NULL;
|
||||||
vkDestroyRenderPass(device, wd->RenderPass, allocator);
|
vkDestroyRenderPass(device, wd->RenderPass, allocator);
|
||||||
vkDestroySwapchainKHR(device, wd->Swapchain, allocator);
|
vkDestroySwapchainKHR(device, wd->Swapchain, allocator);
|
||||||
vkDestroySurfaceKHR(instance, wd->Surface, allocator);
|
vkDestroySurfaceKHR(instance, wd->Surface, allocator);
|
||||||
|
|
||||||
*wd = ImGui_ImplVulkanH_WindowData();
|
*wd = ImGui_ImplVulkanH_Window();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImGui_ImplVulkanH_DestroyFrameData(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_FrameData* fd, const VkAllocationCallbacks* allocator)
|
void ImGui_ImplVulkanH_DestroyFrame(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator)
|
||||||
{
|
{
|
||||||
(void)instance;
|
(void)instance;
|
||||||
vkDestroyFence(device, fd->Fence, allocator);
|
vkDestroyFence(device, fd->Fence, allocator);
|
||||||
|
@ -26,16 +26,16 @@
|
|||||||
// [Please zero-clear before use!]
|
// [Please zero-clear before use!]
|
||||||
struct ImGui_ImplVulkan_InitInfo
|
struct ImGui_ImplVulkan_InitInfo
|
||||||
{
|
{
|
||||||
VkInstance Instance;
|
VkInstance Instance;
|
||||||
VkPhysicalDevice PhysicalDevice;
|
VkPhysicalDevice PhysicalDevice;
|
||||||
VkDevice Device;
|
VkDevice Device;
|
||||||
uint32_t QueueFamily;
|
uint32_t QueueFamily;
|
||||||
VkQueue Queue;
|
VkQueue Queue;
|
||||||
VkPipelineCache PipelineCache;
|
VkPipelineCache PipelineCache;
|
||||||
VkDescriptorPool DescriptorPool;
|
VkDescriptorPool DescriptorPool;
|
||||||
int MinImageCount; // >= 2
|
int MinImageCount; // >= 2
|
||||||
const VkAllocationCallbacks* Allocator;
|
const VkAllocationCallbacks* Allocator;
|
||||||
void (*CheckVkResultFn)(VkResult err);
|
void (*CheckVkResultFn)(VkResult err);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Reusable buffers used for rendering by current in-flight frame, for ImGui_ImplVulkan_RenderDrawData()
|
// Reusable buffers used for rendering by current in-flight frame, for ImGui_ImplVulkan_RenderDrawData()
|
||||||
@ -83,19 +83,20 @@ IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyDeviceObjects();
|
|||||||
// (The ImGui_ImplVulkanH_XXX functions do not interact with any of the state used by the regular ImGui_ImplVulkan_XXX functions)
|
// (The ImGui_ImplVulkanH_XXX functions do not interact with any of the state used by the regular ImGui_ImplVulkan_XXX functions)
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
struct ImGui_ImplVulkanH_FrameData;
|
struct ImGui_ImplVulkanH_Frame;
|
||||||
struct ImGui_ImplVulkanH_WindowData;
|
struct ImGui_ImplVulkanH_Window;
|
||||||
|
|
||||||
IMGUI_IMPL_API void ImGui_ImplVulkanH_CreateWindowData(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
|
// Helpers
|
||||||
IMGUI_IMPL_API void ImGui_ImplVulkanH_DestroyWindowData(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_WindowData* wd, const VkAllocationCallbacks* allocator);
|
IMGUI_IMPL_API void ImGui_ImplVulkanH_CreateWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wnd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui_ImplVulkanH_Window* wnd, const VkAllocationCallbacks* allocator);
|
||||||
IMGUI_IMPL_API VkSurfaceFormatKHR ImGui_ImplVulkanH_SelectSurfaceFormat(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkFormat* request_formats, int request_formats_count, VkColorSpaceKHR request_color_space);
|
IMGUI_IMPL_API VkSurfaceFormatKHR ImGui_ImplVulkanH_SelectSurfaceFormat(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkFormat* request_formats, int request_formats_count, VkColorSpaceKHR request_color_space);
|
||||||
IMGUI_IMPL_API VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkPresentModeKHR* request_modes, int request_modes_count);
|
IMGUI_IMPL_API VkPresentModeKHR ImGui_ImplVulkanH_SelectPresentMode(VkPhysicalDevice physical_device, VkSurfaceKHR surface, const VkPresentModeKHR* request_modes, int request_modes_count);
|
||||||
IMGUI_IMPL_API int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_mode);
|
IMGUI_IMPL_API int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_mode);
|
||||||
|
|
||||||
// Helper structure to hold the data needed by one rendering frame
|
// Helper structure to hold the data needed by one rendering frame
|
||||||
// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own app.)
|
// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.)
|
||||||
// [Please zero-clear before use!]
|
// [Please zero-clear before use!]
|
||||||
struct ImGui_ImplVulkanH_FrameData
|
struct ImGui_ImplVulkanH_Frame
|
||||||
{
|
{
|
||||||
VkCommandPool CommandPool;
|
VkCommandPool CommandPool;
|
||||||
VkCommandBuffer CommandBuffer;
|
VkCommandBuffer CommandBuffer;
|
||||||
@ -109,8 +110,8 @@ struct ImGui_ImplVulkanH_FrameData
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Helper structure to hold the data needed by one rendering context into one OS window
|
// Helper structure to hold the data needed by one rendering context into one OS window
|
||||||
// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own app.)
|
// (Used by example's main.cpp. Used by multi-viewport features. Probably NOT used by your own engine/app.)
|
||||||
struct ImGui_ImplVulkanH_WindowData
|
struct ImGui_ImplVulkanH_Window
|
||||||
{
|
{
|
||||||
int Width;
|
int Width;
|
||||||
int Height;
|
int Height;
|
||||||
@ -123,9 +124,9 @@ struct ImGui_ImplVulkanH_WindowData
|
|||||||
VkClearValue ClearValue;
|
VkClearValue ClearValue;
|
||||||
uint32_t FrameIndex; // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount)
|
uint32_t FrameIndex; // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount)
|
||||||
uint32_t FramesQueueSize; // Number of simultaneous in-flight frames (returned by vkGetSwapchainImagesKHR, usually derived from min_image_count)
|
uint32_t FramesQueueSize; // Number of simultaneous in-flight frames (returned by vkGetSwapchainImagesKHR, usually derived from min_image_count)
|
||||||
ImGui_ImplVulkanH_FrameData* Frames;
|
ImGui_ImplVulkanH_Frame* Frames;
|
||||||
|
|
||||||
ImGui_ImplVulkanH_WindowData()
|
ImGui_ImplVulkanH_Window()
|
||||||
{
|
{
|
||||||
memset(this, 0, sizeof(*this));
|
memset(this, 0, sizeof(*this));
|
||||||
PresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
|
PresentMode = VK_PRESENT_MODE_MAX_ENUM_KHR;
|
||||||
|
Loading…
Reference in New Issue
Block a user