ExternalTexture: Avoid error when destroyed without having been used

This commit is contained in:
Pedro J. Estébanez 2024-10-23 10:04:38 +02:00
parent 44fa552343
commit 98b8beddc5
2 changed files with 26 additions and 2 deletions

View File

@ -39,12 +39,14 @@ void ExternalTexture::_bind_methods() {
}
uint64_t ExternalTexture::get_external_texture_id() const {
_ensure_created();
return RenderingServer::get_singleton()->texture_get_native_handle(texture);
}
void ExternalTexture::set_size(const Size2 &p_size) {
if (p_size.width > 0 && p_size.height > 0 && p_size != size) {
size = p_size;
_ensure_created();
RenderingServer::get_singleton()->texture_external_update(texture, size.width, size.height, external_buffer);
emit_changed();
}
@ -57,6 +59,7 @@ Size2 ExternalTexture::get_size() const {
void ExternalTexture::set_external_buffer_id(uint64_t p_external_buffer) {
if (p_external_buffer != external_buffer) {
external_buffer = p_external_buffer;
_ensure_created();
RenderingServer::get_singleton()->texture_external_update(texture, size.width, size.height, external_buffer);
}
}
@ -74,11 +77,29 @@ bool ExternalTexture::has_alpha() const {
}
RID ExternalTexture::get_rid() const {
if (!texture.is_valid()) {
texture = RenderingServer::get_singleton()->texture_2d_placeholder_create();
using_placeholder = true;
}
return texture;
}
void ExternalTexture::_ensure_created() const {
if (texture.is_valid() && !using_placeholder) {
return;
}
RID new_texture = RenderingServer::get_singleton()->texture_external_create(size.width, size.height);
if (using_placeholder) {
DEV_ASSERT(texture.is_valid());
RenderingServer::get_singleton()->texture_replace(texture, new_texture);
using_placeholder = false;
} else {
texture = new_texture;
}
}
ExternalTexture::ExternalTexture() {
texture = RenderingServer::get_singleton()->texture_external_create(size.width, size.height);
}
ExternalTexture::~ExternalTexture() {

View File

@ -38,10 +38,13 @@ class ExternalTexture : public Texture2D {
GDCLASS(ExternalTexture, Texture2D);
private:
RID texture;
mutable RID texture;
mutable bool using_placeholder = false;
Size2 size = Size2(256, 256);
uint64_t external_buffer = 0;
void _ensure_created() const;
protected:
static void _bind_methods();