Allow overriding the gfx backend at runtime
You can now specify -vulkan, -metal, etc to the SDL backend.
This commit is contained in:
parent
138cbf3f4b
commit
5401188196
2 changed files with 39 additions and 4 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Reference in a new issue