summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRémi Verschelde <rverschelde@gmail.com>2023-06-09 15:10:39 +0200
committerRémi Verschelde <rverschelde@gmail.com>2023-06-09 15:10:39 +0200
commit8acf6b41a4bc0723c828f27d6a23310152a0a31e (patch)
tree341c5815704f2a05918b83003e9d439dddb08900
parent300748e52c03fd1761b716fc7eea2b9fb97b86f9 (diff)
parent7532b2d259f8644ad77c706ecdbc30b6b742b95e (diff)
downloadredot-engine-8acf6b41a4bc0723c828f27d6a23310152a0a31e.tar.gz
Merge pull request #77209 from Rindbee/ViewportTexture-not-change-RID
Don't change `RID` when changing `viewport_path` in `ViewportTexture`
-rw-r--r--scene/main/viewport.cpp18
-rw-r--r--scene/main/viewport.h1
2 files changed, 12 insertions, 7 deletions
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index 170725f52d..38759b85b9 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -61,6 +61,11 @@
#include "servers/rendering/rendering_server_globals.h"
void ViewportTexture::setup_local_to_scene() {
+ // For the same target viewport, setup is only allowed once to prevent multiple free or multiple creations.
+ if (!vp_changed) {
+ return;
+ }
+
if (vp_pending) {
return;
}
@@ -89,20 +94,17 @@ void ViewportTexture::set_viewport_path_in_scene(const NodePath &p_path) {
}
path = p_path;
+ vp_changed = true;
if (vp) {
vp->viewport_textures.erase(this);
vp = nullptr;
}
- if (proxy_ph.is_valid()) {
- RS::get_singleton()->free(proxy_ph);
- }
- if (proxy.is_valid()) {
- RS::get_singleton()->free(proxy);
+ if (proxy.is_valid() && proxy_ph.is_null()) {
+ proxy_ph = RS::get_singleton()->texture_2d_placeholder_create();
+ RS::get_singleton()->texture_proxy_update(proxy, proxy_ph);
}
- proxy_ph = RID();
- proxy = RID();
if (get_local_scene() && !path.is_empty()) {
setup_local_to_scene();
@@ -181,11 +183,13 @@ void ViewportTexture::_setup_local_to_scene(const Node *p_loc_scene) {
if (proxy_ph.is_valid()) {
RS::get_singleton()->texture_proxy_update(proxy, vp->texture_rid);
RS::get_singleton()->free(proxy_ph);
+ proxy_ph = RID();
} else {
ERR_FAIL_COND(proxy.is_valid()); // Should be invalid.
proxy = RS::get_singleton()->texture_proxy_create(vp->texture_rid);
}
vp_pending = false;
+ vp_changed = false;
emit_changed();
}
diff --git a/scene/main/viewport.h b/scene/main/viewport.h
index febcd78e35..af2907ca6f 100644
--- a/scene/main/viewport.h
+++ b/scene/main/viewport.h
@@ -60,6 +60,7 @@ class ViewportTexture : public Texture2D {
friend class Viewport;
Viewport *vp = nullptr;
bool vp_pending = false;
+ bool vp_changed = false;
void _setup_local_to_scene(const Node *p_loc_scene);