Skip to content

Commit 6f8393f

Browse files
authored
Allow renderers to pick the graphics API (#96)
1 parent 2ed84f4 commit 6f8393f

File tree

4 files changed

+23
-36
lines changed

4 files changed

+23
-36
lines changed

ultramodern/include/ultramodern/config.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,6 @@ namespace ultramodern {
7474

7575
virtual ~GraphicsConfig() = default;
7676

77-
std::string get_graphics_api_name() const;
78-
7977
auto operator<=>(const GraphicsConfig& rhs) const = default;
8078
};
8179

@@ -103,6 +101,7 @@ namespace ultramodern {
103101
{ultramodern::renderer::GraphicsApi::Auto, "Auto"},
104102
{ultramodern::renderer::GraphicsApi::D3D12, "D3D12"},
105103
{ultramodern::renderer::GraphicsApi::Vulkan, "Vulkan"},
104+
{ultramodern::renderer::GraphicsApi::Metal, "Metal"},
106105
});
107106

108107
NLOHMANN_JSON_SERIALIZE_ENUM(ultramodern::renderer::AspectRatio, {

ultramodern/include/ultramodern/renderer_context.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ namespace ultramodern {
6262

6363
virtual bool valid() = 0;
6464
virtual SetupResult get_setup_result() const { return setup_result; }
65+
virtual GraphicsApi get_chosen_api() const { return chosen_api; }
6566

6667
virtual bool update_config(const GraphicsConfig& old_config, const GraphicsConfig& new_config) = 0;
6768

@@ -74,11 +75,12 @@ namespace ultramodern {
7475

7576
protected:
7677
SetupResult setup_result;
78+
GraphicsApi chosen_api;
7779
};
7880

7981
struct callbacks_t {
8082
using create_render_context_t = std::unique_ptr<RendererContext>(uint8_t* rdram, WindowHandle window_handle, bool developer_mode);
81-
using get_graphics_api_name_t = std::string(const GraphicsConfig& config);
83+
using get_graphics_api_name_t = std::string(GraphicsApi api);
8284

8385
/**
8486
* Instances a subclass of RendererContext that is used to render the game.
@@ -97,7 +99,7 @@ namespace ultramodern {
9799

98100
std::unique_ptr<RendererContext> create_render_context(uint8_t* rdram, WindowHandle window_handle, bool developer_mode);
99101

100-
std::string get_graphics_api_name(const GraphicsConfig& config);
102+
std::string get_graphics_api_name(GraphicsApi api);
101103
}
102104
}
103105

ultramodern/src/events.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@ void ultramodern::trigger_config_action() {
249249
}
250250

251251
std::atomic<ultramodern::renderer::SetupResult> renderer_setup_result = ultramodern::renderer::SetupResult::Success;
252+
std::atomic<ultramodern::renderer::GraphicsApi> renderer_chosen_api = ultramodern::renderer::GraphicsApi::Auto;
252253

253254
void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_ready, ultramodern::renderer::WindowHandle window_handle) {
254255
bool enabled_instant_present = false;
@@ -261,6 +262,7 @@ void gfx_thread_func(uint8_t* rdram, moodycamel::LightweightSemaphore* thread_re
261262

262263
auto renderer_context = ultramodern::renderer::create_render_context(rdram, window_handle, ultramodern::renderer::get_graphics_config().developer_mode);
263264

265+
renderer_chosen_api.store(renderer_context->get_chosen_api());
264266
if (!renderer_context->valid()) {
265267
renderer_setup_result.store(renderer_context->get_setup_result());
266268
// Notify the caller thread that this thread is ready.
@@ -534,10 +536,10 @@ void ultramodern::init_events(RDRAM_ARG ultramodern::renderer::WindowHandle wind
534536
show_renderer_error("Failed to load dynamic libraries. Make sure the DLLs are next to the recomp executable.");
535537
break;
536538
case ultramodern::renderer::SetupResult::InvalidGraphicsAPI:
537-
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.");
539+
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.");
538540
break;
539541
case ultramodern::renderer::SetupResult::GraphicsAPINotFound:
540-
show_renderer_error("Unable to initialize " + ultramodern::renderer::get_graphics_api_name(ultramodern::renderer::get_graphics_config()) + "." + driver_os_suffix);
542+
show_renderer_error("Unable to initialize " + ultramodern::renderer::get_graphics_api_name(renderer_chosen_api.load()) + "." + driver_os_suffix);
541543
break;
542544
case ultramodern::renderer::SetupResult::GraphicsDeviceNotFound:
543545
show_renderer_error("Unable to find compatible graphics device." + driver_os_suffix);

ultramodern/src/renderer_context.cpp

Lines changed: 14 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,22 @@ std::unique_ptr<ultramodern::renderer::RendererContext> ultramodern::renderer::c
2020
return render_callbacks.create_render_context(rdram, window_handle, developer_mode);
2121
}
2222

23-
std::string ultramodern::renderer::get_graphics_api_name(const GraphicsConfig& config) {
23+
std::string ultramodern::renderer::get_graphics_api_name(GraphicsApi api) {
2424
if (render_callbacks.get_graphics_api_name != nullptr) {
25-
return render_callbacks.get_graphics_api_name(config);
25+
return render_callbacks.get_graphics_api_name(api);
26+
}
27+
switch (api) {
28+
case ultramodern::renderer::GraphicsApi::Auto:
29+
return "Auto";
30+
case ultramodern::renderer::GraphicsApi::D3D12:
31+
return "D3D12";
32+
case ultramodern::renderer::GraphicsApi::Vulkan:
33+
return "Vulkan";
34+
case ultramodern::renderer::GraphicsApi::Metal:
35+
return "Metal";
36+
default:
37+
return "[Unknown graphics API]";
2638
}
27-
return config.get_graphics_api_name();
2839
}
2940

3041

@@ -41,30 +52,3 @@ const ultramodern::renderer::GraphicsConfig& ultramodern::renderer::get_graphics
4152
std::lock_guard<std::mutex> lock(graphic_config_mutex);
4253
return graphic_config;
4354
}
44-
45-
std::string ultramodern::renderer::GraphicsConfig::get_graphics_api_name() const {
46-
ultramodern::renderer::GraphicsApi api = api_option;
47-
48-
if (api == ultramodern::renderer::GraphicsApi::Auto) {
49-
#if defined(_WIN32)
50-
api = ultramodern::renderer::GraphicsApi::D3D12;
51-
#elif defined(__gnu_linux__)
52-
api = ultramodern::renderer::GraphicsApi::Vulkan;
53-
#elif defined(__APPLE__)
54-
api = ultramodern::renderer::GraphicsApi::Metal;
55-
#else
56-
static_assert(false && "Unimplemented")
57-
#endif
58-
}
59-
60-
switch (api) {
61-
case ultramodern::renderer::GraphicsApi::D3D12:
62-
return "D3D12";
63-
case ultramodern::renderer::GraphicsApi::Vulkan:
64-
return "Vulkan";
65-
case ultramodern::renderer::GraphicsApi::Metal:
66-
return "Metal";
67-
default:
68-
return "[Unknown graphics API]";
69-
}
70-
}

0 commit comments

Comments
 (0)