mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-10-26 12:27:30 +00:00 
			
		
		
		
	Backends: Vulkan: Added support for ImTextureID as VkDescriptorSet, add ImGui_ImplVulkan_AddTexture(). (#914)
This commit is contained in:
		| @@ -87,7 +87,6 @@ struct ImGui_ImplVulkan_Data | ||||
|     VkPipelineCreateFlags       PipelineCreateFlags; | ||||
|     VkDescriptorSetLayout       DescriptorSetLayout; | ||||
|     VkPipelineLayout            PipelineLayout; | ||||
|     VkDescriptorSet             DescriptorSet; | ||||
|     VkPipeline                  Pipeline; | ||||
|     uint32_t                    Subpass; | ||||
|     VkShaderModule              ShaderModuleVert; | ||||
| @@ -98,6 +97,7 @@ struct ImGui_ImplVulkan_Data | ||||
|     VkDeviceMemory              FontMemory; | ||||
|     VkImage                     FontImage; | ||||
|     VkImageView                 FontView; | ||||
|     VkDescriptorSet             FontDescriptorSet; | ||||
|     VkDeviceMemory              UploadBufferMemory; | ||||
|     VkBuffer                    UploadBuffer; | ||||
|  | ||||
| @@ -376,11 +376,9 @@ static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline | ||||
| { | ||||
|     ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); | ||||
|  | ||||
|     // Bind pipeline and descriptor sets: | ||||
|     // Bind pipeline: | ||||
|     { | ||||
|         vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); | ||||
|         VkDescriptorSet desc_set[1] = { bd->DescriptorSet }; | ||||
|         vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bd->PipelineLayout, 0, 1, desc_set, 0, NULL); | ||||
|     } | ||||
|  | ||||
|     // Bind Vertex And Index Buffer: | ||||
| @@ -531,6 +529,10 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer comm | ||||
|                 scissor.extent.height = (uint32_t)(clip_max.y - clip_min.y); | ||||
|                 vkCmdSetScissor(command_buffer, 0, 1, &scissor); | ||||
|  | ||||
|                 // Bind DescriptorSet with font or user texture | ||||
|                 VkDescriptorSet desc_set[1] = { (VkDescriptorSet)pcmd->TextureId }; | ||||
|                 vkCmdBindDescriptorSets(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, bd->PipelineLayout, 0, 1, desc_set, 0, NULL); | ||||
|  | ||||
|                 // Draw | ||||
|                 vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0); | ||||
|             } | ||||
| @@ -607,20 +609,8 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) | ||||
|         check_vk_result(err); | ||||
|     } | ||||
|  | ||||
|     // Update the Descriptor Set: | ||||
|     { | ||||
|         VkDescriptorImageInfo desc_image[1] = {}; | ||||
|         desc_image[0].sampler = bd->FontSampler; | ||||
|         desc_image[0].imageView = bd->FontView; | ||||
|         desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; | ||||
|         VkWriteDescriptorSet write_desc[1] = {}; | ||||
|         write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; | ||||
|         write_desc[0].dstSet = bd->DescriptorSet; | ||||
|         write_desc[0].descriptorCount = 1; | ||||
|         write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; | ||||
|         write_desc[0].pImageInfo = desc_image; | ||||
|         vkUpdateDescriptorSets(v->Device, 1, write_desc, 0, NULL); | ||||
|     } | ||||
|     // Create the Descriptor Set: | ||||
|     bd->FontDescriptorSet = (VkDescriptorSet)ImGui_ImplVulkan_AddTexture(bd->FontSampler, bd->FontView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL); | ||||
|  | ||||
|     // Create the Upload Buffer: | ||||
|     { | ||||
| @@ -698,7 +688,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer) | ||||
|     } | ||||
|  | ||||
|     // Store our identifier | ||||
|     io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontImage); | ||||
|     io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontDescriptorSet); | ||||
|  | ||||
|     return true; | ||||
| } | ||||
| @@ -937,17 +927,6 @@ bool ImGui_ImplVulkan_CreateDeviceObjects() | ||||
|         check_vk_result(err); | ||||
|     } | ||||
|  | ||||
|     // Create Descriptor Set: | ||||
|     { | ||||
|         VkDescriptorSetAllocateInfo alloc_info = {}; | ||||
|         alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; | ||||
|         alloc_info.descriptorPool = v->DescriptorPool; | ||||
|         alloc_info.descriptorSetCount = 1; | ||||
|         alloc_info.pSetLayouts = &bd->DescriptorSetLayout; | ||||
|         err = vkAllocateDescriptorSets(v->Device, &alloc_info, &bd->DescriptorSet); | ||||
|         check_vk_result(err); | ||||
|     } | ||||
|  | ||||
|     if (!bd->PipelineLayout) | ||||
|     { | ||||
|         // Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix | ||||
| @@ -1090,6 +1069,41 @@ void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count) | ||||
|     bd->VulkanInitInfo.MinImageCount = min_image_count; | ||||
| } | ||||
|  | ||||
| // Register a texture | ||||
| // FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem, please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions. | ||||
| ImTextureID ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout) | ||||
| { | ||||
|     ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); | ||||
|     ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; | ||||
|  | ||||
|     // Create Descriptor Set: | ||||
|     VkDescriptorSet descriptor_set; | ||||
|     { | ||||
|         VkDescriptorSetAllocateInfo alloc_info = {}; | ||||
|         alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; | ||||
|         alloc_info.descriptorPool = v->DescriptorPool; | ||||
|         alloc_info.descriptorSetCount = 1; | ||||
|         alloc_info.pSetLayouts = &bd->DescriptorSetLayout; | ||||
|         VkResult err = vkAllocateDescriptorSets(v->Device, &alloc_info, &descriptor_set); | ||||
|         check_vk_result(err); | ||||
|     } | ||||
|  | ||||
|     // Update the Descriptor Set: | ||||
|     { | ||||
|         VkDescriptorImageInfo desc_image[1] = {}; | ||||
|         desc_image[0].sampler = sampler; | ||||
|         desc_image[0].imageView = image_view; | ||||
|         desc_image[0].imageLayout = image_layout; | ||||
|         VkWriteDescriptorSet write_desc[1] = {}; | ||||
|         write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; | ||||
|         write_desc[0].dstSet = descriptor_set; | ||||
|         write_desc[0].descriptorCount = 1; | ||||
|         write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; | ||||
|         write_desc[0].pImageInfo = desc_image; | ||||
|         vkUpdateDescriptorSets(v->Device, 1, write_desc, 0, NULL); | ||||
|     } | ||||
|     return (ImTextureID)descriptor_set; | ||||
| } | ||||
|  | ||||
| //------------------------------------------------------------------------- | ||||
| // Internal / Miscellaneous Vulkan Helpers | ||||
|   | ||||
| @@ -70,6 +70,10 @@ IMGUI_IMPL_API bool     ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer comm | ||||
| IMGUI_IMPL_API void     ImGui_ImplVulkan_DestroyFontUploadObjects(); | ||||
| IMGUI_IMPL_API void     ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count); // To override MinImageCount after initialization (e.g. if swap chain is recreated) | ||||
|  | ||||
| // Register a texture (VkDescriptorSet == ImTextureID) | ||||
| // FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem, please post to https://github.com/ocornut/imgui/pull/914 if you have suggestions. | ||||
| IMGUI_IMPL_API ImTextureID  ImGui_ImplVulkan_AddTexture(VkSampler sampler, VkImageView image_view, VkImageLayout image_layout); | ||||
|  | ||||
| // Optional: load Vulkan functions with a custom function loader | ||||
| // This is only useful with IMGUI_IMPL_VULKAN_NO_PROTOTYPES / VK_NO_PROTOTYPES | ||||
| IMGUI_IMPL_API bool     ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data = NULL); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Marcell Kiss
					Marcell Kiss