From a50865b18b5ee529b873bdb0554056ef8f93d58a Mon Sep 17 00:00:00 2001 From: scribam Date: Sat, 7 Sep 2024 17:39:50 +0200 Subject: [PATCH] add missing parameter ImGui_ImplVulkan_RenderDrawData --- .../gui/include/gui/imgui_impl_sdl_vulkan.h | 2 +- vita3k/gui/src/gui.cpp | 15 +++++++++- vita3k/gui/src/imgui_impl_sdl_vulkan.cpp | 30 ++++++------------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/vita3k/gui/include/gui/imgui_impl_sdl_vulkan.h b/vita3k/gui/include/gui/imgui_impl_sdl_vulkan.h index 65838e9186..1124c90771 100644 --- a/vita3k/gui/include/gui/imgui_impl_sdl_vulkan.h +++ b/vita3k/gui/include/gui/imgui_impl_sdl_vulkan.h @@ -169,7 +169,7 @@ IMGUI_IMPL_API bool ImGui_ImplVulkan_CreateDeviceObjects(ImGui_VulkanState &stat IMGUI_IMPL_API ImGui_VulkanState *ImGui_ImplVulkan_Init(renderer::State *renderer, ImGui_ImplVulkan_InitInfo* info); IMGUI_IMPL_API void ImGui_ImplVulkan_Shutdown(ImGui_VulkanState &state); IMGUI_IMPL_API void ImGui_ImplVulkan_NewFrame(ImGui_VulkanState &state); -IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, ImGui_VulkanState &state); +IMGUI_IMPL_API void ImGui_ImplVulkan_RenderDrawData(ImGui_VulkanState &state, ImDrawData* draw_data, vk::CommandBuffer 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) diff --git a/vita3k/gui/src/gui.cpp b/vita3k/gui/src/gui.cpp index 2fd3b24b8d..3ba15ef345 100644 --- a/vita3k/gui/src/gui.cpp +++ b/vita3k/gui/src/gui.cpp @@ -790,7 +790,20 @@ void draw_end(GuiState &gui) { return ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); case renderer::Backend::Vulkan: - return ImGui_ImplVulkan_RenderDrawData(ImGui::GetDrawData(), dynamic_cast(*gui.imgui_state)); + auto &state = dynamic_cast(*gui.imgui_state); + auto &vk_state = dynamic_cast(*state.renderer); + + if (vk_state.screen_renderer.swapchain_image_idx == ~0) { + // this happen in the game selection screen + if (!vk_state.screen_renderer.acquire_swapchain_image(true)) + return; + } else if (!vk_state.screen_renderer.current_cmd_buffer) { + // Can happen while resizing the window + return; + } + + state.CommandBuffer = vk_state.screen_renderer.current_cmd_buffer; + return ImGui_ImplVulkan_RenderDrawData(dynamic_cast(*gui.imgui_state), ImGui::GetDrawData(), state.CommandBuffer); } } diff --git a/vita3k/gui/src/imgui_impl_sdl_vulkan.cpp b/vita3k/gui/src/imgui_impl_sdl_vulkan.cpp index 06d8c73d89..a8b4e210ee 100644 --- a/vita3k/gui/src/imgui_impl_sdl_vulkan.cpp +++ b/vita3k/gui/src/imgui_impl_sdl_vulkan.cpp @@ -424,7 +424,7 @@ static void CreateOrResizeBuffer(ImGui_VulkanState &state, vk::Buffer& buffer, v buffer_size = vertex_buffer_size_aligned; } -static void ImGui_ImplVulkan_SetupRenderState(ImGui_VulkanState &state, ImDrawData* draw_data, vk::Pipeline pipeline, vk::CommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers * rb, int fb_width, int fb_height) +static void ImGui_ImplVulkan_SetupRenderState(ImGui_VulkanState &state, ImDrawData* draw_data, VkPipeline pipeline, vk::CommandBuffer command_buffer, ImGui_ImplVulkanH_FrameRenderBuffers * rb, int fb_width, int fb_height) { ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); @@ -476,22 +476,9 @@ static void ImGui_ImplVulkan_DeletePipeline(ImGui_VulkanState &state) static void ImGui_ImplVulkan_CreatePipeline(ImGui_VulkanState &state); // Render function -void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, ImGui_VulkanState &state) +void ImGui_ImplVulkan_RenderDrawData(ImGui_VulkanState &state, ImDrawData* draw_data, vk::CommandBuffer command_buffer, VkPipeline pipeline) { auto &vk_state = dynamic_cast(*state.renderer); - - if (vk_state.screen_renderer.swapchain_image_idx == ~0) { - // this happen in the game selection screen - if (!vk_state.screen_renderer.acquire_swapchain_image(true)) - return; - } else if (!vk_state.screen_renderer.current_cmd_buffer) { - // Can happen while resizing the window - return; - } - - state.CommandBuffer = vk_state.screen_renderer.current_cmd_buffer; - // uint32_t image_index = vk_state.screen_renderer.swapchain_image_idx; - if (vk_state.screen_renderer.need_rebuild) { ImGui_ImplVulkan_DeletePipeline(state); ImGui_ImplVulkan_CreatePipeline(state); @@ -506,6 +493,8 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, ImGui_VulkanState &s ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); ImGui_ImplVulkan_InitInfo* v = &bd->VulkanInitInfo; + if (pipeline == VK_NULL_HANDLE) + pipeline = static_cast(state.Pipeline); // Allocate array to store enough vertex/index buffers ImGui_ImplVulkanH_WindowRenderBuffers* wrb = &state.MainWindowRenderBuffers; @@ -551,7 +540,7 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, ImGui_VulkanState &s } // Setup desired Vulkan state - ImGui_ImplVulkan_SetupRenderState(state, draw_data, state.Pipeline, state.CommandBuffer, rb, fb_width, fb_height); + ImGui_ImplVulkan_SetupRenderState(state, draw_data, pipeline, command_buffer, rb, fb_width, fb_height); // Will project scissor/clipping rectangles into framebuffer space ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports @@ -572,7 +561,7 @@ void ImGui_ImplVulkan_RenderDrawData(ImDrawData* draw_data, ImGui_VulkanState &s // User callback, registered via ImDrawList::AddCallback() // (ImDrawCallback_ResetRenderState is a special callback value used by the user to request the renderer to reset render state.) if (pcmd->UserCallback == ImDrawCallback_ResetRenderState) - ImGui_ImplVulkan_SetupRenderState(state, draw_data, state.Pipeline, state.CommandBuffer, rb, fb_width, fb_height); + ImGui_ImplVulkan_SetupRenderState(state, draw_data, static_cast(state.Pipeline), state.CommandBuffer, rb, fb_width, fb_height); else pcmd->UserCallback(cmd_list, pcmd); } @@ -987,6 +976,7 @@ static void ImGui_ImplVulkan_CreateShaderModules(ImGui_VulkanState &state) static void ImGui_ImplVulkan_CreatePipeline(ImGui_VulkanState &state) { + ImGui_ImplVulkan_Data* bd = ImGui_ImplVulkan_GetBackendData(); auto &vk_state = dynamic_cast(*state.renderer); std::vector shader_stage_infos = { @@ -1106,8 +1096,7 @@ static void ImGui_ImplVulkan_CreatePipeline(ImGui_VulkanState &state) } #endif - vk::ResultValue pipelineResultValue = vk_state.device.createGraphicsPipeline(vk::PipelineCache(), gui_pipeline_info, nullptr); - state.Pipeline = pipelineResultValue.value; + state.Pipeline = vk_state.device.createGraphicsPipeline(vk::PipelineCache(), gui_pipeline_info, nullptr).value; } bool ImGui_ImplVulkan_CreateDeviceObjects(ImGui_VulkanState &state) @@ -1120,6 +1109,7 @@ bool ImGui_ImplVulkan_CreateDeviceObjects(ImGui_VulkanState &state) if (!state.FontSampler) { + // Bilinear sampling is required by default. Set 'io.Fonts->Flags |= ImFontAtlasFlags_NoBakedLines' or 'style.AntiAliasedLinesUseTex = false' to allow point/nearest sampling. vk::SamplerCreateInfo info{ .magFilter = vk::Filter::eLinear, .minFilter = vk::Filter::eLinear, @@ -1163,8 +1153,6 @@ bool ImGui_ImplVulkan_CreateDeviceObjects(ImGui_VulkanState &state) ImGui_ImplVulkan_CreatePipeline(state); { - // Hopefully imgui doesn't use more than 2048 different images - // within k frames (where k is the number of images in the swapchain) vk::DescriptorPoolSize pool_size{ .type = vk::DescriptorType::eCombinedImageSampler, .descriptorCount = TextureState::nb_descriptor_sets + 1