From 5401188196a8ab8832bc6cb4c1e978354a8ef9ae Mon Sep 17 00:00:00 2001 From: Joshua Goins Date: Mon, 21 Feb 2022 12:27:29 -0500 Subject: [PATCH] Allow overriding the gfx backend at runtime You can now specify -vulkan, -metal, etc to the SDL backend. --- engine/utility/include/utility.hpp | 10 +++++++++ platforms/sdl/main.cpp.in | 33 ++++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/engine/utility/include/utility.hpp b/engine/utility/include/utility.hpp index 24df21a..ba500b5 100755 --- a/engine/utility/include/utility.hpp +++ b/engine/utility/include/utility.hpp @@ -111,4 +111,14 @@ namespace utility { return linear; } + + template + inline void move_to_front(std::vector& 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); + } + } } diff --git a/platforms/sdl/main.cpp.in b/platforms/sdl/main.cpp.in index 441d2db..9fe8661 100644 --- a/platforms/sdl/main.cpp.in +++ b/platforms/sdl/main.cpp.in @@ -407,21 +407,46 @@ void try_initialize() { } } +struct gfx_backend_initializer { + gfx_backend_initializer(std::string_view n, std::function f) : name(n), init_func(f) {} + + std::string_view name; + std::function init_func; +}; + +std::vector 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 - try_initialize(); + gfx_backend_order.emplace_back(gfx_backend_initializer{"metal", []{ + try_initialize(); + }}); #endif #ifdef ENABLE_VULKAN - try_initialize(); + gfx_backend_order.emplace_back(gfx_backend_initializer{"vulkan", []{ + try_initialize(); + }}); #endif - try_initialize(); + gfx_backend_order.emplace_back(gfx_backend_initializer{"dummy", []{ + try_initialize(); + }}); - 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);