@ -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 - > Font Image ) ;
io . Fonts - > SetTexID ( ( ImTextureID ) ( intptr_t ) bd - > Font DescriptorSet ) ;
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