summaryrefslogtreecommitdiffstats
path: root/servers
diff options
context:
space:
mode:
authorclayjohn <claynjohn@gmail.com>2024-08-09 23:53:40 -0700
committerRémi Verschelde <rverschelde@gmail.com>2024-09-16 16:33:25 +0200
commit5a33e45fed0b82e05464b10cee4701b7eb7d689e (patch)
treea4c697c8ac060692081874b7e42480c3b91be383 /servers
parent6595395b8baa1cb6938fad57561326b4aba8ce7e (diff)
downloadredot-engine-5a33e45fed0b82e05464b10cee4701b7eb7d689e.tar.gz
Fail when submit or sync called on main rendering device
Fail if submit or sync called multiple times in a row (cherry picked from commit b0e33aa00f661966772a00d98e9bbbb6a1c008a3)
Diffstat (limited to 'servers')
-rw-r--r--servers/rendering/rendering_device.cpp12
-rw-r--r--servers/rendering/rendering_device.h3
2 files changed, 12 insertions, 3 deletions
diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp
index 22044a8c2d..da48b24a1a 100644
--- a/servers/rendering/rendering_device.cpp
+++ b/servers/rendering/rendering_device.cpp
@@ -5065,13 +5065,19 @@ void RenderingDevice::swap_buffers() {
void RenderingDevice::submit() {
_THREAD_SAFE_METHOD_
+ ERR_FAIL_COND_MSG(is_main_instance, "Only local devices can submit and sync.");
+ ERR_FAIL_COND_MSG(local_device_processing, "device already submitted, call sync to wait until done.");
_end_frame();
_execute_frame(false);
+ local_device_processing = true;
}
void RenderingDevice::sync() {
_THREAD_SAFE_METHOD_
+ ERR_FAIL_COND_MSG(is_main_instance, "Only local devices can submit and sync.");
+ ERR_FAIL_COND_MSG(!local_device_processing, "sync can only be called after a submit");
_begin_frame();
+ local_device_processing = false;
}
void RenderingDevice::_free_pending_resources(int p_frame) {
@@ -5323,7 +5329,7 @@ Error RenderingDevice::initialize(RenderingContextDriver *p_context, DisplayServ
Error err;
RenderingContextDriver::SurfaceID main_surface = 0;
- const bool main_instance = (singleton == this) && (p_main_window != DisplayServer::INVALID_WINDOW_ID);
+ is_main_instance = (singleton == this) && (p_main_window != DisplayServer::INVALID_WINDOW_ID);
if (p_main_window != DisplayServer::INVALID_WINDOW_ID) {
// Retrieve the surface from the main window if it was specified.
main_surface = p_context->surface_get_from_window(p_main_window);
@@ -5371,7 +5377,7 @@ Error RenderingDevice::initialize(RenderingContextDriver *p_context, DisplayServ
err = driver->initialize(device_index, frame_count);
ERR_FAIL_COND_V_MSG(err != OK, FAILED, "Failed to initialize driver for device.");
- if (main_instance) {
+ if (is_main_instance) {
// Only the singleton instance with a display should print this information.
String rendering_method;
if (OS::get_singleton()->get_current_rendering_method() == "mobile") {
@@ -5499,7 +5505,7 @@ Error RenderingDevice::initialize(RenderingContextDriver *p_context, DisplayServ
compute_list = nullptr;
bool project_pipeline_cache_enable = GLOBAL_GET("rendering/rendering_device/pipeline_cache/enable");
- if (main_instance && project_pipeline_cache_enable) {
+ if (is_main_instance && project_pipeline_cache_enable) {
// Only the instance that is not a local device and is also the singleton is allowed to manage a pipeline cache.
pipeline_cache_file_path = vformat("user://vulkan/pipelines.%s.%s",
OS::get_singleton()->get_current_rendering_method(),
diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h
index 38ffd5d23d..52f086e54f 100644
--- a/servers/rendering/rendering_device.h
+++ b/servers/rendering/rendering_device.h
@@ -88,6 +88,9 @@ private:
RenderingDeviceDriver *driver = nullptr;
RenderingContextDriver::Device device;
+ bool local_device_processing = false;
+ bool is_main_instance = false;
+
protected:
static void _bind_methods();