|
@@ -29,6 +29,10 @@
|
|
|
// CHANGELOG
|
|
|
// (minor and older changes stripped away, please see git history for details)
|
|
|
// 2025-XX-XX: Platform: Added support for multiple windows via the ImGuiPlatformIO interface.
|
|
|
+// 2025-09-26: *BREAKING CHANGE*: moved some fields in ImGui_ImplVulkan_InitInfo: init_info.RenderPass --> init_info.PipelineInfoMain.RenderPass, init_info.Subpass --> init_info.PipelineInfoMain.Subpass, init_info.MSAASamples --> init_info.PipelineInfoMain.MSAASamples, init_info.PipelineRenderingCreateInfo --> init_info.PipelineInfoMain.PipelineRenderingCreateInfo.
|
|
|
+// 2025-09-26: *BREAKING CHANGE*: renamed ImGui_ImplVulkan_MainPipelineCreateInfo to ImGui_ImplVulkan_PipelineInfo. Introduced very recently so shouldn't affect many users.
|
|
|
+// 2025-09-26: *BREAKING CHANGE*: helper ImGui_ImplVulkanH_CreateOrResizeWindow() added a VkImageUsageFlags image_usage` argument, default to VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT if 0.
|
|
|
+// 2025-09-26: Vulkan: Added a way to customize shaders by filling ImGui_ImplVulkan_InitInfo::CustomShaderVertCreateInfo/CustomShaderFragCreateInfo. (#8585)
|
|
|
// 2025-09-22: [Docking] Added ImGui_ImplVulkanH_GetWindowDataFromViewport() accessor/helper. (#8946, #8940)
|
|
|
// 2025-09-18: Call platform_io.ClearRendererHandlers() on shutdown.
|
|
|
// 2025-09-04: Vulkan: Added ImGui_ImplVulkan_CreateMainPipeline(). (#8110, #8111)
|
|
@@ -121,7 +125,7 @@ void ImGui_ImplVulkan_DestroyWindowRenderBuffers(VkDevice device, ImGui_ImplVulk
|
|
|
void ImGui_ImplVulkanH_DestroyFrame(VkDevice device, ImGui_ImplVulkanH_Frame* fd, const VkAllocationCallbacks* allocator);
|
|
|
void ImGui_ImplVulkanH_DestroyFrameSemaphores(VkDevice device, ImGui_ImplVulkanH_FrameSemaphores* fsd, const VkAllocationCallbacks* allocator);
|
|
|
void ImGui_ImplVulkanH_DestroyAllViewportsRenderBuffers(VkDevice device, const VkAllocationCallbacks* allocator);
|
|
|
-void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count);
|
|
|
+void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count, VkImageUsageFlags image_usage);
|
|
|
void ImGui_ImplVulkanH_CreateWindowCommandBuffers(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator);
|
|
|
|
|
|
// Vulkan prototypes for use with custom loaders
|
|
@@ -917,24 +921,26 @@ void ImGui_ImplVulkan_UpdateTexture(ImTextureData* tex)
|
|
|
|
|
|
static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAllocationCallbacks* allocator)
|
|
|
{
|
|
|
- // Create the shader modules
|
|
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
+ ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
|
if (bd->ShaderModuleVert == VK_NULL_HANDLE)
|
|
|
{
|
|
|
- VkShaderModuleCreateInfo vert_info = {};
|
|
|
- vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
|
- vert_info.codeSize = sizeof(__glsl_shader_vert_spv);
|
|
|
- vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;
|
|
|
- VkResult err = vkCreateShaderModule(device, &vert_info, allocator, &bd->ShaderModuleVert);
|
|
|
+ VkShaderModuleCreateInfo default_vert_info = {};
|
|
|
+ default_vert_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
|
+ default_vert_info.codeSize = sizeof(__glsl_shader_vert_spv);
|
|
|
+ default_vert_info.pCode = (uint32_t*)__glsl_shader_vert_spv;
|
|
|
+ VkShaderModuleCreateInfo* p_vert_info = (v->CustomShaderVertCreateInfo.sType == VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) ? &v->CustomShaderVertCreateInfo : &default_vert_info;
|
|
|
+ VkResult err = vkCreateShaderModule(device, p_vert_info, allocator, &bd->ShaderModuleVert);
|
|
|
check_vk_result(err);
|
|
|
}
|
|
|
if (bd->ShaderModuleFrag == VK_NULL_HANDLE)
|
|
|
{
|
|
|
- VkShaderModuleCreateInfo frag_info = {};
|
|
|
- frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
|
- frag_info.codeSize = sizeof(__glsl_shader_frag_spv);
|
|
|
- frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;
|
|
|
- VkResult err = vkCreateShaderModule(device, &frag_info, allocator, &bd->ShaderModuleFrag);
|
|
|
+ VkShaderModuleCreateInfo default_frag_info = {};
|
|
|
+ default_frag_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
|
|
+ default_frag_info.codeSize = sizeof(__glsl_shader_frag_spv);
|
|
|
+ default_frag_info.pCode = (uint32_t*)__glsl_shader_frag_spv;
|
|
|
+ VkShaderModuleCreateInfo* p_frag_info = (v->CustomShaderFragCreateInfo.sType == VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) ? &v->CustomShaderFragCreateInfo : &default_frag_info;
|
|
|
+ VkResult err = vkCreateShaderModule(device, p_frag_info, allocator, &bd->ShaderModuleFrag);
|
|
|
check_vk_result(err);
|
|
|
}
|
|
|
}
|
|
@@ -943,7 +949,7 @@ static void ImGui_ImplVulkan_CreateShaderModules(VkDevice device, const VkAlloca
|
|
|
typedef void VkPipelineRenderingCreateInfoKHR;
|
|
|
#endif
|
|
|
|
|
|
-static VkPipeline ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, VkRenderPass renderPass, VkSampleCountFlagBits MSAASamples, uint32_t subpass, const VkPipelineRenderingCreateInfoKHR* pipeline_rendering_create_info)
|
|
|
+static VkPipeline ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAllocationCallbacks* allocator, VkPipelineCache pipelineCache, const ImGui_ImplVulkan_PipelineInfo* info)
|
|
|
{
|
|
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
ImGui_ImplVulkan_CreateShaderModules(device, allocator);
|
|
@@ -1001,7 +1007,7 @@ static VkPipeline ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAlloc
|
|
|
|
|
|
VkPipelineMultisampleStateCreateInfo ms_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 = (info->MSAASamples != 0) ? info->MSAASamples : VK_SAMPLE_COUNT_1_BIT;
|
|
|
|
|
|
VkPipelineColorBlendAttachmentState color_attachment[1] = {};
|
|
|
color_attachment[0].blendEnable = VK_TRUE;
|
|
@@ -1027,37 +1033,34 @@ static VkPipeline ImGui_ImplVulkan_CreatePipeline(VkDevice device, const VkAlloc
|
|
|
dynamic_state.dynamicStateCount = (uint32_t)IM_ARRAYSIZE(dynamic_states);
|
|
|
dynamic_state.pDynamicStates = dynamic_states;
|
|
|
|
|
|
- VkGraphicsPipelineCreateInfo info = {};
|
|
|
- info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
|
|
- info.flags = bd->PipelineCreateFlags;
|
|
|
- info.stageCount = 2;
|
|
|
- info.pStages = stage;
|
|
|
- info.pVertexInputState = &vertex_info;
|
|
|
- info.pInputAssemblyState = &ia_info;
|
|
|
- info.pViewportState = &viewport_info;
|
|
|
- info.pRasterizationState = &raster_info;
|
|
|
- info.pMultisampleState = &ms_info;
|
|
|
- info.pDepthStencilState = &depth_info;
|
|
|
- info.pColorBlendState = &blend_info;
|
|
|
- info.pDynamicState = &dynamic_state;
|
|
|
- info.layout = bd->PipelineLayout;
|
|
|
- info.renderPass = renderPass;
|
|
|
- info.subpass = subpass;
|
|
|
+ VkGraphicsPipelineCreateInfo create_info = {};
|
|
|
+ create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
|
|
|
+ create_info.flags = bd->PipelineCreateFlags;
|
|
|
+ create_info.stageCount = 2;
|
|
|
+ create_info.pStages = stage;
|
|
|
+ create_info.pVertexInputState = &vertex_info;
|
|
|
+ create_info.pInputAssemblyState = &ia_info;
|
|
|
+ create_info.pViewportState = &viewport_info;
|
|
|
+ create_info.pRasterizationState = &raster_info;
|
|
|
+ create_info.pMultisampleState = &ms_info;
|
|
|
+ create_info.pDepthStencilState = &depth_info;
|
|
|
+ create_info.pColorBlendState = &blend_info;
|
|
|
+ create_info.pDynamicState = &dynamic_state;
|
|
|
+ create_info.layout = bd->PipelineLayout;
|
|
|
+ create_info.renderPass = info->RenderPass;
|
|
|
+ create_info.subpass = info->Subpass;
|
|
|
|
|
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
|
|
if (bd->VulkanInitInfo.UseDynamicRendering)
|
|
|
{
|
|
|
- IM_ASSERT(pipeline_rendering_create_info && "PipelineRenderingCreateInfo must not be nullptr when using dynamic rendering");
|
|
|
- IM_ASSERT(pipeline_rendering_create_info->sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR && "PipelineRenderingCreateInfo::sType must be VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR");
|
|
|
- IM_ASSERT(pipeline_rendering_create_info->pNext == nullptr && "PipelineRenderingCreateInfo::pNext must be nullptr");
|
|
|
- info.pNext = pipeline_rendering_create_info;
|
|
|
- info.renderPass = VK_NULL_HANDLE; // Just make sure it's actually nullptr.
|
|
|
+ IM_ASSERT(info->PipelineRenderingCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR && "PipelineRenderingCreateInfo::sType must be VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR");
|
|
|
+ IM_ASSERT(info->PipelineRenderingCreateInfo.pNext == nullptr && "PipelineRenderingCreateInfo::pNext must be nullptr");
|
|
|
+ create_info.pNext = &info->PipelineRenderingCreateInfo;
|
|
|
+ create_info.renderPass = VK_NULL_HANDLE; // Just make sure it's actually nullptr.
|
|
|
}
|
|
|
-#else
|
|
|
- IM_ASSERT(pipeline_rendering_create_info == nullptr);
|
|
|
#endif
|
|
|
VkPipeline pipeline;
|
|
|
- VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &info, allocator, &pipeline);
|
|
|
+ VkResult err = vkCreateGraphicsPipelines(device, pipelineCache, 1, &create_info, allocator, &pipeline);
|
|
|
check_vk_result(err);
|
|
|
return pipeline;
|
|
|
}
|
|
@@ -1134,21 +1137,12 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|
|
}
|
|
|
|
|
|
// Create pipeline
|
|
|
- if (v->RenderPass
|
|
|
+ bool create_main_pipeline = (v->PipelineInfoMain.RenderPass != VK_NULL_HANDLE);
|
|
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
|
|
- || (v->UseDynamicRendering && v->PipelineRenderingCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR)
|
|
|
+ create_main_pipeline |= (v->UseDynamicRendering && v->PipelineInfoMain.PipelineRenderingCreateInfo.sType == VK_STRUCTURE_TYPE_PIPELINE_RENDERING_CREATE_INFO_KHR);
|
|
|
#endif
|
|
|
- )
|
|
|
- {
|
|
|
- ImGui_ImplVulkan_MainPipelineCreateInfo mp_info = {};
|
|
|
- mp_info.RenderPass = v->RenderPass;
|
|
|
- mp_info.Subpass = v->Subpass;
|
|
|
- mp_info.MSAASamples = v->MSAASamples;
|
|
|
-#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
|
|
- mp_info.PipelineRenderingCreateInfo = v->PipelineRenderingCreateInfo;
|
|
|
-#endif
|
|
|
- ImGui_ImplVulkan_CreateMainPipeline(mp_info);
|
|
|
- }
|
|
|
+ if (create_main_pipeline)
|
|
|
+ ImGui_ImplVulkan_CreateMainPipeline(&v->PipelineInfoMain);
|
|
|
|
|
|
// Create command pool/buffer for texture upload
|
|
|
if (!bd->TexCommandPool)
|
|
@@ -1173,7 +1167,7 @@ bool ImGui_ImplVulkan_CreateDeviceObjects()
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-void ImGui_ImplVulkan_CreateMainPipeline(const ImGui_ImplVulkan_MainPipelineCreateInfo& info)
|
|
|
+void ImGui_ImplVulkan_CreateMainPipeline(const ImGui_ImplVulkan_PipelineInfo* pipeline_info_in)
|
|
|
{
|
|
|
ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData();
|
|
|
ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo;
|
|
@@ -1182,28 +1176,23 @@ void ImGui_ImplVulkan_CreateMainPipeline(const ImGui_ImplVulkan_MainPipelineCrea
|
|
|
vkDestroyPipeline(v->Device, bd->Pipeline, v->Allocator);
|
|
|
bd->Pipeline = VK_NULL_HANDLE;
|
|
|
}
|
|
|
- v->RenderPass = info.RenderPass;
|
|
|
- v->MSAASamples = info.MSAASamples;
|
|
|
- v->Subpass = info.Subpass;
|
|
|
+ ImGui_ImplVulkan_PipelineInfo* pipeline_info = &v->PipelineInfoMain;
|
|
|
+ if (pipeline_info != pipeline_info_in)
|
|
|
+ *pipeline_info = *pipeline_info_in;
|
|
|
|
|
|
- const VkPipelineRenderingCreateInfoKHR* pipeline_rendering_create_info = nullptr;
|
|
|
#ifdef IMGUI_IMPL_VULKAN_HAS_DYNAMIC_RENDERING
|
|
|
- if (v->UseDynamicRendering)
|
|
|
+ VkPipelineRenderingCreateInfoKHR* pipeline_rendering_create_info = &pipeline_info->PipelineRenderingCreateInfo;
|
|
|
+ if (v->UseDynamicRendering && pipeline_rendering_create_info->pColorAttachmentFormats != NULL)
|
|
|
{
|
|
|
- v->PipelineRenderingCreateInfo = info.PipelineRenderingCreateInfo;
|
|
|
- pipeline_rendering_create_info = &v->PipelineRenderingCreateInfo;
|
|
|
- if (v->PipelineRenderingCreateInfo.pColorAttachmentFormats != NULL)
|
|
|
- {
|
|
|
- // Deep copy buffer to reduce error-rate for end user (#8282)
|
|
|
- ImVector<VkFormat> formats;
|
|
|
- formats.resize((int)v->PipelineRenderingCreateInfo.colorAttachmentCount);
|
|
|
- memcpy(formats.Data, v->PipelineRenderingCreateInfo.pColorAttachmentFormats, (size_t)formats.size_in_bytes());
|
|
|
- formats.swap(bd->PipelineRenderingCreateInfoColorAttachmentFormats);
|
|
|
- v->PipelineRenderingCreateInfo.pColorAttachmentFormats = bd->PipelineRenderingCreateInfoColorAttachmentFormats.Data;
|
|
|
- }
|
|
|
+ // Deep copy buffer to reduce error-rate for end user (#8282)
|
|
|
+ ImVector<VkFormat> formats;
|
|
|
+ formats.resize((int)pipeline_rendering_create_info->colorAttachmentCount);
|
|
|
+ memcpy(formats.Data, pipeline_rendering_create_info->pColorAttachmentFormats, (size_t)formats.size_in_bytes());
|
|
|
+ formats.swap(bd->PipelineRenderingCreateInfoColorAttachmentFormats);
|
|
|
+ pipeline_rendering_create_info->pColorAttachmentFormats = bd->PipelineRenderingCreateInfoColorAttachmentFormats.Data;
|
|
|
}
|
|
|
#endif
|
|
|
- bd->Pipeline = ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, v->RenderPass, v->MSAASamples, v->Subpass, pipeline_rendering_create_info);
|
|
|
+ bd->Pipeline = ImGui_ImplVulkan_CreatePipeline(v->Device, v->Allocator, v->PipelineCache, pipeline_info);
|
|
|
}
|
|
|
|
|
|
void ImGui_ImplVulkan_DestroyDeviceObjects()
|
|
@@ -1320,16 +1309,19 @@ bool ImGui_ImplVulkan_Init(ImGui_ImplVulkan_InitInfo* info)
|
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasTextures; // We can honor ImGuiPlatformIO::Textures[] requests during render.
|
|
|
io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the Renderer side (optional)
|
|
|
|
|
|
+ // Sanity checks
|
|
|
IM_ASSERT(info->Instance != VK_NULL_HANDLE);
|
|
|
IM_ASSERT(info->PhysicalDevice != VK_NULL_HANDLE);
|
|
|
IM_ASSERT(info->Device != VK_NULL_HANDLE);
|
|
|
IM_ASSERT(info->Queue != VK_NULL_HANDLE);
|
|
|
+ IM_ASSERT(info->MinImageCount >= 2);
|
|
|
+ IM_ASSERT(info->ImageCount >= info->MinImageCount);
|
|
|
if (info->DescriptorPool != VK_NULL_HANDLE) // Either DescriptorPool or DescriptorPoolSize must be set, not both!
|
|
|
IM_ASSERT(info->DescriptorPoolSize == 0);
|
|
|
else
|
|
|
IM_ASSERT(info->DescriptorPoolSize > 0);
|
|
|
- IM_ASSERT(info->MinImageCount >= 2);
|
|
|
- IM_ASSERT(info->ImageCount >= info->MinImageCount);
|
|
|
+ if (info->UseDynamicRendering)
|
|
|
+ IM_ASSERT(info->PipelineInfoMain.RenderPass == VK_NULL_HANDLE);
|
|
|
|
|
|
bd->VulkanInitInfo = *info;
|
|
|
|
|
@@ -1652,7 +1644,7 @@ int ImGui_ImplVulkanH_GetMinImageCountFromPresentMode(VkPresentModeKHR present_m
|
|
|
}
|
|
|
|
|
|
// Also destroy old swap chain and in-flight frames data, if any.
|
|
|
-void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count)
|
|
|
+void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, const VkAllocationCallbacks* allocator, int w, int h, uint32_t min_image_count, VkImageUsageFlags image_usage)
|
|
|
{
|
|
|
VkResult err;
|
|
|
VkSwapchainKHR old_swapchain = wd->Swapchain;
|
|
@@ -1689,7 +1681,7 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
|
|
|
info.imageFormat = wd->SurfaceFormat.format;
|
|
|
info.imageColorSpace = wd->SurfaceFormat.colorSpace;
|
|
|
info.imageArrayLayers = 1;
|
|
|
- info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
|
|
+ info.imageUsage = (image_usage != 0) ? image_usage : VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
|
|
|
info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; // Assume that graphics family == present family
|
|
|
info.preTransform = (cap.supportedTransforms & VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR) ? VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR : cap.currentTransform;
|
|
|
info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
|
|
@@ -1817,12 +1809,12 @@ void ImGui_ImplVulkanH_CreateWindowSwapChain(VkPhysicalDevice physical_device, V
|
|
|
}
|
|
|
|
|
|
// Create or resize window
|
|
|
-void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int width, int height, uint32_t min_image_count)
|
|
|
+// - 2025/09/26: v1.92.4 added a trailing 'VkImageUsageFlags image_usage' parameter which is usually VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT.
|
|
|
+void ImGui_ImplVulkanH_CreateOrResizeWindow(VkInstance instance, VkPhysicalDevice physical_device, VkDevice device, ImGui_ImplVulkanH_Window* wd, uint32_t queue_family, const VkAllocationCallbacks* allocator, int width, int height, uint32_t min_image_count, VkImageUsageFlags image_usage)
|
|
|
{
|
|
|
IM_ASSERT(g_FunctionsLoaded && "Need to call ImGui_ImplVulkan_LoadFunctions() if IMGUI_IMPL_VULKAN_NO_PROTOTYPES or VK_NO_PROTOTYPES are set!");
|
|
|
(void)instance;
|
|
|
- ImGui_ImplVulkanH_CreateWindowSwapChain(physical_device, device, wd, allocator, width, height, min_image_count);
|
|
|
- //ImGui_ImplVulkan_CreatePipeline(device, allocator, VK_NULL_HANDLE, wd->RenderPass, VK_SAMPLE_COUNT_1_BIT, &wd->Pipeline, g_VulkanInitInfo.Subpass);
|
|
|
+ ImGui_ImplVulkanH_CreateWindowSwapChain(physical_device, device, wd, allocator, width, height, min_image_count, image_usage);
|
|
|
ImGui_ImplVulkanH_CreateWindowCommandBuffers(physical_device, device, wd, queue_family, allocator);
|
|
|
|
|
|
// FIXME: to submit the command buffer, we need a queue. In the examples folder, the ImGui_ImplVulkanH_CreateOrResizeWindow function is called
|