mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 09:44:29 +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:
		@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user