@ -30,6 +30,7 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2023-07-04: Vulkan: Added optional support for VK_KHR_dynamic_rendering. User needs to set init_info->UseDynamicRendering = true and init_info->ColorAttachmentFormat.
// 2023-01-02: Vulkan: Fixed sampler passed to ImGui_ImplVulkan_AddTexture() not being honored + removed a bunch of duplicate code.
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
// 2022-10-04: Vulkan: Added experimental ImGui_ImplVulkan_RemoveTexture() for api symetry. (#914, #5738).
@ -213,8 +214,9 @@ IMGUI_VULKAN_FUNC_MAP(IMGUI_VULKAN_FUNC_DEF)
# endif // VK_NO_PROTOTYPES
# if defined(VK_VERSION_1_3) || defined(VK_KHR_dynamic_rendering)
static PFN_vkCmdBeginRenderingKHR imgui_vkCmdBeginRenderingKHR ;
static PFN_vkCmdEndRenderingKHR imgui_vkCmdEndRenderingKHR ;
# define IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
static PFN_vkCmdBeginRenderingKHR ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR ;
static PFN_vkCmdEndRenderingKHR ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR ;
# endif
//-----------------------------------------------------------------------------
@ -846,13 +848,13 @@ static void ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationC
info . renderPass = renderPass ;
info . subpass = subpass ;
# if defined(VK_VERSION_1_3) || defined(VK_KHR_dynamic_rendering)
# ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
VkPipelineRenderingCreateInfoKHR pipelineRenderingCreateInfo = { } ;
pipelineRenderingCreateInfo . sType = VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR ;
pipelineRenderingCreateInfo . colorAttachmentCount = 1 ;
pipelineRenderingCreateInfo . pColorAttachmentFormats = & bd - > VulkanInitInfo . ColorAttachmentFormat ;
if ( bd - > VulkanInitInfo . UseDynamicRendering ) {
if ( bd - > VulkanInitInfo . UseDynamicRendering )
{
info . pNext = & pipelineRenderingCreateInfo ;
info . renderPass = VK_NULL_HANDLE ; // Just make sure it's actually nullptr.
}
@ -971,9 +973,10 @@ bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const ch
IMGUI_VULKAN_FUNC_MAP ( IMGUI_VULKAN_FUNC_LOAD )
# undef IMGUI_VULKAN_FUNC_LOAD
# if defined(VK_VERSION_1_3) || defined(VK_KHR_dynamic_rendering)
imgui_vkCmdBeginRenderingKHR = reinterpret_cast < PFN_vkCmdBeginRenderingKHR > ( loader_func ( " vkCmdBeginRenderingKHR " , user_data ) ) ;
imgui_vkCmdEndRenderingKHR = reinterpret_cast < PFN_vkCmdEndRenderingKHR > ( loader_func ( " vkCmdEndRenderingKHR " , user_data ) ) ;
# ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
// Manually load those two (see #5446)
ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR = reinterpret_cast < PFN_vkCmdBeginRenderingKHR > ( loader_func ( " vkCmdBeginRenderingKHR " , user_data ) ) ;
ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR = reinterpret_cast < PFN_vkCmdEndRenderingKHR > ( loader_func ( " vkCmdEndRenderingKHR " , user_data ) ) ;
# endif
# else
IM_UNUSED ( loader_func ) ;
@ -988,17 +991,17 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend
{
IM_ASSERT ( g_FunctionsLoaded & & " Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set! " ) ;
if ( info - > UseDynamicRendering ) {
# if defined(VK_VERSION_1_3) || defined(VK_KHR_dynamic_rendering)
if ( info - > UseDynamicRendering )
{
# ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
# ifndef VK_NO_PROTOTYPES
imgui _vkCmdBeginRenderingKHR = reinterpret_cast < PFN_vkCmdBeginRenderingKHR > ( vkGetInstanceProcAddr ( info - > Instance , " vkCmdBeginRenderingKHR " ) ) ;
imgui _vkCmdEndRenderingKHR = reinterpret_cast < PFN_vkCmdEndRenderingKHR > ( vkGetInstanceProcAddr ( info - > Instance , " vkCmdEndRenderingKHR " ) ) ;
ImGuiImplVulkanFuncs _vkCmdBeginRenderingKHR = reinterpret_cast < PFN_vkCmdBeginRenderingKHR > ( vkGetInstanceProcAddr ( info - > Instance , " vkCmdBeginRenderingKHR " ) ) ;
ImGuiImplVulkanFuncs _vkCmdEndRenderingKHR = reinterpret_cast < PFN_vkCmdEndRenderingKHR > ( vkGetInstanceProcAddr ( info - > Instance , " vkCmdEndRenderingKHR " ) ) ;
# endif
IM_ASSERT ( imgui_vkCmdBeginRenderingKHR ! = nullptr ) ;
IM_ASSERT ( imgui_vkCmdEndRenderingKHR ! = nullptr ) ;
IM_ASSERT ( ImGuiImplVulkanFuncs_vkCmdBeginRenderingKHR ! = nullptr ) ;
IM_ASSERT ( ImGuiImplVulkanFuncs_vkCmdEndRenderingKHR ! = nullptr ) ;
# else
IM_ASSERT ( ! " Can't use dynamic rendering when neither VK_VERSION_1_3 or VK_KHR_dynamic_rendering is defined. " ) ;
IM_ASSERT ( 0 & & " Can't use dynamic rendering when neither VK_VERSION_1_3 or VK_KHR_dynamic_rendering is defined. " ) ;
# endif
}
@ -1018,7 +1021,7 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info, VkRenderPass rend
IM_ASSERT ( info - > DescriptorPool ! = VK_NULL_HANDLE ) ;
IM_ASSERT ( info - > MinImageCount > = 2 ) ;
IM_ASSERT ( info - > ImageCount > = info - > MinImageCount ) ;
if ( ! info - > UseDynamicRendering )
if ( info - > UseDynamicRendering = = false )
IM_ASSERT ( render_pass ! = VK_NULL_HANDLE ) ;
bd - > VulkanInitInfo = * info ;
@ -1336,7 +1339,8 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
vkDestroySwapchainKHR ( device , old_swapchain , allocator ) ;
// Create the Render Pass
if ( ! wd - > UseDynamicRendering ) {
if ( wd - > UseDynamicRendering = = false )
{
VkAttachmentDescription attachment = { } ;
attachment . format = wd - > SurfaceFormat . format ;
attachment . samples = VK_SAMPLE_COUNT_1_BIT ;
@ -1398,7 +1402,8 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
}
// Create Framebuffer
if ( ! wd - > UseDynamicRendering ) {
if ( wd - > UseDynamicRendering = = false )
{
VkImageView attachment [ 1 ] ;
VkFramebufferCreateInfo info = { } ;
info . sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO ;