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.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

View file

@ -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<BlitRectPass> crtsharp_blit_rect;
std::unique_ptr<ScreenshotPass> screen_capture;
std::unique_ptr<UpscaleBackbuffer> backbuffer;
std::unique_ptr<ImguiRenderer> imgui_renderer;
WipeFrames wipe_frames;
};

View file

@ -8,7 +8,7 @@
// See the 'LICENSE' file for more details.
//-----------------------------------------------------------------------------
#include "pass_imgui.hpp"
#include "imgui_renderer.hpp"
#include <imgui.h>
#include <tcb/span.hpp>
@ -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);

View file

@ -18,7 +18,7 @@
namespace srb2::hwr2
{
class ImguiPass final
class ImguiRenderer final
{
struct DrawCmd
{
@ -40,17 +40,15 @@ class ImguiPass final
rhi::Handle<rhi::Program> program_;
rhi::Handle<rhi::Texture> font_atlas_;
rhi::Handle<rhi::Texture> default_tex_;
std::vector<DrawList> 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

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.screen_capture = std::make_unique<ScreenshotPass>();
g_hw_state.backbuffer = std::make_unique<UpscaleBackbuffer>();
g_hw_state.imgui_renderer = std::make_unique<ImguiRenderer>();
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);