|
@@ -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
|