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;
|
||||
|
||||
std::string get_graphics_api_name() const;
|
||||
|
||||
auto operator<=>(const GraphicsConfig& rhs) const = default;
|
||||
};
|
||||
|
||||
|
|
@ -103,6 +101,7 @@ namespace ultramodern {
|
|||
{ultramodern::renderer::GraphicsApi::Auto, "Auto"},
|
||||
{ultramodern::renderer::GraphicsApi::D3D12, "D3D12"},
|
||||
{ultramodern::renderer::GraphicsApi::Vulkan, "Vulkan"},
|
||||
{ultramodern::renderer::GraphicsApi::Metal, "Metal"},
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(ultramodern::renderer::AspectRatio, {
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ namespace ultramodern {
|
|||
|
||||
virtual bool valid() = 0;
|
||||
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;
|
||||
|
||||
|
|
@ -74,11 +75,12 @@ namespace ultramodern {
|
|||
|
||||
protected:
|
||||
SetupResult setup_result;
|
||||
GraphicsApi chosen_api;
|
||||
};
|
||||
|
||||
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);
|
||||
using get_graphics_api_name_t = std::string(GraphicsApi api);
|
||||
|
||||
/**
|
||||
* 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::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::GraphicsApi> renderer_chosen_api = ultramodern::renderer::GraphicsApi::Auto;
|
||||
|
||||
void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_ready, ultramodern::renderer::WindowHandle window_handle) {
|
||||
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);
|
||||
|
||||
renderer_chosen_api.store(renderer_context->get_chosen_api());
|
||||
if (!renderer_context->valid()) {
|
||||
renderer_setup_result.store(renderer_context->get_setup_result());
|
||||
// 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.");
|
||||
break;
|
||||
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;
|
||||
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;
|
||||
case ultramodern::renderer::SetupResult::GraphicsDeviceNotFound:
|
||||
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);
|
||||
}
|
||||
|
||||
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) {
|
||||
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);
|
||||
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