mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Backends: Vulkan: Removed unused shader code. Fix leaks. Avoid unnecessary pipeline creation for main viewport. Amend 41e2aa2. (#3459)
				
					
				
			This commit is contained in:
		| @@ -676,7 +676,7 @@ static void ImGui_ImplVulkan_CreatePipelineLayout(VkDevice device, const VkAlloc | ||||
|     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); | ||||
|  | ||||
| @@ -784,24 +784,6 @@ bool ImGui_ImplVulkan_CreateDeviceObjects() | ||||
| { | ||||
|     ImGui_ImplVulkan_InitInfo* v = &g_VulkanInitInfo; | ||||
|     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) | ||||
|     { | ||||
| @@ -867,9 +849,6 @@ bool ImGui_ImplVulkan_CreateDeviceObjects() | ||||
|  | ||||
|     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; | ||||
| } | ||||
|  | ||||
| @@ -894,6 +873,8 @@ void    ImGui_ImplVulkan_DestroyDeviceObjects() | ||||
|     ImGui_ImplVulkanH_DestroyWindowRenderBuffers(v->Device, &g_MainWindowRenderBuffers, v->Allocator); | ||||
|     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_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; } | ||||
| @@ -1210,7 +1191,10 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V | ||||
|         info.pDependencies = &dependency; | ||||
|         err = vkCreateRenderPass(device, &info, allocator, &wd->RenderPass); | ||||
|         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 | ||||
| @@ -1277,6 +1261,7 @@ void ImGui_ImplVulkanH_DestroyWindow(VkInstance instance, VkDevice device, ImGui | ||||
|     IM_FREE(wd->FrameSemaphores); | ||||
|     wd->Frames = NULL; | ||||
|     wd->FrameSemaphores = NULL; | ||||
|     vkDestroyPipeline(device, wd->Pipeline, allocator); | ||||
|     vkDestroyRenderPass(device, wd->RenderPass, allocator); | ||||
|     vkDestroySwapchainKHR(device, wd->Swapchain, allocator); | ||||
|     vkDestroySurfaceKHR(instance, wd->Surface, allocator); | ||||
|   | ||||
| @@ -108,7 +108,7 @@ struct ImGui_ImplVulkanH_Window | ||||
|     VkSurfaceFormatKHR  SurfaceFormat; | ||||
|     VkPresentModeKHR    PresentMode; | ||||
|     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; | ||||
|     VkClearValue        ClearValue; | ||||
|     uint32_t            FrameIndex;             // Current frame being rendered to (0 <= FrameIndex < FrameInFlightCount) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 omar
					omar