diff options
Diffstat (limited to 'main/main.cpp')
-rw-r--r-- | main/main.cpp | 86 |
1 files changed, 76 insertions, 10 deletions
diff --git a/main/main.cpp b/main/main.cpp index edd67971ea..676fa7b836 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -128,7 +128,7 @@ static bool _start_success = false; String tablet_driver = ""; String text_driver = ""; - +String rendering_driver = ""; static int text_driver_idx = -1; static int display_driver_idx = -1; static int audio_driver_idx = -1; @@ -734,7 +734,49 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph N = I->next()->next(); } else { - OS::get_singleton()->print("Missing video driver argument, aborting.\n"); + OS::get_singleton()->print("Missing display driver argument, aborting.\n"); + goto error; + } + } else if (I->get() == "--rendering-driver") { + if (I->next()) { + rendering_driver = I->next()->get(); + + // as the rendering drivers available may depend on the display driver selected, + // we can't do an exhaustive check here, but we can look through all the options in + // all the display drivers for a match + + bool found = false; + for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { + Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); + + for (int d = 0; d < r_drivers.size(); d++) { + if (rendering_driver == r_drivers[d]) { + found = true; + break; + } + } + } + + if (!found) { + OS::get_singleton()->print("Unknown rendering driver '%s', aborting.\nValid options are ", + rendering_driver.utf8().get_data()); + + for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { + Vector<String> r_drivers = DisplayServer::get_create_function_rendering_drivers(i); + + for (int d = 0; d < r_drivers.size(); d++) { + OS::get_singleton()->print("'%s', ", r_drivers[d].utf8().get_data()); + } + } + + OS::get_singleton()->print(".\n"); + + goto error; + } + + N = I->next()->next(); + } else { + OS::get_singleton()->print("Missing rendering driver argument, aborting.\n"); goto error; } } else if (I->get() == "-f" || I->get() == "--fullscreen") { // force fullscreen @@ -1231,16 +1273,30 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph OS::get_singleton()->set_cmdline(execpath, main_args); register_core_extensions(); //before display + // possibly be worth changing the default from vulkan to something lower spec, + // for the project manager, depending on how smooth the fallback is. + GLOBAL_DEF_RST("rendering/driver/driver_name", "Vulkan"); - GLOBAL_DEF("rendering/driver/driver_name", "Vulkan"); + // this list is hard coded, which makes it more difficult to add new backends. + // can potentially be changed to more of a plugin system at a later date. ProjectSettings::get_singleton()->set_custom_property_info("rendering/driver/driver_name", PropertyInfo(Variant::STRING, "rendering/driver/driver_name", - PROPERTY_HINT_ENUM, "Vulkan")); - if (display_driver == "") { - display_driver = GLOBAL_GET("rendering/driver/driver_name"); + PROPERTY_HINT_ENUM, "Vulkan,OpenGL")); + + // if not set on the command line + if (rendering_driver == "") { + rendering_driver = GLOBAL_GET("rendering/driver/driver_name"); } + // note this is the desired rendering driver, it doesn't mean we will get it. + // TODO - make sure this is updated in the case of fallbacks, so that the user interface + // shows the correct driver string. + OS::get_singleton()->set_current_rendering_driver_name(rendering_driver); + + // always convert to lower case for consistency in the code + rendering_driver = rendering_driver.to_lower(); + GLOBAL_DEF_BASIC("display/window/size/width", 1024); ProjectSettings::get_singleton()->set_custom_property_info("display/window/size/width", PropertyInfo(Variant::INT, "display/window/size/width", @@ -1338,8 +1394,13 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph /* Determine audio and video drivers */ + // Display driver, e.g. X11, Wayland. + // print_line("requested display driver : " + display_driver); for (int i = 0; i < DisplayServer::get_create_function_count(); i++) { - if (display_driver == DisplayServer::get_create_function_name(i)) { + String name = DisplayServer::get_create_function_name(i); + // print_line("\t" + itos(i) + " : " + name); + + if (display_driver == name) { display_driver_idx = i; break; } @@ -1349,6 +1410,10 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph display_driver_idx = 0; } + // Store this in a globally accessible place, so we can retrieve the rendering drivers + // list from the display driver for the editor UI. + OS::get_singleton()->set_display_driver_id(display_driver_idx); + GLOBAL_DEF_RST_NOVAL("audio/driver/driver", AudioDriverManager::get_driver(0)->get_name()); if (audio_driver == "") { // Specified in project.godot. audio_driver = GLOBAL_GET("audio/driver/driver"); @@ -1505,8 +1570,9 @@ Error Main::setup2(Thread::ID p_main_tid_override) { /* Initialize Display Server */ { - String rendering_driver; // temp broken + String display_driver = DisplayServer::get_create_function_name(display_driver_idx); + // rendering_driver now held in static global String in main and initialized in setup() Error err; display_server = DisplayServer::create(display_driver_idx, rendering_driver, window_mode, window_vsync_mode, window_flags, window_size, err); if (err != OK || display_server == nullptr) { @@ -1565,6 +1631,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) { rendering_server = memnew(RenderingServerDefault(OS::get_singleton()->get_render_thread_mode() == OS::RENDER_SEPARATE_THREAD)); rendering_server->init(); + //rendering_server->call_set_use_vsync(OS::get_singleton()->_use_vsync); rendering_server->set_render_loop_enabled(!disable_render_loop); if (profile_gpu || (!editor && bool(GLOBAL_GET("debug/settings/stdout/print_gpu_profile")))) { @@ -2781,9 +2848,8 @@ void Main::cleanup(bool p_force) { if (OS::get_singleton()->is_restart_on_exit_set()) { //attempt to restart with arguments - String exec = OS::get_singleton()->get_executable_path(); List<String> args = OS::get_singleton()->get_restart_on_exit_arguments(); - OS::get_singleton()->create_process(exec, args); + OS::get_singleton()->create_instance(args); OS::get_singleton()->set_restart_on_exit(false, List<String>()); //clear list (uses memory) } |