Skip to content

Commit 0b23be9

Browse files
committed
Merge pull request godotengine#93706 from RandomShaper/fix_rend_misc
Improve handling of rendering startup errors
2 parents f64f1b3 + 32d9c93 commit 0b23be9

File tree

6 files changed

+42
-7
lines changed

6 files changed

+42
-7
lines changed

platform/android/display_server_android.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,6 +607,7 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
607607
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
608608
memdelete(rendering_context);
609609
rendering_context = nullptr;
610+
r_error = ERR_UNAVAILABLE;
610611
return;
611612
}
612613

@@ -627,6 +628,7 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
627628
ERR_PRINT(vformat("Failed to create %s window.", rendering_driver));
628629
memdelete(rendering_context);
629630
rendering_context = nullptr;
631+
r_error = ERR_UNAVAILABLE;
630632
return;
631633
}
632634

@@ -635,7 +637,13 @@ DisplayServerAndroid::DisplayServerAndroid(const String &p_rendering_driver, Dis
635637
rendering_context->window_set_vsync_mode(MAIN_WINDOW_ID, p_vsync_mode);
636638

637639
rendering_device = memnew(RenderingDevice);
638-
rendering_device->initialize(rendering_context, MAIN_WINDOW_ID);
640+
if (rendering_device->initialize(rendering_context, MAIN_WINDOW_ID) != OK) {
641+
rendering_device = nullptr;
642+
memdelete(rendering_context);
643+
rendering_context = nullptr;
644+
r_error = ERR_UNAVAILABLE;
645+
return;
646+
}
639647
rendering_device->screen_create(MAIN_WINDOW_ID);
640648

641649
RendererCompositorRD::make_current();

platform/ios/display_server_ios.mm

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
ERR_PRINT(vformat("Failed to initialize %s context", rendering_driver));
9292
memdelete(rendering_context);
9393
rendering_context = nullptr;
94+
r_error = ERR_UNAVAILABLE;
9495
return;
9596
}
9697

@@ -107,7 +108,13 @@
107108
rendering_context->window_set_vsync_mode(MAIN_WINDOW_ID, p_vsync_mode);
108109

109110
rendering_device = memnew(RenderingDevice);
110-
rendering_device->initialize(rendering_context, MAIN_WINDOW_ID);
111+
if (rendering_device->initialize(rendering_context, MAIN_WINDOW_ID) != OK) {
112+
rendering_device = nullptr;
113+
memdelete(rendering_context);
114+
rendering_context = nullptr;
115+
r_error = ERR_UNAVAILABLE;
116+
return;
117+
}
111118
rendering_device->screen_create(MAIN_WINDOW_ID);
112119

113120
RendererCompositorRD::make_current();

platform/linuxbsd/wayland/display_server_wayland.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1469,7 +1469,14 @@ DisplayServerWayland::DisplayServerWayland(const String &p_rendering_driver, Win
14691469
#ifdef RD_ENABLED
14701470
if (rendering_context) {
14711471
rendering_device = memnew(RenderingDevice);
1472-
rendering_device->initialize(rendering_context, MAIN_WINDOW_ID);
1472+
if (rendering_device->initialize(rendering_context, MAIN_WINDOW_ID) != OK) {
1473+
memdelete(rendering_device);
1474+
rendering_device = nullptr;
1475+
memdelete(rendering_context);
1476+
rendering_context = nullptr;
1477+
r_error = ERR_UNAVAILABLE;
1478+
return;
1479+
}
14731480
rendering_device->screen_create(MAIN_WINDOW_ID);
14741481

14751482
RendererCompositorRD::make_current();

platform/linuxbsd/x11/display_server_x11.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6261,8 +6261,14 @@ DisplayServerX11::DisplayServerX11(const String &p_rendering_driver, WindowMode
62616261

62626262
#if defined(RD_ENABLED)
62636263
if (rendering_context) {
6264-
rendering_device = memnew(RenderingDevice);
6265-
rendering_device->initialize(rendering_context, MAIN_WINDOW_ID);
6264+
if (rendering_device->initialize(rendering_context, MAIN_WINDOW_ID) != OK) {
6265+
memdelete(rendering_device);
6266+
rendering_device = nullptr;
6267+
memdelete(rendering_context);
6268+
rendering_context = nullptr;
6269+
r_error = ERR_UNAVAILABLE;
6270+
return;
6271+
}
62666272
rendering_device->screen_create(MAIN_WINDOW_ID);
62676273

62686274
RendererCompositorRD::make_current();

platform/windows/display_server_windows.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5873,7 +5873,14 @@ DisplayServerWindows::DisplayServerWindows(const String &p_rendering_driver, Win
58735873
#if defined(RD_ENABLED)
58745874
if (rendering_context) {
58755875
rendering_device = memnew(RenderingDevice);
5876-
rendering_device->initialize(rendering_context, MAIN_WINDOW_ID);
5876+
if (rendering_device->initialize(rendering_context, MAIN_WINDOW_ID) != OK) {
5877+
memdelete(rendering_device);
5878+
rendering_device = nullptr;
5879+
memdelete(rendering_context);
5880+
rendering_context = nullptr;
5881+
r_error = ERR_UNAVAILABLE;
5882+
return;
5883+
}
58775884
rendering_device->screen_create(MAIN_WINDOW_ID);
58785885

58795886
RendererCompositorRD::make_current();

servers/rendering/rendering_device.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5507,7 +5507,7 @@ Error RenderingDevice::initialize(RenderingContextDriver *p_context, DisplayServ
55075507
for (uint32_t i = 0; i < frames.size(); i++) {
55085508
// Staging was never used, create a block.
55095509
err = _insert_staging_block();
5510-
ERR_CONTINUE(err != OK);
5510+
ERR_FAIL_COND_V(err, FAILED);
55115511
}
55125512

55135513
draw_list = nullptr;

0 commit comments

Comments
 (0)