Skip to content

Commit

Permalink
ExternalTexture: Avoid error when destroyed without having been used
Browse files Browse the repository at this point in the history
  • Loading branch information
RandomShaper committed Oct 23, 2024
1 parent 44fa552 commit 98b8bed
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
23 changes: 22 additions & 1 deletion scene/resources/external_texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand All @@ -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);
}
}
Expand All @@ -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() {
Expand Down
5 changes: 4 additions & 1 deletion scene/resources/external_texture.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down

0 comments on commit 98b8bed

Please sign in to comment.