From bba1d56529da4746ade34190415cad6e482b5731 Mon Sep 17 00:00:00 2001 From: Eidolon Date: Thu, 24 Oct 2024 14:10:41 -0500 Subject: [PATCH] rhi: Remove the old Pass concept This was already slated to be removed; the old PassManager was a failed attempt to centralize and pipeline all graphics logic for a frame. Let's remove it as a step towards simplifying some of this code. --- src/hwr2/CMakeLists.txt | 4 - src/hwr2/pass.cpp | 16 --- src/hwr2/pass.hpp | 47 ------- src/hwr2/pass_imgui.cpp | 2 +- src/hwr2/pass_imgui.hpp | 14 +-- src/hwr2/pass_manager.cpp | 187 ---------------------------- src/hwr2/pass_manager.hpp | 66 ---------- src/hwr2/pass_resource_managers.cpp | 2 +- src/hwr2/pass_resource_managers.hpp | 32 ++--- src/hwr2/patch_atlas.hpp | 2 +- 10 files changed, 24 insertions(+), 348 deletions(-) delete mode 100644 src/hwr2/pass.cpp delete mode 100644 src/hwr2/pass.hpp delete mode 100644 src/hwr2/pass_manager.cpp delete mode 100644 src/hwr2/pass_manager.hpp diff --git a/src/hwr2/CMakeLists.txt b/src/hwr2/CMakeLists.txt index fa068990f..a6b7c61b7 100644 --- a/src/hwr2/CMakeLists.txt +++ b/src/hwr2/CMakeLists.txt @@ -7,12 +7,8 @@ target_sources(SRB2SDL2 PRIVATE hardware_state.hpp pass_imgui.cpp pass_imgui.hpp - pass_manager.cpp - pass_manager.hpp pass_resource_managers.cpp pass_resource_managers.hpp - pass.cpp - pass.hpp patch_atlas.cpp patch_atlas.hpp postprocess_wipe.cpp diff --git a/src/hwr2/pass.cpp b/src/hwr2/pass.cpp deleted file mode 100644 index 25c88ca52..000000000 --- a/src/hwr2/pass.cpp +++ /dev/null @@ -1,16 +0,0 @@ -// DR. ROBOTNIK'S RING RACERS -//----------------------------------------------------------------------------- -// Copyright (C) 2024 by Ronald "Eidolon" Kinard -// Copyright (C) 2024 by Kart Krew -// -// This program is free software distributed under the -// terms of the GNU General Public License, version 2. -// See the 'LICENSE' file for more details. -//----------------------------------------------------------------------------- - -#include "pass.hpp" - -using namespace srb2; -using namespace srb2::hwr2; - -Pass::~Pass() = default; diff --git a/src/hwr2/pass.hpp b/src/hwr2/pass.hpp deleted file mode 100644 index 1ebb916e6..000000000 --- a/src/hwr2/pass.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// DR. ROBOTNIK'S RING RACERS -//----------------------------------------------------------------------------- -// Copyright (C) 2024 by Ronald "Eidolon" Kinard -// Copyright (C) 2024 by Kart Krew -// -// This program is free software distributed under the -// terms of the GNU General Public License, version 2. -// See the 'LICENSE' file for more details. -//----------------------------------------------------------------------------- - -#ifndef __SRB2_HWR2_PASS_HPP__ -#define __SRB2_HWR2_PASS_HPP__ - -#include "../rhi/rhi.hpp" - -namespace srb2::hwr2 -{ - -/// @brief A rendering pass which performs logic during each phase of a frame render. -/// During rendering, all registered Pass's individual stages will be run together. -class Pass -{ -public: - virtual ~Pass(); - - /// @brief Perform rendering logic and create necessary GPU resources. - /// @param rhi - virtual void prepass(rhi::Rhi& rhi) = 0; - - /// @brief Upload contents for needed GPU resources. Passes must implement but this will be removed soon. - /// @param rhi - /// @param ctx - virtual void transfer(rhi::Rhi& rhi) = 0; - - /// @brief Issue draw calls. - /// @param rhi - /// @param ctx - virtual void graphics(rhi::Rhi& rhi) = 0; - - /// @brief Cleanup GPU resources. Transient resources should be cleaned up here. - /// @param rhi - virtual void postpass(rhi::Rhi& rhi) = 0; -}; - -} // namespace srb2::hwr2 - -#endif // __SRB2_HWR2_PASS_HPP__ diff --git a/src/hwr2/pass_imgui.cpp b/src/hwr2/pass_imgui.cpp index 3b8c04e04..022b68a8e 100644 --- a/src/hwr2/pass_imgui.cpp +++ b/src/hwr2/pass_imgui.cpp @@ -40,7 +40,7 @@ static const PipelineDesc kPipelineDesc = { FaceWinding::kCounterClockwise, {0.f, 0.f, 0.f, 1.f}}; -ImguiPass::ImguiPass() : Pass() +ImguiPass::ImguiPass() { } diff --git a/src/hwr2/pass_imgui.hpp b/src/hwr2/pass_imgui.hpp index 2a7e6ad4e..126554ba8 100644 --- a/src/hwr2/pass_imgui.hpp +++ b/src/hwr2/pass_imgui.hpp @@ -14,12 +14,11 @@ #include #include "../rhi/rhi.hpp" -#include "pass.hpp" namespace srb2::hwr2 { -class ImguiPass final : public Pass +class ImguiPass final { struct DrawCmd { @@ -49,13 +48,10 @@ public: ImguiPass(); virtual ~ImguiPass(); - virtual void prepass(rhi::Rhi& rhi) override; - - virtual void transfer(rhi::Rhi& rhi) override; - - virtual void graphics(rhi::Rhi& rhi) override; - - virtual void postpass(rhi::Rhi& rhi) override; + void prepass(rhi::Rhi& rhi); + void transfer(rhi::Rhi& rhi); + void graphics(rhi::Rhi& rhi); + void postpass(rhi::Rhi& rhi); }; } // namespace srb2::hwr2 diff --git a/src/hwr2/pass_manager.cpp b/src/hwr2/pass_manager.cpp deleted file mode 100644 index a66d0d492..000000000 --- a/src/hwr2/pass_manager.cpp +++ /dev/null @@ -1,187 +0,0 @@ -// DR. ROBOTNIK'S RING RACERS -//----------------------------------------------------------------------------- -// Copyright (C) 2024 by Ronald "Eidolon" Kinard -// Copyright (C) 2024 by Kart Krew -// -// This program is free software distributed under the -// terms of the GNU General Public License, version 2. -// See the 'LICENSE' file for more details. -//----------------------------------------------------------------------------- - -#include "pass_manager.hpp" - -using namespace srb2; -using namespace srb2::hwr2; -using namespace srb2::rhi; - -namespace -{ - -class LambdaPass final : public Pass -{ - PassManager* mgr_; - std::function prepass_func_; - std::function postpass_func_; - -public: - LambdaPass(PassManager* mgr, std::function prepass_func); - LambdaPass( - PassManager* mgr, - std::function prepass_func, - std::function postpass_func - ); - virtual ~LambdaPass(); - - virtual void prepass(rhi::Rhi& rhi) override; - virtual void transfer(rhi::Rhi& rhi) override; - virtual void graphics(rhi::Rhi& rhi) override; - virtual void postpass(rhi::Rhi& rhi) override; -}; - -} // namespace - -LambdaPass::LambdaPass(PassManager* mgr, std::function prepass_func) - : mgr_(mgr), prepass_func_(prepass_func) -{ -} - -LambdaPass::LambdaPass( - PassManager* mgr, - std::function prepass_func, - std::function postpass_func -) - : mgr_(mgr), prepass_func_(prepass_func), postpass_func_(postpass_func) -{ -} - -LambdaPass::~LambdaPass() = default; - -void LambdaPass::prepass(Rhi& rhi) -{ - if (prepass_func_) - { - (prepass_func_)(*mgr_, rhi); - } -} - -void LambdaPass::transfer(Rhi&) -{ -} - -void LambdaPass::graphics(Rhi&) -{ -} - -void LambdaPass::postpass(Rhi& rhi) -{ - if (postpass_func_) - { - (postpass_func_)(*mgr_, rhi); - } -} - -PassManager::PassManager() = default; -PassManager::PassManager(const PassManager&) = default; -PassManager& PassManager::operator=(const PassManager&) = default; - -void PassManager::insert(const std::string& name, std::shared_ptr pass) -{ - SRB2_ASSERT(pass_by_name_.find(name) == pass_by_name_.end()); - - std::size_t index = passes_.size(); - passes_.push_back(PassManagerEntry {name, pass, true}); - pass_by_name_.insert({name, index}); -} - -void PassManager::insert(const std::string& name, std::function prepass_func) -{ - insert(std::forward(name), std::make_shared(LambdaPass {this, prepass_func})); -} - -void PassManager::insert( - const std::string& name, - std::function prepass_func, - std::function postpass_func -) -{ - insert( - std::forward(name), - std::make_shared(LambdaPass {this, prepass_func, postpass_func}) - ); -} - -void PassManager::set_pass_enabled(const std::string& name, bool enabled) -{ - SRB2_ASSERT(pass_by_name_.find(name) != pass_by_name_.end()); - - passes_[pass_by_name_[name]].enabled = enabled; -} - -std::weak_ptr PassManager::for_name(const std::string& name) -{ - auto itr = pass_by_name_.find(name); - if (itr == pass_by_name_.end()) - { - return std::weak_ptr(); - } - return passes_[itr->second].pass; -} - -void PassManager::prepass(Rhi& rhi) -{ - for (auto& pass : passes_) - { - if (pass.enabled) - { - pass.pass->prepass(rhi); - } - } -} - -void PassManager::transfer(Rhi& rhi) -{ - for (auto& pass : passes_) - { - if (pass.enabled) - { - pass.pass->transfer(rhi); - } - } -} - -void PassManager::graphics(Rhi& rhi) -{ - for (auto& pass : passes_) - { - if (pass.enabled) - { - pass.pass->graphics(rhi); - } - } -} - -void PassManager::postpass(Rhi& rhi) -{ - for (auto& pass : passes_) - { - if (pass.enabled) - { - pass.pass->postpass(rhi); - } - } -} - -void PassManager::render(Rhi& rhi) -{ - if (passes_.empty()) - { - return; - } - - prepass(rhi); - - transfer(rhi); - graphics(rhi); - - postpass(rhi); -} diff --git a/src/hwr2/pass_manager.hpp b/src/hwr2/pass_manager.hpp deleted file mode 100644 index b163c7886..000000000 --- a/src/hwr2/pass_manager.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// DR. ROBOTNIK'S RING RACERS -//----------------------------------------------------------------------------- -// Copyright (C) 2024 by Ronald "Eidolon" Kinard -// Copyright (C) 2024 by Kart Krew -// -// This program is free software distributed under the -// terms of the GNU General Public License, version 2. -// See the 'LICENSE' file for more details. -//----------------------------------------------------------------------------- - -#ifndef __SRB2_HWR2_PASS_MANAGER_HPP__ -#define __SRB2_HWR2_PASS_MANAGER_HPP__ - -#include -#include -#include -#include -#include -#include - -#include "../rhi/rhi.hpp" -#include "pass.hpp" - -namespace srb2::hwr2 -{ - -class PassManager final : public Pass -{ - struct PassManagerEntry - { - std::string name; - std::shared_ptr pass; - bool enabled; - }; - - std::unordered_map pass_by_name_; - std::vector passes_; - -public: - PassManager(); - PassManager(const PassManager&); - PassManager(PassManager&&) = delete; - PassManager& operator=(const PassManager&); - PassManager& operator=(PassManager&&) = delete; - - virtual void prepass(rhi::Rhi& rhi) override; - virtual void transfer(rhi::Rhi& rhi) override; - virtual void graphics(rhi::Rhi& rhi) override; - virtual void postpass(rhi::Rhi& rhi) override; - - void insert(const std::string& name, std::shared_ptr pass); - void insert(const std::string& name, std::function prepass_func); - void insert( - const std::string& name, - std::function prepass_func, - std::function postpass_func - ); - std::weak_ptr for_name(const std::string& name); - void set_pass_enabled(const std::string& name, bool enabled); - - void render(rhi::Rhi& rhi); -}; - -} // namespace srb2::hwr2 - -#endif // __SRB2_HWR2_PASS_MANAGER_HPP__ diff --git a/src/hwr2/pass_resource_managers.cpp b/src/hwr2/pass_resource_managers.cpp index e635a6511..84abc5601 100644 --- a/src/hwr2/pass_resource_managers.cpp +++ b/src/hwr2/pass_resource_managers.cpp @@ -21,7 +21,7 @@ using namespace srb2; using namespace srb2::hwr2; using namespace srb2::rhi; -FramebufferManager::FramebufferManager() : Pass() +FramebufferManager::FramebufferManager() { } diff --git a/src/hwr2/pass_resource_managers.hpp b/src/hwr2/pass_resource_managers.hpp index faef32a42..79b33db8d 100644 --- a/src/hwr2/pass_resource_managers.hpp +++ b/src/hwr2/pass_resource_managers.hpp @@ -16,12 +16,12 @@ #include #include -#include "pass.hpp" +#include "../rhi/rhi.hpp" namespace srb2::hwr2 { -class FramebufferManager final : public Pass +class FramebufferManager final { rhi::Handle main_color_; std::array, 2> post_colors_; @@ -36,10 +36,10 @@ public: FramebufferManager(); virtual ~FramebufferManager(); - virtual void prepass(rhi::Rhi& rhi) override; - virtual void transfer(rhi::Rhi& rhi) override; - virtual void graphics(rhi::Rhi& rhi) override; - virtual void postpass(rhi::Rhi& rhi) override; + void prepass(rhi::Rhi& rhi); + void transfer(rhi::Rhi& rhi); + void graphics(rhi::Rhi& rhi); + void postpass(rhi::Rhi& rhi); /// @brief Swap the current and previous postprocess FB textures. Use between pass prepass phases to alternate. void swap_post() noexcept @@ -70,7 +70,7 @@ public: std::size_t height() const noexcept { return height_; } }; -class MainPaletteManager final : public Pass +class MainPaletteManager final { rhi::Handle palette_; rhi::Handle lighttable_; @@ -91,10 +91,10 @@ public: MainPaletteManager(); virtual ~MainPaletteManager(); - virtual void prepass(rhi::Rhi& rhi) override; - virtual void transfer(rhi::Rhi& rhi) override; - virtual void graphics(rhi::Rhi& rhi) override; - virtual void postpass(rhi::Rhi& rhi) override; + void prepass(rhi::Rhi& rhi); + void transfer(rhi::Rhi& rhi); + void graphics(rhi::Rhi& rhi); + void postpass(rhi::Rhi& rhi); rhi::Handle palette() const noexcept { return palette_; } rhi::Handle lighttable() const noexcept { return lighttable_; } @@ -107,7 +107,7 @@ public: rhi::Handle find_extra_lighttable(srb2::NotNull lighttable) const; }; -class CommonResourcesManager final : public Pass +class CommonResourcesManager final { bool init_ = false; rhi::Handle black_; @@ -118,10 +118,10 @@ public: CommonResourcesManager(); virtual ~CommonResourcesManager(); - virtual void prepass(rhi::Rhi& rhi) override; - virtual void transfer(rhi::Rhi& rhi) override; - virtual void graphics(rhi::Rhi& rhi) override; - virtual void postpass(rhi::Rhi& rhi) override; + void prepass(rhi::Rhi& rhi); + void transfer(rhi::Rhi& rhi); + void graphics(rhi::Rhi& rhi); + void postpass(rhi::Rhi& rhi); rhi::Handle black() const noexcept { return black_; } rhi::Handle white() const noexcept { return white_; } diff --git a/src/hwr2/patch_atlas.hpp b/src/hwr2/patch_atlas.hpp index 6d9536d86..e57c1daec 100644 --- a/src/hwr2/patch_atlas.hpp +++ b/src/hwr2/patch_atlas.hpp @@ -20,8 +20,8 @@ #include -#include "pass.hpp" #include "../r_defs.h" +#include "../rhi/rhi.hpp" extern "C" {