|
@@ -244,7 +244,8 @@ struct ImGui_ImplVulkan_Data
|
|
VkPipelineCreateFlags PipelineCreateFlags;
|
|
VkPipelineCreateFlags PipelineCreateFlags;
|
|
VkDescriptorSetLayout DescriptorSetLayout;
|
|
VkDescriptorSetLayout DescriptorSetLayout;
|
|
VkPipelineLayout PipelineLayout;
|
|
VkPipelineLayout PipelineLayout;
|
|
- VkPipeline Pipeline;
|
|
|
|
|
|
+ VkPipeline Pipeline; // pipeline for main render pass (created by app)
|
|
|
|
+ VkPipeline PipelineForViewports; // pipeline for secondary viewports (created by backend)
|
|
VkShaderModule ShaderModuleVert;
|
|
VkShaderModule ShaderModuleVert;
|
|
VkShaderModule ShaderModuleFrag;
|
|
VkShaderModule ShaderModuleFrag;
|
|
|
|
|
|
@@ -1071,6 +1072,7 @@ void ImGui_ImplVulkan_DestroyDeviceObjects()
|
|
if (bd->DescriptorSetLayout) { vkDestroyDescriptorSetLayout(v->Device, bd->DescriptorSetLayout, v->Allocator); bd->DescriptorSetLayout = VK_NULL_HANDLE; }
|
|
if (bd->DescriptorSetLayout) { vkDestroyDescriptorSetLayout(v->Device, bd->DescriptorSetLayout, v->Allocator); bd->DescriptorSetLayout = VK_NULL_HANDLE; }
|
|
if (bd->PipelineLayout) { vkDestroyPipelineLayout(v->Device, bd->PipelineLayout, v->Allocator); bd->PipelineLayout = VK_NULL_HANDLE; }
|
|
if (bd->PipelineLayout) { vkDestroyPipelineLayout(v->Device, bd->PipelineLayout, v->Allocator); bd->PipelineLayout = VK_NULL_HANDLE; }
|
|
if (bd->Pipeline) { vkDestroyPipeline(v->Device, bd->Pipeline, v->Allocator); bd->Pipeline = VK_NULL_HANDLE; }
|
|
if (bd->Pipeline) { vkDestroyPipeline(v->Device, bd->Pipeline, v->Allocator); bd->Pipeline = VK_NULL_HANDLE; }
|
|
|
|
+ if (bd->PipelineForViewports) { vkDestroyPipeline(v->Device, bd->PipelineForViewports, v->Allocator); bd->PipelineForViewports = VK_NULL_HANDLE; }
|
|
}
|
|
}
|
|
|
|
|
|
bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data)
|
|
bool ImGui_ImplVulkan_LoadFunctions(PFN_vkVoidFunction(*loader_func)(const char* function_name, void* user_data), void* user_data)
|
|
@@ -1689,6 +1691,10 @@ static void ImGui_ImplVulkan_CreateWindow(ImGuiViewport* viewport)
|
|
wd->UseDynamicRendering = v->UseDynamicRendering;
|
|
wd->UseDynamicRendering = v->UseDynamicRendering;
|
|
ImGui_ImplVulkanH_CreateOrResizeWindow(v->Instance, v->PhysicalDevice, v->Device, wd, v->QueueFamily, v->Allocator, (int)viewport->Size.x, (int)viewport->Size.y, v->MinImageCount);
|
|
ImGui_ImplVulkanH_CreateOrResizeWindow(v->Instance, v->PhysicalDevice, v->Device, wd, v->QueueFamily, v->Allocator, (int)viewport->Size.x, (int)viewport->Size.y, v->MinImageCount);
|
|
vd->WindowOwned = true;
|
|
vd->WindowOwned = true;
|
|
|
|
+
|
|
|
|
+ // Create pipeline (shared by all secondary viewports)
|
|
|
|
+ if (bd->PipelineForViewports == VK_NULL_HANDLE)
|
|
|
|
+ ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &bd->PipelineForViewports, 0);
|
|
}
|
|
}
|
|
|
|
|
|
static void ImGui_ImplVulkan_DestroyWindow(ImGuiViewport* viewport)
|
|
static void ImGui_ImplVulkan_DestroyWindow(ImGuiViewport* viewport)
|
|
@@ -1803,7 +1809,7 @@ static void ImGui_ImplVulkan_RenderWindow(ImGuiViewport* viewport, void*)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- ImGui_ImplVulkan_RenderDrawData(viewport->DrawData, fd->CommandBuffer, nullptr);
|
|
|
|
|
|
+ ImGui_ImplVulkan_RenderDrawData(viewport->DrawData, fd->CommandBuffer, bd->PipelineForViewports);
|
|
|
|
|
|
{
|
|
{
|
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|