mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 01:34:32 +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;
 | 
					    VkPipelineCreateFlags       PipelineCreateFlags;
 | 
				
			||||||
    VkDescriptorSetLayout       DescriptorSetLayout;
 | 
					    VkDescriptorSetLayout       DescriptorSetLayout;
 | 
				
			||||||
    VkPipelineLayout            PipelineLayout;
 | 
					    VkPipelineLayout            PipelineLayout;
 | 
				
			||||||
    VkDescriptorSet             DescriptorSet;
 | 
					 | 
				
			||||||
    VkPipeline                  Pipeline;
 | 
					    VkPipeline                  Pipeline;
 | 
				
			||||||
    uint32_t                    Subpass;
 | 
					    uint32_t                    Subpass;
 | 
				
			||||||
    VkShaderModule              ShaderModuleVert;
 | 
					    VkShaderModule              ShaderModuleVert;
 | 
				
			||||||
@@ -98,6 +97,7 @@ struct ImGui_ImplVulkan_Data
 | 
				
			|||||||
    VkDeviceMemory              FontMemory;
 | 
					    VkDeviceMemory              FontMemory;
 | 
				
			||||||
    VkImage                     FontImage;
 | 
					    VkImage                     FontImage;
 | 
				
			||||||
    VkImageView                 FontView;
 | 
					    VkImageView                 FontView;
 | 
				
			||||||
 | 
					    VkDescriptorSet             FontDescriptorSet;
 | 
				
			||||||
    VkDeviceMemory              UploadBufferMemory;
 | 
					    VkDeviceMemory              UploadBufferMemory;
 | 
				
			||||||
    VkBuffer                    UploadBuffer;
 | 
					    VkBuffer                    UploadBuffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -376,11 +376,9 @@ static void ImGui_ImplVulkan_SetupRenderState(ImDrawData* draw_data, VkPipeline
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
 | 
					    ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Bind pipeline and descriptor sets:
 | 
					    // Bind pipeline:
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        vkCmdBindPipeline(command_buffer, VK_PIPELINE_BIND_POINT_GRAPHICS, 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:
 | 
					    // 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);
 | 
					                scissor.extent.height = (uint32_t)(clip_max.y - clip_min.y);
 | 
				
			||||||
                vkCmdSetScissor(command_buffer, 0, 1, &scissor);
 | 
					                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
 | 
					                // Draw
 | 
				
			||||||
                vkCmdDrawIndexed(command_buffer, pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0);
 | 
					                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);
 | 
					        check_vk_result(err);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Update the Descriptor Set:
 | 
					    // Create the Descriptor Set:
 | 
				
			||||||
    {
 | 
					    bd->FontDescriptorSet = (VkDescriptorSet)ImGui_ImplVulkan_AddTexture(bd->FontSampler, bd->FontView, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
 | 
				
			||||||
        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 Upload Buffer:
 | 
					    // Create the Upload Buffer:
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -698,7 +688,7 @@ bool ImGui_ImplVulkan_CreateFontsTexture(VkCommandBuffer command_buffer)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Store our identifier
 | 
					    // Store our identifier
 | 
				
			||||||
    io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontImage);
 | 
					    io.Fonts->SetTexID((ImTextureID)(intptr_t)bd->FontDescriptorSet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -937,17 +927,6 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
 | 
				
			|||||||
        check_vk_result(err);
 | 
					        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)
 | 
					    if (!bd->PipelineLayout)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        // Constants: we are using 'vec2 offset' and 'vec2 scale' instead of a full 3d projection matrix
 | 
					        // 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;
 | 
					    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
 | 
					// 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_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)
 | 
					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
 | 
					// Optional: load Vulkan functions with a custom function loader
 | 
				
			||||||
// This is only useful with IMGUI_IMPL_VULKAN_NO_PROTOTYPES / VK_NO_PROTOTYPES
 | 
					// 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);
 | 
					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