summaryrefslogtreecommitdiff
path: root/main/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main/main.cpp')
-rw-r--r--main/main.cpp86
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)
}