From d2b3b15213f4ccec73a5e90e54db02cf171badd2 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Sat, 26 Oct 2024 14:28:08 -0500 Subject: [PATCH] Restore imgui rendering Was lost when pass architecture was removed; now it should work again. --- src/hwr2/CMakeLists.txt | 4 +- src/hwr2/hardware_state.hpp | 2 + .../{pass_imgui.cpp => imgui_renderer.cpp} | 42 ++++++++++++------- .../{pass_imgui.hpp => imgui_renderer.hpp} | 12 +++--- src/i_video_common.cpp | 3 ++ 5 files changed, 38 insertions(+), 25 deletions(-) rename src/hwr2/{pass_imgui.cpp => imgui_renderer.cpp} (91%) rename src/hwr2/{pass_imgui.hpp => imgui_renderer.hpp} (85%) diff --git a/src/hwr2/CMakeLists.txt b/src/hwr2/CMakeLists.txt index a6b7c61b7..879f4e669 100644 --- a/src/hwr2/CMakeLists.txt +++ b/src/hwr2/CMakeLists.txt @@ -5,8 +5,8 @@ target_sources(SRB2SDL2 PRIVATE blit_rect.cpp blit_rect.hpp hardware_state.hpp - pass_imgui.cpp - pass_imgui.hpp + imgui_renderer.cpp + imgui_renderer.hpp pass_resource_managers.cpp pass_resource_managers.hpp patch_atlas.cpp diff --git a/src/hwr2/hardware_state.hpp b/src/hwr2/hardware_state.hpp index e78f6daf2..cb2bdbe7c 100644 --- a/src/hwr2/hardware_state.hpp +++ b/src/hwr2/hardware_state.hpp @@ -13,6 +13,7 @@ #include "blit_postimg_screens.hpp" #include "blit_rect.hpp" +#include "imgui_renderer.hpp" #include "postprocess_wipe.hpp" #include "resource_management.hpp" #include "screen_capture.hpp" @@ -44,6 +45,7 @@ struct HardwareState std::unique_ptr crtsharp_blit_rect; std::unique_ptr screen_capture; std::unique_ptr backbuffer; + std::unique_ptr imgui_renderer; WipeFrames wipe_frames; }; diff --git a/src/hwr2/pass_imgui.cpp b/src/hwr2/imgui_renderer.cpp similarity index 91% rename from src/hwr2/pass_imgui.cpp rename to src/hwr2/imgui_renderer.cpp index 8db9751a7..cc13cb3bc 100644 --- a/src/hwr2/pass_imgui.cpp +++ b/src/hwr2/imgui_renderer.cpp @@ -8,7 +8,7 @@ // See the 'LICENSE' file for more details. //----------------------------------------------------------------------------- -#include "pass_imgui.hpp" +#include "imgui_renderer.hpp" #include #include @@ -19,14 +19,15 @@ using namespace srb2; using namespace srb2::hwr2; using namespace srb2::rhi; -ImguiPass::ImguiPass() +ImguiRenderer::ImguiRenderer() { } -ImguiPass::~ImguiPass() = default; +ImguiRenderer::~ImguiRenderer() = default; -void ImguiPass::prepass(Rhi& rhi) +void ImguiRenderer::render(Rhi& rhi) { + if (!program_) { const char* defines[2] = { @@ -61,6 +62,19 @@ void ImguiPass::prepass(Rhi& rhi) io.Fonts->SetTexID(font_atlas_); } + if (!default_tex_) + { + uint32_t pixel = 0xFFFFFFFF; + default_tex_ = rhi.create_texture({ + TextureFormat::kRGBA, + 1, + 1, + TextureWrapMode::kRepeat, + TextureWrapMode::kRepeat + }); + rhi.update_texture(default_tex_, {0, 0, 1, 1}, rhi::PixelFormat::kRGBA8, tcb::as_bytes(tcb::span(&pixel, 1))); + } + ImGui::Render(); ImDrawData* data = ImGui::GetDrawData(); @@ -99,7 +113,14 @@ void ImguiPass::prepass(Rhi& rhi) DrawCmd draw_cmd; ImTextureID tex_id = cmd.GetTexID(); - draw_cmd.tex = tex_id; + if (tex_id == 0) + { + draw_cmd.tex = default_tex_; + } + else + { + draw_cmd.tex = tex_id; + } draw_cmd.v_offset = cmd.VtxOffset; draw_cmd.i_offset = cmd.IdxOffset; draw_cmd.elems = cmd.ElemCount; @@ -112,11 +133,6 @@ void ImguiPass::prepass(Rhi& rhi) } draw_lists_.push_back(std::move(hwr2_list)); } -} - -void ImguiPass::transfer(Rhi& rhi) -{ - ImGuiIO& io = ImGui::GetIO(); { unsigned char* pixels; @@ -159,10 +175,7 @@ void ImguiPass::transfer(Rhi& rhi) draw_cmd.tex = draw_cmd.tex; } } -} -void ImguiPass::graphics(Rhi& rhi) -{ rhi.bind_program(program_); RasterizerStateDesc rs; @@ -213,10 +226,7 @@ void ImguiPass::graphics(Rhi& rhi) rhi.draw_indexed(cmd.elems, cmd.i_offset); } } -} -void ImguiPass::postpass(Rhi& rhi) -{ for (auto& list : draw_lists_) { rhi.destroy_buffer(list.vbo); diff --git a/src/hwr2/pass_imgui.hpp b/src/hwr2/imgui_renderer.hpp similarity index 85% rename from src/hwr2/pass_imgui.hpp rename to src/hwr2/imgui_renderer.hpp index 1722cd6aa..b861ade4b 100644 --- a/src/hwr2/pass_imgui.hpp +++ b/src/hwr2/imgui_renderer.hpp @@ -18,7 +18,7 @@ namespace srb2::hwr2 { -class ImguiPass final +class ImguiRenderer final { struct DrawCmd { @@ -40,17 +40,15 @@ class ImguiPass final rhi::Handle program_; rhi::Handle font_atlas_; + rhi::Handle default_tex_; std::vector draw_lists_; public: - ImguiPass(); - virtual ~ImguiPass(); + ImguiRenderer(); + virtual ~ImguiRenderer(); - void prepass(rhi::Rhi& rhi); - void transfer(rhi::Rhi& rhi); - void graphics(rhi::Rhi& rhi); - void postpass(rhi::Rhi& rhi); + void render(rhi::Rhi& rhi); }; } // namespace srb2::hwr2 diff --git a/src/i_video_common.cpp b/src/i_video_common.cpp index 2a0046b1c..f9cf8f4f7 100644 --- a/src/i_video_common.cpp +++ b/src/i_video_common.cpp @@ -87,6 +87,7 @@ static void reset_hardware_state(Rhi* rhi) g_hw_state.crtsharp_blit_rect = std::make_unique(BlitRectPass::BlitMode::kCrtSharp); g_hw_state.screen_capture = std::make_unique(); g_hw_state.backbuffer = std::make_unique(); + g_hw_state.imgui_renderer = std::make_unique(); g_hw_state.wipe_frames = {}; g_last_known_rhi = rhi; @@ -323,6 +324,8 @@ void I_FinishUpdate(void) break; } + g_hw_state.imgui_renderer->render(*rhi); + rhi->pop_render_pass(); postframe_update(*rhi);