mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2026-05-10 19:01:53 +00:00
Allow registering get_graphics_api_name
This commit is contained in:
parent
ae53e8e372
commit
03e97ef101
4 changed files with 34 additions and 24 deletions
|
|
@ -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<uint32_t> get_target_framerate(uint32_t original) const;
|
||||
std::string get_graphics_api_name() const;
|
||||
|
||||
auto operator<=>(const GraphicsConfig& rhs) const = default;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -46,13 +46,26 @@ namespace ultramodern {
|
|||
|
||||
struct callbacks_t {
|
||||
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;
|
||||
|
||||
/**
|
||||
* 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<RendererContext> create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode);
|
||||
|
||||
std::string get_graphics_api_name(const GraphicsConfig& config);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -227,12 +227,17 @@ std::atomic_uint32_t display_refresh_rate = 60;
|
|||
std::atomic<float> 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);
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
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::RendererContext> 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<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 {};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue