Allow registering get_graphics_api_name

This commit is contained in:
Angie 2024-06-04 14:47:57 -04:00 committed by angie
parent ae53e8e372
commit 03e97ef101
4 changed files with 34 additions and 24 deletions

View file

@ -71,10 +71,9 @@ namespace ultramodern {
int rr_manual_value; int rr_manual_value;
int ds_option; int ds_option;
virtual ~GraphicsConfig(); virtual ~GraphicsConfig() = default;
virtual std::string get_graphics_api_name() const; std::string get_graphics_api_name() const;
virtual std::optional<uint32_t> get_target_framerate(uint32_t original) const;
auto operator<=>(const GraphicsConfig& rhs) const = default; auto operator<=>(const GraphicsConfig& rhs) const = default;
}; };

View file

@ -46,13 +46,26 @@ namespace ultramodern {
struct callbacks_t { struct callbacks_t {
using create_render_context_t = std::unique_ptr<RendererContext>(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); using create_render_context_t = std::unique_ptr<RendererContext>(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; 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); void set_callbacks(const callbacks_t& callbacks);
std::unique_ptr<RendererContext> create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode); std::unique_ptr<RendererContext> create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode);
std::string get_graphics_api_name(const GraphicsConfig& config);
} }
} }

View file

@ -227,13 +227,18 @@ std::atomic_uint32_t display_refresh_rate = 60;
std::atomic<float> resolution_scale = 1.0f; std::atomic<float> resolution_scale = 1.0f;
uint32_t ultramodern::get_target_framerate(uint32_t original) { 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()) { switch (config.rr_option) {
return maybe_framerate.value(); 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() { uint32_t ultramodern::get_display_refresh_rate() {
return display_refresh_rate.load(); return display_refresh_rate.load();
@ -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."); show_renderer_error("Failed to load dynamic libraries. Make sure the DLLs are next to the recomp executable.");
break; break;
case ultramodern::renderer::SetupResult::InvalidGraphicsAPI: 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; break;
case ultramodern::renderer::SetupResult::GraphicsAPINotFound: 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; break;
case ultramodern::renderer::SetupResult::GraphicsDeviceNotFound: case ultramodern::renderer::SetupResult::GraphicsDeviceNotFound:
show_renderer_error("Unable to find compatible graphics device." + driver_os_suffix); show_renderer_error("Unable to find compatible graphics device." + driver_os_suffix);

View file

@ -12,7 +12,7 @@ void ultramodern::renderer::set_callbacks(const callbacks_t& callbacks) {
std::unique_ptr<ultramodern::renderer::RendererContext> ultramodern::renderer::create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode) { std::unique_ptr<ultramodern::renderer::RendererContext> ultramodern::renderer::create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode) {
if (render_callbacks.create_render_context == nullptr) { 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? // TODO: should we make a macro for this?
error_handling::quick_exit(__FILE__, __LINE__, __func__); error_handling::quick_exit(__FILE__, __LINE__, __func__);
} }
@ -20,6 +20,13 @@ std::unique_ptr<ultramodern::renderer::RendererContext> ultramodern::renderer::c
return render_callbacks.create_render_context(rdram, window_handle, developer_mode); 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 ultramodern::renderer::GraphicsConfig graphic_config{};
static std::mutex graphic_config_mutex; static std::mutex graphic_config_mutex;
@ -35,8 +42,6 @@ const ultramodern::renderer::GraphicsConfig& ultramodern::renderer::get_graphics
return graphic_config; return graphic_config;
} }
ultramodern::renderer::GraphicsConfig::~GraphicsConfig() = default;
std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const { std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const {
ultramodern::renderer::GraphicsApi api = api_option; ultramodern::renderer::GraphicsApi api = api_option;
@ -62,15 +67,3 @@ std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const
return "[Unknown graphics API]"; return "[Unknown graphics API]";
} }
} }
std::optional<uint32_t> 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 {};
}
}