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;
|
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[]) {
|
int main(int argc, char* argv[]) {
|
||||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
|
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
|
||||||
|
|
||||||
|
engine = new prism::engine(argc, argv);
|
||||||
|
|
||||||
// determine gfx context at the beginning
|
// determine gfx context at the beginning
|
||||||
#ifdef ENABLE_METAL
|
#ifdef ENABLE_METAL
|
||||||
|
gfx_backend_order.emplace_back(gfx_backend_initializer{"metal", []{
|
||||||
try_initialize<GFXMetal>();
|
try_initialize<GFXMetal>();
|
||||||
|
}});
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ENABLE_VULKAN
|
#ifdef ENABLE_VULKAN
|
||||||
|
gfx_backend_order.emplace_back(gfx_backend_initializer{"vulkan", []{
|
||||||
try_initialize<GFXVulkan>();
|
try_initialize<GFXVulkan>();
|
||||||
|
}});
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
gfx_backend_order.emplace_back(gfx_backend_initializer{"dummy", []{
|
||||||
try_initialize<GFXDummy>();
|
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@();
|
app = new @APP_CLASS@();
|
||||||
engine->set_app(app);
|
engine->set_app(app);
|
||||||
|
|
Reference in a new issue