From 03e97ef10171a5166358ef09119f2357f901d7ff Mon Sep 17 00:00:00 2001 From: Angie Date: Tue, 4 Jun 2024 14:47:57 -0400 Subject: [PATCH] Allow registering get_graphics_api_name --- ultramodern/include/ultramodern/config.hpp | 5 ++-- .../include/ultramodern/renderer_context.hpp | 13 +++++++++++ ultramodern/src/events.cpp | 17 +++++++++----- ultramodern/src/renderer_context.cpp | 23 +++++++------------ 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/ultramodern/include/ultramodern/config.hpp b/ultramodern/include/ultramodern/config.hpp index cf0812a..29c1fe9 100644 --- a/ultramodern/include/ultramodern/config.hpp +++ b/ultramodern/include/ultramodern/config.hpp @@ -71,10 +71,9 @@ namespace ultramodern { int rr_manual_value; int ds_option; - virtual ~GraphicsConfig(); + virtual ~GraphicsConfig() = default; - virtual std::string get_graphics_api_name() const; - virtual std::optional get_target_framerate(uint32_t original) const; + std::string get_graphics_api_name() const; auto operator<=>(const GraphicsConfig& rhs) const = default; }; diff --git a/ultramodern/include/ultramodern/renderer_context.hpp b/ultramodern/include/ultramodern/renderer_context.hpp index e5d4df7..3ad2e51 100644 --- a/ultramodern/include/ultramodern/renderer_context.hpp +++ b/ultramodern/include/ultramodern/renderer_context.hpp @@ -46,13 +46,26 @@ namespace ultramodern { struct callbacks_t { using create_render_context_t = std::unique_ptr(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); + using get_graphics_api_name_t = std::string(const GraphicsConfig& config); + /** + * Instances a subclass of RendererContext that is used to render the game. + * + * This callback is mandatory for using the library. + */ create_render_context_t *create_render_context; + + /** + * This callback is optional. If not provided a library default will be used. + */ + get_graphics_api_name_t *get_graphics_api_name; }; void set_callbacks(const callbacks_t& callbacks); std::unique_ptr create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); + + std::string get_graphics_api_name(const GraphicsConfig& config); } } diff --git a/ultramodern/src/events.cpp b/ultramodern/src/events.cpp index 1e01958..30179f3 100644 --- a/ultramodern/src/events.cpp +++ b/ultramodern/src/events.cpp @@ -227,12 +227,17 @@ std::atomic_uint32_t display_refresh_rate = 60; std::atomic resolution_scale = 1.0f; uint32_t ultramodern::get_target_framerate(uint32_t original) { - auto maybe_framerate = ultramodern::renderer::get_graphics_config().get_target_framerate(original); + auto& config = ultramodern::renderer::get_graphics_config(); - if (maybe_framerate.has_value()) { - return maybe_framerate.value(); + switch (config.rr_option) { + default: + case ultramodern::renderer::RefreshRate::Original: + return original; + case ultramodern::renderer::RefreshRate::Manual: + return config.rr_manual_value; + case ultramodern::renderer::RefreshRate::Display: + return display_refresh_rate.load(); } - return display_refresh_rate.load(); } uint32_t ultramodern::get_display_refresh_rate() { @@ -520,10 +525,10 @@ void ultramodern::init_events(RDRAM_ARG ultramodern::WindowHandle window_handle) show_renderer_error("Failed to load dynamic libraries. Make sure the DLLs are next to the recomp executable."); break; case ultramodern::renderer::SetupResult::InvalidGraphicsAPI: - show_renderer_error(ultramodern::renderer::get_graphics_config().get_graphics_api_name() + " is not supported on this platform. Please select a different graphics API."); + show_renderer_error(ultramodern::renderer::get_graphics_api_name(ultramodern::renderer::get_graphics_config()) + " is not supported on this platform. Please select a different graphics API."); break; case ultramodern::renderer::SetupResult::GraphicsAPINotFound: - show_renderer_error("Unable to initialize " + ultramodern::renderer::get_graphics_config().get_graphics_api_name() + "." + driver_os_suffix); + show_renderer_error("Unable to initialize " + ultramodern::renderer::get_graphics_api_name(ultramodern::renderer::get_graphics_config()) + "." + driver_os_suffix); break; case ultramodern::renderer::SetupResult::GraphicsDeviceNotFound: show_renderer_error("Unable to find compatible graphics device." + driver_os_suffix); diff --git a/ultramodern/src/renderer_context.cpp b/ultramodern/src/renderer_context.cpp index 8af8769..909fdee 100644 --- a/ultramodern/src/renderer_context.cpp +++ b/ultramodern/src/renderer_context.cpp @@ -12,7 +12,7 @@ void ultramodern::renderer::set_callbacks(const callbacks_t& callbacks) { std::unique_ptr ultramodern::renderer::create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode) { if (render_callbacks.create_render_context == nullptr) { - error_handling::message_box("[Error] The render callback `create_render_context` was not registered"); + error_handling::message_box("[Error] The mandatory render callback `create_render_context` was not registered"); // TODO: should we make a macro for this? error_handling::quick_exit(__FILE__, __LINE__, __func__); } @@ -20,6 +20,13 @@ std::unique_ptr ultramodern::renderer::c return render_callbacks.create_render_context(rdram, window_handle, developer_mode); } +std::string ultramodern::renderer::get_graphics_api_name(const GraphicsConfig& config) { + if (render_callbacks.get_graphics_api_name != nullptr) { + return render_callbacks.get_graphics_api_name(config); + } + return config.get_graphics_api_name(); +} + static ultramodern::renderer::GraphicsConfig graphic_config{}; static std::mutex graphic_config_mutex; @@ -35,8 +42,6 @@ const ultramodern::renderer::GraphicsConfig& ultramodern::renderer::get_graphics return graphic_config; } -ultramodern::renderer::GraphicsConfig::~GraphicsConfig() = default; - std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const { ultramodern::renderer::GraphicsApi api = api_option; @@ -62,15 +67,3 @@ std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const return "[Unknown graphics API]"; } } - -std::optional ultramodern::renderer::GraphicsConfig::get_target_framerate(uint32_t original) const { - switch (rr_option) { - default: - case ultramodern::renderer::RefreshRate::Original: - return original; - case ultramodern::renderer::RefreshRate::Manual: - return rr_manual_value; - case ultramodern::renderer::RefreshRate::Display: - return {}; - } -}