From a425936e425944366235b55ee37e99c552f9a198 Mon Sep 17 00:00:00 2001 From: Nicolas Silva Date: Fri, 20 Nov 2015 14:24:49 +0100 Subject: [PATCH] Bug 1200595 - EGLImage TextureData implementation. r=mattwoodrow --- gfx/layers/client/ImageClient.cpp | 6 +-- gfx/layers/opengl/TextureClientOGL.cpp | 57 +++++++++++--------------- gfx/layers/opengl/TextureClientOGL.h | 37 ++++++----------- 3 files changed, 39 insertions(+), 61 deletions(-) diff --git a/gfx/layers/client/ImageClient.cpp b/gfx/layers/client/ImageClient.cpp index 56bca8eb30d3..11a2c4c05eb1 100644 --- a/gfx/layers/client/ImageClient.cpp +++ b/gfx/layers/client/ImageClient.cpp @@ -203,10 +203,8 @@ ImageClientSingle::UpdateImage(ImageContainer* aContainer, uint32_t aContentFlag if (image->GetFormat() == ImageFormat::EGLIMAGE) { EGLImageImage* typedImage = image->AsEGLImageImage(); - texture = new EGLImageTextureClient(GetForwarder(), - mTextureFlags, - typedImage, - size); + texture = EGLImageTextureData::CreateTextureClient( + typedImage, size, GetForwarder(), mTextureFlags); #ifdef MOZ_WIDGET_ANDROID } else if (image->GetFormat() == ImageFormat::SURFACE_TEXTURE) { SurfaceTextureImage* typedImage = image->AsSurfaceTextureImage(); diff --git a/gfx/layers/opengl/TextureClientOGL.cpp b/gfx/layers/opengl/TextureClientOGL.cpp index 622454bd9bdd..6c23d607edde 100644 --- a/gfx/layers/opengl/TextureClientOGL.cpp +++ b/gfx/layers/opengl/TextureClientOGL.cpp @@ -18,33 +18,42 @@ namespace layers { class CompositableForwarder; //////////////////////////////////////////////////////////////////////// -// EGLImageTextureClient +// EGLImage -EGLImageTextureClient::EGLImageTextureClient(ISurfaceAllocator* aAllocator, - TextureFlags aFlags, - EGLImageImage* aImage, - gfx::IntSize aSize) - : TextureClient(aAllocator, aFlags) - , mImage(aImage) - , mSize(aSize) - , mIsLocked(false) +EGLImageTextureData::EGLImageTextureData(EGLImageImage* aImage, gfx::IntSize aSize) +: mImage(aImage) +, mSize(aSize) +{ + MOZ_ASSERT(aImage); +} + +already_AddRefed +EGLImageTextureData::CreateTextureClient(EGLImageImage* aImage, gfx::IntSize aSize, + ISurfaceAllocator* aAllocator, TextureFlags aFlags) { MOZ_ASSERT(XRE_IsParentProcess(), "Can't pass an `EGLImage` between processes."); - AddFlags(TextureFlags::DEALLOCATE_CLIENT); + if (!aImage || !XRE_IsParentProcess()) { + return nullptr; + } + + // XXX - This is quite sad and slow. + aFlags |= TextureFlags::DEALLOCATE_CLIENT; if (aImage->GetOriginPos() == gl::OriginPos::BottomLeft) { - AddFlags(TextureFlags::ORIGIN_BOTTOM_LEFT); + aFlags |= TextureFlags::ORIGIN_BOTTOM_LEFT; } + + return TextureClient::CreateWithData( + new EGLImageTextureData(aImage, aSize), + aFlags, aAllocator + ); } bool -EGLImageTextureClient::ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) +EGLImageTextureData::Serialize(SurfaceDescriptor& aOutDescriptor) { - MOZ_ASSERT(IsValid()); - MOZ_ASSERT(IsAllocated()); - const bool hasAlpha = true; aOutDescriptor = EGLImageDescriptor((uintptr_t)mImage->GetImage(), @@ -53,24 +62,6 @@ EGLImageTextureClient::ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) return true; } -bool -EGLImageTextureClient::Lock(OpenMode mode) - { - MOZ_ASSERT(!mIsLocked); - if (!IsValid() || !IsAllocated()) { - return false; - } - mIsLocked = true; - return true; - } - -void -EGLImageTextureClient::Unlock() -{ - MOZ_ASSERT(mIsLocked); - mIsLocked = false; -} - //////////////////////////////////////////////////////////////////////// // SurfaceTextureClient diff --git a/gfx/layers/opengl/TextureClientOGL.h b/gfx/layers/opengl/TextureClientOGL.h index dd0dd7729b95..0fb492ab7a30 100644 --- a/gfx/layers/opengl/TextureClientOGL.h +++ b/gfx/layers/opengl/TextureClientOGL.h @@ -20,50 +20,39 @@ namespace mozilla { namespace layers { -class EGLImageTextureClient : public TextureClient +class EGLImageTextureData : public TextureData { public: - EGLImageTextureClient(ISurfaceAllocator* aAllocator, - TextureFlags aFlags, - EGLImageImage* aImage, - gfx::IntSize aSize); - virtual bool IsAllocated() const override { return true; } + static already_AddRefed + CreateTextureClient(EGLImageImage* aImage, gfx::IntSize aSize, + ISurfaceAllocator* aAllocator, TextureFlags aFlags); virtual bool HasInternalBuffer() const override { return false; } virtual gfx::IntSize GetSize() const override { return mSize; } - virtual bool ToSurfaceDescriptor(SurfaceDescriptor& aOutDescriptor) override; + virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - // Useless functions. - virtual bool Lock(OpenMode mode) override; + virtual void Deallocate(ISurfaceAllocator*) override { mImage = nullptr; } - virtual void Unlock() override; + virtual void Forget(ISurfaceAllocator*) override { mImage = nullptr; } - virtual bool IsLocked() const override { return mIsLocked; } + // Unused functions. + virtual bool Lock(OpenMode, FenceHandle*) override { return true; } + + virtual void Unlock() override {} virtual gfx::SurfaceFormat GetFormat() const override { return gfx::SurfaceFormat::UNKNOWN; } - virtual already_AddRefed - CreateSimilar(TextureFlags aFlags = TextureFlags::DEFAULT, - TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override - { - return nullptr; - } - - virtual bool AllocateForSurface(gfx::IntSize aSize, TextureAllocationFlags aFlags) override - { - return false; - } - protected: + EGLImageTextureData(EGLImageImage* aImage, gfx::IntSize aSize); + RefPtr mImage; const gfx::IntSize mSize; - bool mIsLocked; }; #ifdef MOZ_WIDGET_ANDROID