Skip to content

Commit d4b6bd5

Browse files
committed
Merge pull request godotengine#91172 from clayjohn/detect-rd
Disable creating RD projects in project manager if RD is not supported
2 parents 5ca419e + 04d0e7f commit d4b6bd5

File tree

4 files changed

+75
-3
lines changed

4 files changed

+75
-3
lines changed

editor/project_manager/project_dialog.cpp

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -438,30 +438,41 @@ void ProjectDialog::_renderer_selected() {
438438

439439
String renderer_type = renderer_button_group->get_pressed_button()->get_meta(SNAME("rendering_method"));
440440

441+
bool rd_error = false;
442+
441443
if (renderer_type == "forward_plus") {
442444
renderer_info->set_text(
443445
String::utf8("") + TTR("Supports desktop platforms only.") +
444446
String::utf8("\n") + TTR("Advanced 3D graphics available.") +
445447
String::utf8("\n") + TTR("Can scale to large complex scenes.") +
446448
String::utf8("\n") + TTR("Uses RenderingDevice backend.") +
447449
String::utf8("\n") + TTR("Slower rendering of simple scenes."));
450+
rd_error = !rendering_device_supported;
448451
} else if (renderer_type == "mobile") {
449452
renderer_info->set_text(
450453
String::utf8("") + TTR("Supports desktop + mobile platforms.") +
451454
String::utf8("\n") + TTR("Less advanced 3D graphics.") +
452455
String::utf8("\n") + TTR("Less scalable for complex scenes.") +
453456
String::utf8("\n") + TTR("Uses RenderingDevice backend.") +
454457
String::utf8("\n") + TTR("Fast rendering of simple scenes."));
458+
rd_error = !rendering_device_supported;
455459
} else if (renderer_type == "gl_compatibility") {
456460
renderer_info->set_text(
457461
String::utf8("") + TTR("Supports desktop, mobile + web platforms.") +
458-
String::utf8("\n") + TTR("Least advanced 3D graphics (currently work-in-progress).") +
462+
String::utf8("\n") + TTR("Least advanced 3D graphics.") +
459463
String::utf8("\n") + TTR("Intended for low-end/older devices.") +
460464
String::utf8("\n") + TTR("Uses OpenGL 3 backend (OpenGL 3.3/ES 3.0/WebGL2).") +
461465
String::utf8("\n") + TTR("Fastest rendering of simple scenes."));
462466
} else {
463467
WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub.");
464468
}
469+
470+
rd_not_supported->set_visible(rd_error);
471+
get_ok_button()->set_disabled(rd_error);
472+
if (rd_error) {
473+
// Needs to be set here since theme colors aren't available at startup.
474+
rd_not_supported->add_theme_color_override(SceneStringName(font_color), get_theme_color(SNAME("error_color"), EditorStringName(Editor)));
475+
}
465476
}
466477

