Archived
1
Fork 0

Allow overriding the gfx backend at runtime

You can now specify -vulkan, -metal, etc to the SDL backend.
This commit is contained in:
Joshua Goins 2022-02-21 12:27:29 -05:00
parent 138cbf3f4b
commit 5401188196
2 changed files with 39 additions and 4 deletions

View file

@ -111,4 +111,14 @@ namespace utility {
return linear;
}
template<typename T, typename F>
inline void move_to_front(std::vector<T>& vec, F func) {
auto result = std::find_if(vec.begin(), vec.end(), func);
if (result != vec.end()) {
auto value = *result;
vec.erase(result);
vec.insert(vec.begin(), value);
}
}
}

View file

@ -407,21 +407,46 @@ void try_initialize() {
}
}
struct gfx_backend_initializer {
gfx_backend_initializer(std::string_view n, std::function<void()> f) : name(n), init_func(f) {}
std::string_view name;
std::function<void()> init_func;
};
std::vector<gfx_backend_initializer> gfx_backend_order;
int main(int argc, char* argv[]) {
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
engine = new prism::engine(argc, argv);
// determine gfx context at the beginning
#ifdef ENABLE_METAL
gfx_backend_order.emplace_back(gfx_backend_initializer{"metal", []{
try_initialize<GFXMetal>();
}});
#endif
#ifdef ENABLE_VULKAN
gfx_backend_order.emplace_back(gfx_backend_initializer{"vulkan", []{
try_initialize<GFXVulkan>();
}});
#endif
gfx_backend_order.emplace_back(gfx_backend_initializer{"dummy", []{
try_initialize<GFXDummy>();
}});
engine = new prism::engine(argc, argv);
for(auto arg : engine->command_line_arguments) {
utility::move_to_front(gfx_backend_order, [arg](gfx_backend_initializer& init) {
return arg == "-" + std::string(init.name);
});
}
for(auto backend : gfx_backend_order) {
backend.init_func();
}
app = new @APP_CLASS@();
engine->set_app(app);