From 044f2aeb7c8d7c44bd8d2e4c5ebed866be9b3b40 Mon Sep 17 00:00:00 2001 From: Powei Feng Date: Mon, 2 Jun 2025 10:18:00 -0700 Subject: [PATCH] gl: keep external texture id in sync (#8803) (Attributed to @dsternfeld7) --- filament/backend/src/opengl/OpenGLDriver.cpp | 23 +++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/filament/backend/src/opengl/OpenGLDriver.cpp b/filament/backend/src/opengl/OpenGLDriver.cpp index e045f69dcb..b8fb4234f7 100644 --- a/filament/backend/src/opengl/OpenGLDriver.cpp +++ b/filament/backend/src/opengl/OpenGLDriver.cpp @@ -2542,7 +2542,12 @@ void OpenGLDriver::makeCurrent(Handle schDraw, Handle [this](size_t index) { for (auto t: mTexturesWithStreamsAttached) { if (t->hwStream->streamType == StreamType::NATIVE) { - glGenTextures(1, &t->gl.id); + if (t->externalTexture) { + glGenTextures(1, &t->externalTexture->id); + t->gl.id = t->externalTexture->id; + } else { + glGenTextures(1, &t->gl.id); + } mPlatform.attach(t->hwStream->stream, t->gl.id); mContext.updateTexImage(GL_TEXTURE_EXTERNAL_OES, t->gl.id); } @@ -3027,6 +3032,7 @@ void OpenGLDriver::attachStream(GLTexture* t, GLStream* hwStream) noexcept { switch (hwStream->streamType) { case StreamType::NATIVE: mPlatform.attach(hwStream->stream, t->gl.id); + mContext.updateTexImage(GL_TEXTURE_EXTERNAL_OES, t->gl.id); break; case StreamType::ACQUIRED: break; @@ -3055,7 +3061,12 @@ void OpenGLDriver::detachStream(GLTexture* t) noexcept { break; } - glGenTextures(1, &t->gl.id); + if (t->externalTexture) { + glGenTextures(1, &t->externalTexture->id); + t->gl.id = t->externalTexture->id; + } else { + glGenTextures(1, &t->gl.id); + } t->hwStream = nullptr; } @@ -3079,8 +3090,14 @@ void OpenGLDriver::replaceStream(GLTexture* texture, GLStream* newStream) noexce switch (newStream->streamType) { case StreamType::NATIVE: - glGenTextures(1, &texture->gl.id); + if (texture->externalTexture) { + glGenTextures(1, &texture->externalTexture->id); + texture->gl.id = texture->externalTexture->id; + } else { + glGenTextures(1, &texture->gl.id); + } mPlatform.attach(newStream->stream, texture->gl.id); + mContext.updateTexImage(GL_TEXTURE_EXTERNAL_OES, texture->gl.id); break; case StreamType::ACQUIRED: // Just re-use the old texture id.