mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 09:27:00 +00:00
Backends: Vulkan: Removed unused shader code. Fix leaks. Avoid unnecessary pipeline creation for main viewport. Amend 41e2aa2
. (#3459) + Add ImGui_ImplVulkanH_CreateWindowSwapChain in ImGui_ImplVulkanH_CreateOrResizeWindow().
This commit is contained in:
parent
78f753ffff
commit
770c995365
@ -693,7 +693,7 @@ static void ImGui_ImplVulkan_CreatePipelineLayout(VkDevice device, const VkAlloc
|
|||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, VkPipeline *pipeline)
|
static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, VkPipeline* pipeline)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkan_CreateShaderModules(device, allocator);
|
ImGui_ImplVulkan_CreateShaderModules(device, allocator);
|
||||||
|
|
||||||
@ -801,24 +801,6 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|||||||
{
|
{
|
||||||
ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo;
|
||||||
VkResult err;
|
VkResult err;
|
||||||
VkShaderModule vert_module;
|
|
||||||
VkShaderModule frag_module;
|
|
||||||
|
|
||||||
// Create The Shader Modules:
|
|
||||||
{
|
|
||||||
VkShaderModuleCreateInfo vert_info = {};
|
|
||||||
vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
||||||
vert_info.codeSize = sizeof(__glsl_shader_vert_spv);
|
|
||||||
vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;
|
|
||||||
err = vkCreateShaderModule(v->Device, &vert_info, v->Allocator, &vert_module);
|
|
||||||
check_vk_result(err);
|
|
||||||
VkShaderModuleCreateInfo frag_info = {};
|
|
||||||
frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
||||||
frag_info.codeSize = sizeof(__glsl_shader_frag_spv);
|
|
||||||
frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;
|
|
||||||
err = vkCreateShaderModule(v->Device, &frag_info, v->Allocator, &frag_module);
|
|
||||||
check_vk_result(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!g_FontSampler)
|
if (!g_FontSampler)
|
||||||
{
|
{
|
||||||
@ -884,9 +866,6 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|||||||
|
|
||||||
ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, g_RenderPass, v->MSAASamples, &g_Pipeline);
|
ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, g_RenderPass, v->MSAASamples, &g_Pipeline);
|
||||||
|
|
||||||
vkDestroyShaderModule(v->Device, vert_module, v->Allocator);
|
|
||||||
vkDestroyShaderModule(v->Device, frag_module, v->Allocator);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -911,6 +890,8 @@ void ImGui_ImplVulkan_DestroyDeviceObjects()
|
|||||||
ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(v->Device, v->Allocator);
|
ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(v->Device, v->Allocator);
|
||||||
ImGui_ImplVulkan_DestroyFontUploadObjects();
|
ImGui_ImplVulkan_DestroyFontUploadObjects();
|
||||||
|
|
||||||
|
if (g_ShaderModuleVert) { vkDestroyShaderModule(v->Device, g_ShaderModuleVert, v->Allocator); g_ShaderModuleVert = VK_NULL_HANDLE; }
|
||||||
|
if (g_ShaderModuleFrag) { vkDestroyShaderModule(v->Device, g_ShaderModuleFrag, v->Allocator); g_ShaderModuleFrag = VK_NULL_HANDLE; }
|
||||||
if (g_FontView) { vkDestroyImageView(v->Device, g_FontView, v->Allocator); g_FontView = VK_NULL_HANDLE; }
|
if (g_FontView) { vkDestroyImageView(v->Device, g_FontView, v->Allocator); g_FontView = VK_NULL_HANDLE; }
|
||||||
if (g_FontImage) { vkDestroyImage(v->Device, g_FontImage, v->Allocator); g_FontImage = VK_NULL_HANDLE; }
|
if (g_FontImage) { vkDestroyImage(v->Device, g_FontImage, v->Allocator); g_FontImage = VK_NULL_HANDLE; }
|
||||||
if (g_FontMemory) { vkFreeMemory(v->Device, g_FontMemory, v->Allocator); g_FontMemory = VK_NULL_HANDLE; }
|
if (g_FontMemory) { vkFreeMemory(v->Device, g_FontMemory, v->Allocator); g_FontMemory = VK_NULL_HANDLE; }
|
||||||
@ -1247,7 +1228,10 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
|
|||||||
info.pDependencies = &dependency;
|
info.pDependencies = &dependency;
|
||||||
err = vkCreateRenderPass(device, &info, allocator, &wd->RenderPass);
|
err = vkCreateRenderPass(device, &info, allocator, &wd->RenderPass);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline);
|
|
||||||
|
// We do not create a pipeline by default as this is also used by examples' main.cpp,
|
||||||
|
// but secondary viewport in multi-viewport mode may want to create one with:
|
||||||
|
//ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create The Image Views
|
// Create The Image Views
|
||||||
@ -1297,6 +1281,7 @@ void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevic
|
|||||||
{
|
{
|
||||||
(void)instance;
|
(void)instance;
|
||||||
ImGui_ImplVulkanH_CreateWindowSwapChain(physical_device, device, wd, allocator, width, height, min_image_count);
|
ImGui_ImplVulkanH_CreateWindowSwapChain(physical_device, device, wd, allocator, width, height, min_image_count);
|
||||||
|
ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline);
|
||||||
ImGui_ImplVulkanH_CreateWindowCommandBuffers(physical_device, device, wd, queue_family, allocator);
|
ImGui_ImplVulkanH_CreateWindowCommandBuffers(physical_device, device, wd, queue_family, allocator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1314,6 +1299,7 @@ void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui
|
|||||||
IM_FREE(wd->FrameSemaphores);
|
IM_FREE(wd->FrameSemaphores);
|
||||||
wd->Frames = NULL;
|
wd->Frames = NULL;
|
||||||
wd->FrameSemaphores = NULL;
|
wd->FrameSemaphores = NULL;
|
||||||
|
vkDestroyPipeline(device, wd->Pipeline, allocator);
|
||||||
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);
|
||||||
|
@ -109,7 +109,7 @@ struct ImGui_ImplVulkanH_Window
|
|||||||
VkSurfaceFormatKHR SurfaceFormat;
|
VkSurfaceFormatKHR SurfaceFormat;
|
||||||
VkPresentModeKHR PresentMode;
|
VkPresentModeKHR PresentMode;
|
||||||
VkRenderPass RenderPass;
|
VkRenderPass RenderPass;
|
||||||
VkPipeline Pipeline; // The window pipeline uses a different VkRenderPass than the user's
|
VkPipeline Pipeline; // The window pipeline may uses a different VkRenderPass than the one passed in ImGui_ImplVulkan_InitInfo
|
||||||
bool ClearEnable;
|
bool ClearEnable;
|
||||||
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)
|
||||||
|
Loading…
Reference in New Issue
Block a user