467478
void ProjectDialog::_nonempty_confirmation_ok_pressed() {
@@ -916,10 +927,16 @@ ProjectDialog::ProjectDialog() {
916927
default_renderer_type = EditorSettings::get_singleton()->get_setting("project_manager/default_renderer");
917928
}
918929

930+
rendering_device_supported = DisplayServer::can_create_rendering_device();
931+
932+
if (!rendering_device_supported) {
933+
default_renderer_type = "gl_compatibility";
934+
}
935+
919936
Button *rs_button = memnew(CheckBox);
920937
rs_button->set_button_group(renderer_button_group);
921938
rs_button->set_text(TTR("Forward+"));
922-
#if defined(WEB_ENABLED)
939+
#ifndef RD_ENABLED
923940
rs_button->set_disabled(true);
924941
#endif
925942
rs_button->set_meta(SNAME("rendering_method"), "forward_plus");
@@ -931,7 +948,7 @@ ProjectDialog::ProjectDialog() {
931948
rs_button = memnew(CheckBox);
932949
rs_button->set_button_group(renderer_button_group);
933950
rs_button->set_text(TTR("Mobile"));
934-
#if defined(WEB_ENABLED)
951+
#ifndef RD_ENABLED
935952
rs_button->set_disabled(true);
936953
#endif
937954
rs_button->set_meta(SNAME("rendering_method"), "mobile");
@@ -963,6 +980,15 @@ ProjectDialog::ProjectDialog() {
963980
renderer_info = memnew(Label);
964981
renderer_info->set_modulate(Color(1, 1, 1, 0.7));
965982
rvb->add_child(renderer_info);
983+
984+
rd_not_supported = memnew(Label);
985+
rd_not_supported->set_text(TTR("Rendering Device backend not available. Please use the Compatibility renderer."));
986+
rd_not_supported->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER);
987+
rd_not_supported->set_custom_minimum_size(Size2(200, 0) * EDSCALE);
988+
rd_not_supported->set_autowrap_mode(TextServer::AUTOWRAP_WORD_SMART);
989+
rd_not_supported->set_visible(false);
990+
renderer_container->add_child(rd_not_supported);
991+
966992
_renderer_selected();
967993

968994
l = memnew(Label);

editor/project_manager/project_dialog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ class ProjectDialog : public ConfirmationDialog {
7777
Label *renderer_info = nullptr;
7878
HBoxContainer *default_files_container = nullptr;
7979
Ref<ButtonGroup> renderer_button_group;
80+
bool rendering_device_supported = false;
81+
Label *rd_not_supported = nullptr;
8082

8183
Label *msg = nullptr;
8284
LineEdit *project_name = nullptr;

servers/display_server.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@
3434
#include "scene/resources/texture.h"
3535
#include "servers/display_server_headless.h"
3636

37+
#if defined(VULKAN_ENABLED)
38+
#include "drivers/vulkan/rendering_context_driver_vulkan.h"
39+
#undef CursorShape
40+
#endif
41+
#if defined(D3D12_ENABLED)
42+
#include "drivers/d3d12/rendering_context_driver_d3d12.h"
43+
#endif
44+
3745
DisplayServer *DisplayServer::singleton = nullptr;
3846

3947
bool DisplayServer::hidpi_allowed = false;
@@ -1211,6 +1219,40 @@ void DisplayServer::_input_set_custom_mouse_cursor_func(const Ref<Resource> &p_i
12111219
singleton->cursor_set_custom_image(p_image, (CursorShape)p_shape, p_hostspot);
12121220
}
12131221

1222+
bool DisplayServer::can_create_rendering_device() {
1223+
#if defined(RD_ENABLED)
1224+
Error err;
1225+
RenderingContextDriver *rcd = nullptr;
1226+
1227+
#if defined(VULKAN_ENABLED)
1228+
rcd = memnew(RenderingContextDriverVulkan);
1229+
#endif
1230+
#ifdef D3D12_ENABLED
1231+
if (rcd == nullptr) {
1232+
rcd = memnew(RenderingContextDriverD3D12);
1233+
}
1234+
#endif
1235+
1236+
if (rcd != nullptr) {
1237+
err = rcd->initialize();
1238+
if (err == OK) {
1239+
RenderingDevice *rd = memnew(RenderingDevice);
1240+
err = rd->initialize(rcd);
1241+
memdelete(rd);
1242+
rd = nullptr;
1243+
if (err == OK) {
1244+
return true;
1245+
}
1246+
}
1247+
1248+
memdelete(rcd);
1249+
rcd = nullptr;
1250+
}
1251+
1252+
#endif // RD_ENABLED
1253+
return false;
1254+
}
1255+
12141256
DisplayServer::DisplayServer() {
12151257
singleton = this;
12161258
Input::set_mouse_mode_func = _input_set_mouse_mode;

servers/display_server.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,8 @@ class DisplayServer : public Object {
594594
static Vector<String> get_create_function_rendering_drivers(int p_index);
595595
static DisplayServer *create(int p_index, const String &p_rendering_driver, WindowMode p_mode, VSyncMode p_vsync_mode, uint32_t p_flags, const Vector2i *p_position, const Vector2i &p_resolution, int p_screen, Context p_context, Error &r_error);
596596

597+
static bool can_create_rendering_device();
598+
597599
DisplayServer();
598600
~DisplayServer();
599601
};

0 commit comments

Comments
 (0)