diff --git a/engine/src/flutter/impeller/toolkit/interop/impeller.cc b/engine/src/flutter/impeller/toolkit/interop/impeller.cc index 9f0863d29fa..61008463d26 100644 --- a/engine/src/flutter/impeller/toolkit/interop/impeller.cc +++ b/engine/src/flutter/impeller/toolkit/interop/impeller.cc @@ -544,7 +544,9 @@ ImpellerTexture ImpellerTextureCreateWithOpenGLTextureHandleNew( return nullptr; } texture->SetCoordinateSystem(TextureCoordinateSystem::kUploadFromHost); - return Create(std::move(texture)).Leak(); + return Create(impeller::Context::BackendType::kOpenGLES, + std::move(texture)) + .Leak(); } IMPELLER_EXTERN_C @@ -557,6 +559,19 @@ void ImpellerTextureRelease(ImpellerTexture texture) { ObjectBase::SafeRelease(texture); } +IMPELLER_EXTERN_C +uint64_t ImpellerTextureGetOpenGLHandle(ImpellerTexture texture) { + auto interop_texture = GetPeer(texture); + if (interop_texture->GetBackendType() != + impeller::Context::BackendType::kOpenGLES) { + VALIDATION_LOG << "Can only fetch the texture handle of an OpenGL texture."; + return 0u; + } + return TextureGLES::Cast(*interop_texture->GetTexture()) + .GetGLHandle() + .value_or(0u); +} + IMPELLER_EXTERN_C void ImpellerDisplayListRetain(ImpellerDisplayList display_list) { ObjectBase::SafeRetain(display_list); diff --git a/engine/src/flutter/impeller/toolkit/interop/impeller.h b/engine/src/flutter/impeller/toolkit/interop/impeller.h index d946b7f3f23..1b465f40e4e 100644 --- a/engine/src/flutter/impeller/toolkit/interop/impeller.h +++ b/engine/src/flutter/impeller/toolkit/interop/impeller.h @@ -493,6 +493,10 @@ void ImpellerTextureRetain(ImpellerTexture IMPELLER_NULLABLE texture); IMPELLER_EXPORT void ImpellerTextureRelease(ImpellerTexture IMPELLER_NULLABLE texture); +IMPELLER_EXPORT +uint64_t ImpellerTextureGetOpenGLHandle( + ImpellerTexture IMPELLER_NONNULL texture); + //------------------------------------------------------------------------------ // Color Sources //------------------------------------------------------------------------------ diff --git a/engine/src/flutter/impeller/toolkit/interop/impeller_unittests.cc b/engine/src/flutter/impeller/toolkit/interop/impeller_unittests.cc index 5e45e5832e1..c5829444d65 100644 --- a/engine/src/flutter/impeller/toolkit/interop/impeller_unittests.cc +++ b/engine/src/flutter/impeller/toolkit/interop/impeller_unittests.cc @@ -165,6 +165,9 @@ TEST_P(InteropPlaygroundTest, CanCreateOpenGLImage) { external_texture // )); ASSERT_TRUE(texture); + + ASSERT_EQ(ImpellerTextureGetOpenGLHandle(texture.GetC()), external_texture); + auto builder = Adopt(ImpellerDisplayListBuilderNew(nullptr)); ImpellerPoint point = {100, 100}; diff --git a/engine/src/flutter/impeller/toolkit/interop/texture.cc b/engine/src/flutter/impeller/toolkit/interop/texture.cc index 976b8d696de..ccdb501d2ac 100644 --- a/engine/src/flutter/impeller/toolkit/interop/texture.cc +++ b/engine/src/flutter/impeller/toolkit/interop/texture.cc @@ -15,11 +15,13 @@ Texture::Texture(const Context& context, const TextureDescriptor& descriptor) { if (!texture || !texture->IsValid()) { return; } + backend_ = context.GetContext()->GetBackendType(); texture_ = std::move(texture); } -Texture::Texture(std::shared_ptr texture) - : texture_(std::move(texture)) {} +Texture::Texture(impeller::Context::BackendType backend, + std::shared_ptr texture) + : backend_(backend), texture_(std::move(texture)) {} Texture::~Texture() = default; @@ -45,4 +47,12 @@ sk_sp Texture::MakeImage() const { return DlImageImpeller::Make(texture_); } +impeller::Context::BackendType Texture::GetBackendType() const { + return backend_; +} + +const std::shared_ptr& Texture::GetTexture() const { + return texture_; +} + } // namespace impeller::interop diff --git a/engine/src/flutter/impeller/toolkit/interop/texture.h b/engine/src/flutter/impeller/toolkit/interop/texture.h index e8c4c466cb2..ab6c1df598b 100644 --- a/engine/src/flutter/impeller/toolkit/interop/texture.h +++ b/engine/src/flutter/impeller/toolkit/interop/texture.h @@ -18,7 +18,8 @@ class Texture final public: explicit Texture(const Context& context, const TextureDescriptor& descriptor); - explicit Texture(std::shared_ptr texture); + explicit Texture(impeller::Context::BackendType backend, + std::shared_ptr texture); ~Texture() override; @@ -34,7 +35,13 @@ class Texture final sk_sp MakeImage() const; + impeller::Context::BackendType GetBackendType() const; + + const std::shared_ptr& GetTexture() const; + private: + impeller::Context::BackendType backend_ = + impeller::Context::BackendType::kMetal; std::shared_ptr texture_; };