mirror of
https://github.com/N64Recomp/N64ModernRuntime.git
synced 2025-10-30 08:02:29 +00:00
Allow renderers to pick the graphics API (#96)
Some checks failed
validate / ubuntu (arm64, Debug) (push) Has been cancelled
validate / ubuntu (arm64, Release) (push) Has been cancelled
validate / ubuntu (x64, Debug) (push) Has been cancelled
validate / ubuntu (x64, Release) (push) Has been cancelled
validate / windows (x64, Debug) (push) Has been cancelled
validate / windows (x64, Release) (push) Has been cancelled
validate / macos (arm64, Debug) (push) Has been cancelled
validate / macos (arm64, Release) (push) Has been cancelled
validate / macos (x64, Debug) (push) Has been cancelled
validate / macos (x64, Release) (push) Has been cancelled
Some checks failed
validate / ubuntu (arm64, Debug) (push) Has been cancelled
validate / ubuntu (arm64, Release) (push) Has been cancelled
validate / ubuntu (x64, Debug) (push) Has been cancelled
validate / ubuntu (x64, Release) (push) Has been cancelled
validate / windows (x64, Debug) (push) Has been cancelled
validate / windows (x64, Release) (push) Has been cancelled
validate / macos (arm64, Debug) (push) Has been cancelled
validate / macos (arm64, Release) (push) Has been cancelled
validate / macos (x64, Debug) (push) Has been cancelled
validate / macos (x64, Release) (push) Has been cancelled
This commit is contained in:
parent
2ed84f46c5
commit
6f8393f691
4 changed files with 23 additions and 36 deletions
|
|
@ -74,8 +74,6 @@ namespace ultramodern {
|
||||||
|
|
||||||
virtual ~GraphicsConfig() = default;
|
virtual ~GraphicsConfig() = default;
|
||||||
|
|
||||||
std::string get_graphics_api_name() const;
|
|
||||||
|
|
||||||
auto operator<=>(const GraphicsConfig& rhs) const = default;
|
auto operator<=>(const GraphicsConfig& rhs) const = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -103,6 +101,7 @@ namespace ultramodern {
|
||||||
{ultramodern::renderer::GraphicsApi::Auto, "Auto"},
|
{ultramodern::renderer::GraphicsApi::Auto, "Auto"},
|
||||||
{ultramodern::renderer::GraphicsApi::D3D12, "D3D12"},
|
{ultramodern::renderer::GraphicsApi::D3D12, "D3D12"},
|
||||||
{ultramodern::renderer::GraphicsApi::Vulkan, "Vulkan"},
|
{ultramodern::renderer::GraphicsApi::Vulkan, "Vulkan"},
|
||||||
|
{ultramodern::renderer::GraphicsApi::Metal, "Metal"},
|
||||||
});
|
});
|
||||||
|
|
||||||
NLOHMANN_JSON_SERIALIZE_ENUM(ultramodern::renderer::AspectRatio, {
|
NLOHMANN_JSON_SERIALIZE_ENUM(ultramodern::renderer::AspectRatio, {
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ namespace ultramodern {
|
||||||
|
|
||||||
virtual bool valid() = 0;
|
virtual bool valid() = 0;
|
||||||
virtual SetupResult get_setup_result() const { return setup_result; }
|
virtual SetupResult get_setup_result() const { return setup_result; }
|
||||||
|
virtual GraphicsApi get_chosen_api() const { return chosen_api; }
|
||||||
|
|
||||||
virtual bool update_config(const GraphicsConfig& old_config, const GraphicsConfig& new_config) = 0;
|
virtual bool update_config(const GraphicsConfig& old_config, const GraphicsConfig& new_config) = 0;
|
||||||
|
|
||||||
|
|
@ -74,11 +75,12 @@ namespace ultramodern {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SetupResult setup_result;
|
SetupResult setup_result;
|
||||||
|
GraphicsApi chosen_api;
|
||||||
};
|
};
|
||||||
|
|
||||||
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);
|
using get_graphics_api_name_t = std::string(GraphicsApi api);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instances a subclass of RendererContext that is used to render the game.
|
* Instances a subclass of RendererContext that is used to render the game.
|
||||||
|
|
@ -97,7 +99,7 @@ namespace ultramodern {
|
||||||
|
|
||||||
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);
|
std::string get_graphics_api_name(GraphicsApi api);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -249,6 +249,7 @@ void ultramodern::trigger_config_action() {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::atomic<ultramodern::renderer::SetupResult> renderer_setup_result = ultramodern::renderer::SetupResult::Success;
|
std::atomic<ultramodern::renderer::SetupResult> renderer_setup_result = ultramodern::renderer::SetupResult::Success;
|
||||||
|
std::atomic<ultramodern::renderer::GraphicsApi> renderer_chosen_api = ultramodern::renderer::GraphicsApi::Auto;
|
||||||
|
|
||||||
void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_ready, ultramodern::renderer::WindowHandle window_handle) {
|
void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_ready, ultramodern::renderer::WindowHandle window_handle) {
|
||||||
bool enabled_instant_present = false;
|
bool enabled_instant_present = false;
|
||||||
|
|
@ -261,6 +262,7 @@ void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_re
|
||||||
|
|
||||||
auto renderer_context = ultramodern::renderer::create_render_context(rdram, window_handle, ultramodern::renderer::get_graphics_config().developer_mode);
|
auto renderer_context = ultramodern::renderer::create_render_context(rdram, window_handle, ultramodern::renderer::get_graphics_config().developer_mode);
|
||||||
|
|
||||||
|
renderer_chosen_api.store(renderer_context->get_chosen_api());
|
||||||
if (!renderer_context->valid()) {
|
if (!renderer_context->valid()) {
|
||||||
renderer_setup_result.store(renderer_context->get_setup_result());
|
renderer_setup_result.store(renderer_context->get_setup_result());
|
||||||
// Notify the caller thread that this thread is ready.
|
// Notify the caller thread that this thread is ready.
|
||||||
|
|
@ -534,10 +536,10 @@ void ultramodern::init_events(RDRAM_ARG ultramodern::renderer::WindowHandle wind
|
||||||
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_api_name(ultramodern::renderer::get_graphics_config()) + " is not supported on this platform. Please select a different graphics API.");
|
show_renderer_error(ultramodern::renderer::get_graphics_api_name(renderer_chosen_api.load()) + " 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_api_name(ultramodern::renderer::get_graphics_config()) + "." + driver_os_suffix);
|
show_renderer_error("Unable to initialize " + ultramodern::renderer::get_graphics_api_name(renderer_chosen_api.load()) + "." + 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);
|
||||||
|
|
|
||||||
|
|
@ -20,11 +20,22 @@ 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) {
|
std::string ultramodern::renderer::get_graphics_api_name(GraphicsApi api) {
|
||||||
if (render_callbacks.get_graphics_api_name != nullptr) {
|
if (render_callbacks.get_graphics_api_name != nullptr) {
|
||||||
return render_callbacks.get_graphics_api_name(config);
|
return render_callbacks.get_graphics_api_name(api);
|
||||||
|
}
|
||||||
|
switch (api) {
|
||||||
|
case ultramodern::renderer::GraphicsApi::Auto:
|
||||||
|
return "Auto";
|
||||||
|
case ultramodern::renderer::GraphicsApi::D3D12:
|
||||||
|
return "D3D12";
|
||||||
|
case ultramodern::renderer::GraphicsApi::Vulkan:
|
||||||
|
return "Vulkan";
|
||||||
|
case ultramodern::renderer::GraphicsApi::Metal:
|
||||||
|
return "Metal";
|
||||||
|
default:
|
||||||
|
return "[Unknown graphics API]";
|
||||||
}
|
}
|
||||||
return config.get_graphics_api_name();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -41,30 +52,3 @@ const ultramodern::renderer::GraphicsConfig& ultramodern::renderer::get_graphics
|
||||||
std::lock_guard<std::mutex> lock(graphic_config_mutex);
|
std::lock_guard<std::mutex> lock(graphic_config_mutex);
|
||||||
return graphic_config;
|
return graphic_config;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const {
|
|
||||||
ultramodern::renderer::GraphicsApi api = api_option;
|
|
||||||
|
|
||||||
if (api == ultramodern::renderer::GraphicsApi::Auto) {
|
|
||||||
#if defined(_WIN32)
|
|
||||||
api = ultramodern::renderer::GraphicsApi::D3D12;
|
|
||||||
#elif defined(__gnu_linux__)
|
|
||||||
api = ultramodern::renderer::GraphicsApi::Vulkan;
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
api = ultramodern::renderer::GraphicsApi::Metal;
|
|
||||||
#else
|
|
||||||
static_assert(false && "Unimplemented")
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (api) {
|
|
||||||
case ultramodern::renderer::GraphicsApi::D3D12:
|
|
||||||
return "D3D12";
|
|
||||||
case ultramodern::renderer::GraphicsApi::Vulkan:
|
|
||||||
return "Vulkan";
|
|
||||||
case ultramodern::renderer::GraphicsApi::Metal:
|
|
||||||
return "Metal";
|
|
||||||
default:
|
|
||||||
return "[Unknown graphics API]";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue