Restore imgui rendering

Was lost when pass architecture was removed; now it should work again.
This commit is contained in:
Eidolon 2024-10-26 14:28:08 -05:00
parent fc05db7441
commit d2b3b15213
5 changed files with 38 additions and 25 deletions

View file

@ -5,8 +5,8 @@ target_sources(SRB2SDL2 PRIVATE
blit_rect.cpp blit_rect.cpp
blit_rect.hpp blit_rect.hpp
hardware_state.hpp hardware_state.hpp
pass_imgui.cpp imgui_renderer.cpp
pass_imgui.hpp imgui_renderer.hpp
pass_resource_managers.cpp pass_resource_managers.cpp
pass_resource_managers.hpp pass_resource_managers.hpp
patch_atlas.cpp patch_atlas.cpp

View file

@ -13,6 +13,7 @@
#include "blit_postimg_screens.hpp" #include "blit_postimg_screens.hpp"
#include "blit_rect.hpp" #include "blit_rect.hpp"
#include "imgui_renderer.hpp"
#include "postprocess_wipe.hpp" #include "postprocess_wipe.hpp"
#include "resource_management.hpp" #include "resource_management.hpp"
#include "screen_capture.hpp" #include "screen_capture.hpp"
@ -44,6 +45,7 @@ struct HardwareState
std::unique_ptr<BlitRectPass> crtsharp_blit_rect; std::unique_ptr<BlitRectPass> crtsharp_blit_rect;
std::unique_ptr<ScreenshotPass> screen_capture; std::unique_ptr<ScreenshotPass> screen_capture;
std::unique_ptr<UpscaleBackbuffer> backbuffer; std::unique_ptr<UpscaleBackbuffer> backbuffer;
std::unique_ptr<ImguiRenderer> imgui_renderer;
WipeFrames wipe_frames; WipeFrames wipe_frames;
}; };

View file

@ -8,7 +8,7 @@
// See the 'LICENSE' file for more details. // See the 'LICENSE' file for more details.
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
#include "pass_imgui.hpp" #include "imgui_renderer.hpp"
#include <imgui.h> #include <imgui.h>
#include <tcb/span.hpp> #include <tcb/span.hpp>
@ -19,14 +19,15 @@ using namespace srb2;
using namespace srb2::hwr2; using namespace srb2::hwr2;
using namespace srb2::rhi; 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_) if (!program_)
{ {
const char* defines[2] = { const char* defines[2] = {
@ -61,6 +62,19 @@ void ImguiPass::prepass(Rhi& rhi)
io.Fonts->SetTexID(font_atlas_); 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(); ImGui::Render();
ImDrawData* data = ImGui::GetDrawData(); ImDrawData* data = ImGui::GetDrawData();
@ -99,7 +113,14 @@ void ImguiPass::prepass(Rhi& rhi)
DrawCmd draw_cmd; DrawCmd draw_cmd;
ImTextureID tex_id = cmd.GetTexID(); ImTextureID tex_id = cmd.GetTexID();
if (tex_id == 0)
{
draw_cmd.tex = default_tex_;
}
else
{
draw_cmd.tex = tex_id; draw_cmd.tex = tex_id;
}
draw_cmd.v_offset = cmd.VtxOffset; draw_cmd.v_offset = cmd.VtxOffset;
draw_cmd.i_offset = cmd.IdxOffset; draw_cmd.i_offset = cmd.IdxOffset;
draw_cmd.elems = cmd.ElemCount; draw_cmd.elems = cmd.ElemCount;
@ -112,11 +133,6 @@ void ImguiPass::prepass(Rhi& rhi)
} }
draw_lists_.push_back(std::move(hwr2_list)); draw_lists_.push_back(std::move(hwr2_list));
} }
}
void ImguiPass::transfer(Rhi& rhi)
{
ImGuiIO& io = ImGui::GetIO();
{ {
unsigned char* pixels; unsigned char* pixels;
@ -159,10 +175,7 @@ void ImguiPass::transfer(Rhi& rhi)
draw_cmd.tex = draw_cmd.tex; draw_cmd.tex = draw_cmd.tex;
} }
} }
}
void ImguiPass::graphics(Rhi& rhi)
{
rhi.bind_program(program_); rhi.bind_program(program_);
RasterizerStateDesc rs; RasterizerStateDesc rs;
@ -213,10 +226,7 @@ void ImguiPass::graphics(Rhi& rhi)
rhi.draw_indexed(cmd.elems, cmd.i_offset); rhi.draw_indexed(cmd.elems, cmd.i_offset);
} }
} }
}
void ImguiPass::postpass(Rhi& rhi)
{
for (auto& list : draw_lists_) for (auto& list : draw_lists_)
{ {
rhi.destroy_buffer(list.vbo); rhi.destroy_buffer(list.vbo);

View file

@ -18,7 +18,7 @@
namespace srb2::hwr2 namespace srb2::hwr2
{ {
class ImguiPass final class ImguiRenderer final
{ {
struct DrawCmd struct DrawCmd
{ {
@ -40,17 +40,15 @@ class ImguiPass final
rhi::Handle<rhi::Program> program_; rhi::Handle<rhi::Program> program_;
rhi::Handle<rhi::Texture> font_atlas_; rhi::Handle<rhi::Texture> font_atlas_;
rhi::Handle<rhi::Texture> default_tex_;
std::vector<DrawList> draw_lists_; std::vector<DrawList> draw_lists_;
public: public:
ImguiPass(); ImguiRenderer();
virtual ~ImguiPass(); virtual ~ImguiRenderer();
void prepass(rhi::Rhi& rhi); void render(rhi::Rhi& rhi);
void transfer(rhi::Rhi& rhi);
void graphics(rhi::Rhi& rhi);
void postpass(rhi::Rhi& rhi);
}; };
} // namespace srb2::hwr2 } // namespace srb2::hwr2

View file

@ -87,6 +87,7 @@ static void reset_hardware_state(Rhi* rhi)
g_hw_state.crtsharp_blit_rect = std::make_unique<BlitRectPass>(BlitRectPass::BlitMode::kCrtSharp); g_hw_state.crtsharp_blit_rect = std::make_unique<BlitRectPass>(BlitRectPass::BlitMode::kCrtSharp);
g_hw_state.screen_capture = std::make_unique<ScreenshotPass>(); g_hw_state.screen_capture = std::make_unique<ScreenshotPass>();
g_hw_state.backbuffer = std::make_unique<UpscaleBackbuffer>(); g_hw_state.backbuffer = std::make_unique<UpscaleBackbuffer>();
g_hw_state.imgui_renderer = std::make_unique<ImguiRenderer>();
g_hw_state.wipe_frames = {}; g_hw_state.wipe_frames = {};
g_last_known_rhi = rhi; g_last_known_rhi = rhi;
@ -323,6 +324,8 @@ void I_FinishUpdate(void)
break; break;
} }
g_hw_state.imgui_renderer->render(*rhi);
rhi->pop_render_pass(); rhi->pop_render_pass();
postframe_update(*rhi); postframe_update(*rhi);