mirror of
https://github.com/ocornut/imgui.git
synced 2025-02-25 22:38:10 +01:00
Vulkan: Re-Create main window pipeline
- Added ImGui_ImplVulkan_ReCreateMainPipeline(...) to explicitly re-create the main window pipeline (when some of its properties are changed). - ImGui_ImplVulkan_ReCreateMainPipeline(...) does not implicitly use ImGui_ImplVulkan_InitInfo::PipelineRenderingCreateInfo, but a function parameter. - The main window pipeline is created only if possible during ImGui_ImplVulkan_Init(...) (if a render pass or rendering info are given), else it should be created with ImGui_ImplVulkan_ReCreateMainPipeline(...) - ImGui_ImplVulkan_CreatePipeline now takes a struct rather than (too) many parameters (and returns the created pipeline).
This commit is contained in:
parent
ccb6646bae
commit
494807af73
@ -857,10 +857,21 @@ static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAlloca
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, VkPipeline* pipeline, uint32_t subpass)
|
struct ImGui_ImplVulkan_PipelineCreateInfo
|
||||||
|
{
|
||||||
|
VkDevice Device = VK_NULL_HANDLE;
|
||||||
|
const VkAllocationCallbacks* Allocator = nullptr;
|
||||||
|
VkPipelineCache PipelineCache = VK_NULL_HANDLE;
|
||||||
|
VkRenderPass RenderPass = VK_NULL_HANDLE;
|
||||||
|
uint32_t Subpass = 0;
|
||||||
|
VkSampleCountFlagBits MSAASamples = {};
|
||||||
|
const ImGui_ImplVulkan_PipelineRenderingInfo* pRenderingInfo = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
static VkPipeline ImGui_ImplVulkan_CreatePipeline(ImGui_ImplVulkan_PipelineCreateInfo const& pci)
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
||||||
ImGui_ImplVulkan_CreateShaderModules(device, allocator);
|
ImGui_ImplVulkan_CreateShaderModules(pci.Device, pci.Allocator);
|
||||||
|
|
||||||
VkPipelineShaderStageCreateInfo stage[2] = {};
|
VkPipelineShaderStageCreateInfo stage[2] = {};
|
||||||
stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
stage[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||||
@ -915,7 +926,7 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC
|
|||||||
|
|
||||||
VkPipelineMultisampleStateCreateInfo ms_info = {};
|
VkPipelineMultisampleStateCreateInfo ms_info = {};
|
||||||
ms_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
ms_info.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
|
||||||
ms_info.rasterizationSamples = (MSAASamples != 0) ? MSAASamples : VK_SAMPLE_COUNT_1_BIT;
|
ms_info.rasterizationSamples = (pci.MSAASamples != 0) ? pci.MSAASamples : VK_SAMPLE_COUNT_1_BIT;
|
||||||
|
|
||||||
VkPipelineColorBlendAttachmentState color_attachment[1] = {};
|
VkPipelineColorBlendAttachmentState color_attachment[1] = {};
|
||||||
color_attachment[0].blendEnable = VK_TRUE;
|
color_attachment[0].blendEnable = VK_TRUE;
|
||||||
@ -955,21 +966,22 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC
|
|||||||
info.pColorBlendState = &blend_info;
|
info.pColorBlendState = &blend_info;
|
||||||
info.pDynamicState = &dynamic_state;
|
info.pDynamicState = &dynamic_state;
|
||||||
info.layout = bd->PipelineLayout;
|
info.layout = bd->PipelineLayout;
|
||||||
info.renderPass = renderPass;
|
info.renderPass = pci.RenderPass;
|
||||||
info.subpass = subpass;
|
info.subpass = pci.Subpass;
|
||||||
|
|
||||||
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||||
if (bd->VulkanInitInfo.UseDynamicRendering)
|
if (bd->VulkanInitInfo.UseDynamicRendering)
|
||||||
{
|
{
|
||||||
IM_ASSERT(bd->VulkanInitInfo.PipelineRenderingCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR && "PipelineRenderingCreateInfo sType must be VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR");
|
|
||||||
IM_ASSERT(bd->VulkanInitInfo.PipelineRenderingCreateInfo.pNext == nullptr && "PipelineRenderingCreateInfo pNext must be NULL");
|
|
||||||
info.pNext = &bd->VulkanInitInfo.PipelineRenderingCreateInfo;
|
|
||||||
info.renderPass = VK_NULL_HANDLE; // Just make sure it's actually nullptr.
|
info.renderPass = VK_NULL_HANDLE; // Just make sure it's actually nullptr.
|
||||||
|
IM_ASSERT(pci.pRenderingInfo->sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR && "PipelineRenderingCreateInfo::sType must be VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR");
|
||||||
|
IM_ASSERT(pci.pRenderingInfo->pNext == nullptr && "PipelineRenderingCreateInfo::pNext must be NULL");
|
||||||
|
info.pNext = pci.pRenderingInfo;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
VkPipeline res;
|
||||||
VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, pipeline);
|
VkResult err = vkCreateGraphicsPipelines(pci.Device, pci.PipelineCache, 1, &info, pci.Allocator, &res);
|
||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImGui_ImplVulkan_CreateDeviceObjects()
|
bool ImGui_ImplVulkan_CreateDeviceObjects()
|
||||||
@ -1028,11 +1040,43 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|||||||
check_vk_result(err);
|
check_vk_result(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, v->RenderPass, v->MSAASamples, &bd->Pipeline, v->Subpass);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ImGui_ImplVulkan_ReCreateMainPipeline(ImGui_ImplVulkan_MainPipelineCreateInfo const& info)
|
||||||
|
{
|
||||||
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
||||||
|
ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
||||||
|
if (bd->Pipeline)
|
||||||
|
{
|
||||||
|
vkDestroyPipeline(v->Device, bd->Pipeline, v->Allocator);
|
||||||
|
bd->Pipeline = VK_NULL_HANDLE;
|
||||||
|
}
|
||||||
|
v->RenderPass = info.RenderPass;
|
||||||
|
v->MSAASamples = info.MSAASamples;
|
||||||
|
v->Subpass = info.Subpass;
|
||||||
|
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||||
|
if (info.pDynamicRendering)
|
||||||
|
{
|
||||||
|
v->PipelineRenderingCreateInfo = *info.pDynamicRendering;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
IM_ASSERT(p_dynamic_rendering == nullptr);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ImGui_ImplVulkan_PipelineCreateInfo pci;
|
||||||
|
pci.Device = v->Device;
|
||||||
|
pci.Allocator = v->Allocator;
|
||||||
|
pci.PipelineCache = v->PipelineCache;
|
||||||
|
pci.RenderPass = v->RenderPass;
|
||||||
|
pci.Subpass = v->Subpass;
|
||||||
|
pci.MSAASamples = v->MSAASamples;
|
||||||
|
pci.pRenderingInfo = info.pDynamicRendering;
|
||||||
|
|
||||||
|
bd->Pipeline = ImGui_ImplVulkan_CreatePipeline(pci);
|
||||||
|
}
|
||||||
|
|
||||||
void ImGui_ImplVulkan_DestroyDeviceObjects()
|
void ImGui_ImplVulkan_DestroyDeviceObjects()
|
||||||
{
|
{
|
||||||
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
||||||
@ -1113,13 +1157,44 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info)
|
|||||||
IM_ASSERT(info->DescriptorPool != VK_NULL_HANDLE);
|
IM_ASSERT(info->DescriptorPool != VK_NULL_HANDLE);
|
||||||
IM_ASSERT(info->MinImageCount >= 2);
|
IM_ASSERT(info->MinImageCount >= 2);
|
||||||
IM_ASSERT(info->ImageCount >= info->MinImageCount);
|
IM_ASSERT(info->ImageCount >= info->MinImageCount);
|
||||||
if (info->UseDynamicRendering == false)
|
//if (info->UseDynamicRendering == false)
|
||||||
IM_ASSERT(info->RenderPass != VK_NULL_HANDLE);
|
// IM_ASSERT(info->RenderPass != VK_NULL_HANDLE);
|
||||||
|
|
||||||
bd->VulkanInitInfo = *info;
|
ImGui_ImplVulkan_InitInfo * v = &bd->VulkanInitInfo;
|
||||||
|
*v = *info;
|
||||||
|
|
||||||
ImGui_ImplVulkan_CreateDeviceObjects();
|
ImGui_ImplVulkan_CreateDeviceObjects();
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
bool create_pipeline = false;
|
||||||
|
const ImGui_ImplVulkan_PipelineRenderingInfo * p_dynamic_rendering = nullptr;
|
||||||
|
if (v->RenderPass)
|
||||||
|
{
|
||||||
|
create_pipeline = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||||
|
if (v->UseDynamicRendering && v->PipelineRenderingCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR)
|
||||||
|
{
|
||||||
|
p_dynamic_rendering = &v->PipelineRenderingCreateInfo;
|
||||||
|
create_pipeline = true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (create_pipeline)
|
||||||
|
{
|
||||||
|
ImGui_ImplVulkan_MainPipelineCreateInfo mp_info = {};
|
||||||
|
mp_info.RenderPass = v->RenderPass;
|
||||||
|
mp_info.Subpass = v->Subpass;
|
||||||
|
mp_info.MSAASamples = info->MSAASamples;
|
||||||
|
mp_info.pDynamicRendering = p_dynamic_rendering;
|
||||||
|
|
||||||
|
ImGui_ImplVulkan_ReCreateMainPipeline(mp_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,6 +61,12 @@
|
|||||||
#define IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
#define IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
||||||
|
typedef VkPipelineRenderingCreateInfoKHR ImGui_ImplVulkan_PipelineRenderingInfo;
|
||||||
|
#else
|
||||||
|
typedef void ImGui_ImplVulkan_PipelineRenderingInfo;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Initialization data, for ImGui_ImplVulkan_Init()
|
// Initialization data, for ImGui_ImplVulkan_Init()
|
||||||
// - VkDescriptorPool should be created with VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
|
// - VkDescriptorPool should be created with VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT,
|
||||||
// and must contain a pool size large enough to hold an ImGui VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER descriptor.
|
// and must contain a pool size large enough to hold an ImGui VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER descriptor.
|
||||||
@ -97,13 +103,22 @@ struct ImGui_ImplVulkan_InitInfo
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
|
// Follow "Getting Started" link and check examples/ folder to learn about using backends!
|
||||||
IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info);
|
IMGUI_IMPL_API bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info); // The main pipeline will be created if possible (RenderPass xor (UseDynamicRendering && PipelineRenderingCreateInfo->sType is correct))
|
||||||
IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown();
|
#define IMGUI_IMPL_VULKAN_HAS_MAIN_PIPELINE_RE_CREATION 1
|
||||||
IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame();
|
struct ImGui_ImplVulkan_MainPipelineCreateInfo
|
||||||
IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline = VK_NULL_HANDLE);
|
{
|
||||||
IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture();
|
VkRenderPass RenderPass = VK_NULL_HANDLE;
|
||||||
IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontsTexture();
|
uint32_t Subpass = 0;
|
||||||
IMGUI_IMPL_API void ImGui_ImplVulkan_SetMinImageCount(uint32_t min_image_count); // To override MinImageCount after initialization (e.g. if swap chain is recreated)
|
VkSampleCountFlagBits MSAASamples = {};
|
||||||
|
const ImGui_ImplVulkan_PipelineRenderingInfo* pDynamicRendering = nullptr;
|
||||||
|
};
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplVulkan_ReCreateMainPipeline(ImGui_ImplVulkan_MainPipelineCreateInfo const& info); // (render_pass xor (p_dynamic_rendering && p_dynamic_rendering is correct (sType and pNext))
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown();
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame();
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, VkCommandBuffer command_buffer, VkPipeline pipeline = VK_NULL_HANDLE);
|
||||||
|
IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateFontsTexture();
|
||||||
|
IMGUI_IMPL_API void ImGui_ImplVulkan_DestroyFontsTexture();
|
||||||
|
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)
|
// Register a texture (VkDescriptorSet == ImTextureID)
|
||||||
// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem
|
// FIXME: This is experimental in the sense that we are unsure how to best design/tackle this problem
|
||||||
|
Loading…
x
Reference in New Issue
Block a user