author | Matt Woodrow <mwoodrow@mozilla.com> |
Tue, 27 Sep 2016 16:22:20 +1300 | |
changeset 315320 | b7ead4d4eb90ac9e8f112574dc194691e507658e |
parent 315319 | ca3ca7a3befafc0c9eb189a9d08f305e368308c8 |
child 315321 | 1f78960aea76fff0cb204d52937607d4edc2e26d |
push id | 32584 |
push user | cbook@mozilla.com |
push date | Tue, 27 Sep 2016 09:28:52 +0000 |
treeherder | autoland@93bc88233717 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | gw280 |
bugs | 1281456 |
milestone | 52.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/gl/GLScreenBuffer.cpp +++ b/gfx/gl/GLScreenBuffer.cpp @@ -10,17 +10,17 @@ #include "GLContext.h" #include "GLBlitHelper.h" #include "GLReadTexImageHelper.h" #include "SharedSurfaceEGL.h" #include "SharedSurfaceGL.h" #include "ScopedGLHelpers.h" #include "gfx2DGlue.h" #include "../layers/ipc/ShadowLayers.h" -#include "mozilla/layers/CompositableForwarder.h" +#include "mozilla/layers/TextureForwarder.h" #include "mozilla/layers/TextureClientSharedSurface.h" #ifdef XP_WIN #include "SharedSurfaceANGLE.h" // for SurfaceFactory_ANGLEShareHandle #include "SharedSurfaceD3D11Interop.h" // for SurfaceFactory_D3D11Interop #include "mozilla/gfx/DeviceManagerDx.h" #endif @@ -64,76 +64,77 @@ GLScreenBuffer::Create(GLContext* gl, ret.reset( new GLScreenBuffer(gl, caps, Move(factory)) ); return Move(ret); } /* static */ UniquePtr<SurfaceFactory> GLScreenBuffer::CreateFactory(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::CompositableForwarder>& forwarder, + KnowsCompositor* compositorConnection, const layers::TextureFlags& flags) { - return CreateFactory(gl, caps, forwarder, forwarder->GetCompositorBackendType(), flags); + return CreateFactory(gl, caps, compositorConnection->GetTextureForwarder(), + compositorConnection->GetCompositorBackendType(), flags); } /* static */ UniquePtr<SurfaceFactory> GLScreenBuffer::CreateFactory(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + LayersIPCChannel* ipcChannel, const mozilla::layers::LayersBackend backend, const layers::TextureFlags& flags) { UniquePtr<SurfaceFactory> factory = nullptr; if (!gfxPrefs::WebGLForceLayersReadback()) { switch (backend) { case mozilla::layers::LayersBackend::LAYERS_OPENGL: { #if defined(XP_MACOSX) - factory = SurfaceFactory_IOSurface::Create(gl, caps, allocator, flags); + factory = SurfaceFactory_IOSurface::Create(gl, caps, ipcChannel, flags); #elif defined(MOZ_WIDGET_GONK) - factory = MakeUnique<SurfaceFactory_Gralloc>(gl, caps, allocator, flags); + factory = MakeUnique<SurfaceFactory_Gralloc>(gl, caps, ipcChannel, flags); #elif defined(GL_PROVIDER_GLX) if (sGLXLibrary.UseTextureFromPixmap()) - factory = SurfaceFactory_GLXDrawable::Create(gl, caps, allocator, flags); + factory = SurfaceFactory_GLXDrawable::Create(gl, caps, ipcChannel, flags); #elif defined(MOZ_WIDGET_UIKIT) - factory = MakeUnique<SurfaceFactory_GLTexture>(mGLContext, caps, allocator, mFlags); + factory = MakeUnique<SurfaceFactory_GLTexture>(mGLContext, caps, ipcChannel, mFlags); #else if (gl->GetContextType() == GLContextType::EGL) { if (XRE_IsParentProcess()) { - factory = SurfaceFactory_EGLImage::Create(gl, caps, allocator, flags); + factory = SurfaceFactory_EGLImage::Create(gl, caps, ipcChannel, flags); } } #endif break; } case mozilla::layers::LayersBackend::LAYERS_D3D11: { #ifdef XP_WIN // Enable surface sharing only if ANGLE and compositing devices // are both WARP or both not WARP gfx::DeviceManagerDx* dm = gfx::DeviceManagerDx::Get(); if (gl->IsANGLE() && (gl->IsWARP() == dm->IsWARP()) && dm->TextureSharingWorks()) { - factory = SurfaceFactory_ANGLEShareHandle::Create(gl, caps, allocator, flags); + factory = SurfaceFactory_ANGLEShareHandle::Create(gl, caps, ipcChannel, flags); } if (!factory && gfxPrefs::WebGLDXGLEnabled()) { - factory = SurfaceFactory_D3D11Interop::Create(gl, caps, allocator, flags); + factory = SurfaceFactory_D3D11Interop::Create(gl, caps, ipcChannel, flags); } #endif break; } default: break; } #ifdef GL_PROVIDER_GLX if (!factory && sGLXLibrary.UseTextureFromPixmap()) { - factory = SurfaceFactory_GLXDrawable::Create(gl, caps, allocator, flags); + factory = SurfaceFactory_GLXDrawable::Create(gl, caps, ipcChannel, flags); } #endif } return factory; } GLScreenBuffer::GLScreenBuffer(GLContext* gl,
--- a/gfx/gl/GLScreenBuffer.h +++ b/gfx/gl/GLScreenBuffer.h @@ -20,17 +20,18 @@ #include "mozilla/gfx/2D.h" #include "mozilla/gfx/Point.h" #include "mozilla/UniquePtr.h" #include "SharedSurface.h" #include "SurfaceTypes.h" namespace mozilla { namespace layers { -class CompositableForwarder; +class KnowsCompositor; +class LayersIPCChannel; class SharedSurfaceTextureClient; } // namespace layers namespace gl { class GLContext; class SharedSurface; class ShSurfHandle; @@ -132,22 +133,22 @@ public: // Infallible. static UniquePtr<GLScreenBuffer> Create(GLContext* gl, const gfx::IntSize& size, const SurfaceCaps& caps); static UniquePtr<SurfaceFactory> CreateFactory(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::CompositableForwarder>& forwarder, + layers::KnowsCompositor* compositorConnection, const layers::TextureFlags& flags); static UniquePtr<SurfaceFactory> CreateFactory(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + layers::LayersIPCChannel* ipcChannel, const mozilla::layers::LayersBackend backend, const layers::TextureFlags& flags); protected: GLContext* const mGL; // Owns us. public: const SurfaceCaps mCaps; protected:
--- a/gfx/gl/SharedSurface.cpp +++ b/gfx/gl/SharedSurface.cpp @@ -10,16 +10,17 @@ #include "GLContext.h" #include "GLReadTexImageHelper.h" #include "GLScreenBuffer.h" #include "nsThreadUtils.h" #include "ScopedGLHelpers.h" #include "SharedSurfaceGL.h" #include "mozilla/layers/CompositorTypes.h" #include "mozilla/layers/TextureClientSharedSurface.h" +#include "mozilla/layers/TextureForwarder.h" #include "mozilla/Unused.h" namespace mozilla { namespace gl { /*static*/ void SharedSurface::ProdCopy(SharedSurface* src, SharedSurface* dest, SurfaceFactory* factory) @@ -282,17 +283,17 @@ ChooseBufferBits(const SurfaceCaps& caps } else { out_drawCaps->Clear(); *out_readCaps = screenCaps; } } SurfaceFactory::SurfaceFactory(SharedSurfaceType type, GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) : mType(type) , mGL(gl) , mCaps(caps) , mAllocator(allocator) , mFlags(flags) , mFormats(gl->ChooseGLFormats(caps)) , mMutex("SurfaceFactor::mMutex")
--- a/gfx/gl/SharedSurface.h +++ b/gfx/gl/SharedSurface.h @@ -34,17 +34,17 @@ class nsIThread; namespace mozilla { namespace gfx { class DataSourceSurface; class DrawTarget; } // namespace gfx namespace layers { -class ClientIPCAllocator; +class LayersIPCChannel; class SharedSurfaceTextureClient; enum class TextureFlags : uint32_t; class SurfaceDescriptor; class TextureClient; } // namespace layers namespace gl { @@ -262,28 +262,28 @@ class SurfaceFactory : public SupportsWe public: // Should use the VIRTUAL version, but it's currently incompatible // with SupportsWeakPtr. (bug 1049278) MOZ_DECLARE_WEAKREFERENCE_TYPENAME(SurfaceFactory) const SharedSurfaceType mType; GLContext* const mGL; const SurfaceCaps mCaps; - const RefPtr<layers::ClientIPCAllocator> mAllocator; + const RefPtr<layers::LayersIPCChannel> mAllocator; const layers::TextureFlags mFlags; const GLFormats mFormats; Mutex mMutex; protected: SurfaceCaps mDrawCaps; SurfaceCaps mReadCaps; RefQueue<layers::SharedSurfaceTextureClient> mRecycleFreePool; RefSet<layers::SharedSurfaceTextureClient> mRecycleTotalPool; SurfaceFactory(SharedSurfaceType type, GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags); public: virtual ~SurfaceFactory(); const SurfaceCaps& DrawCaps() const { return mDrawCaps; }
--- a/gfx/gl/SharedSurfaceANGLE.cpp +++ b/gfx/gl/SharedSurfaceANGLE.cpp @@ -315,17 +315,17 @@ SharedSurface_ANGLEShareHandle::Readback return true; } //////////////////////////////////////////////////////////////////////////////// // Factory /*static*/ UniquePtr<SurfaceFactory_ANGLEShareHandle> SurfaceFactory_ANGLEShareHandle::Create(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) { GLLibraryEGL* egl = &sEGLLibrary; if (!egl) return nullptr; auto ext = GLLibraryEGL::ANGLE_surface_d3d_texture_2d_share_handle; if (!egl->IsExtensionSupported(ext)) @@ -335,17 +335,17 @@ SurfaceFactory_ANGLEShareHandle::Create( typedef SurfaceFactory_ANGLEShareHandle ptrT; UniquePtr<ptrT> ret( new ptrT(gl, caps, allocator, flags, egl, config) ); return Move(ret); } SurfaceFactory_ANGLEShareHandle::SurfaceFactory_ANGLEShareHandle(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags, GLLibraryEGL* egl, EGLConfig config) : SurfaceFactory(SharedSurfaceType::EGLSurfaceANGLE, gl, caps, allocator, flags) , mProdGL(gl) , mEGL(egl) , mConfig(config) { }
--- a/gfx/gl/SharedSurfaceANGLE.h +++ b/gfx/gl/SharedSurfaceANGLE.h @@ -75,22 +75,22 @@ class SurfaceFactory_ANGLEShareHandle protected: GLContext* const mProdGL; GLLibraryEGL* const mEGL; const EGLConfig mConfig; public: static UniquePtr<SurfaceFactory_ANGLEShareHandle> Create(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags); protected: SurfaceFactory_ANGLEShareHandle(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags, GLLibraryEGL* egl, EGLConfig config); virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override { bool hasAlpha = mReadCaps.alpha; return SharedSurface_ANGLEShareHandle::Create(mProdGL, mConfig, size, hasAlpha); } };
--- a/gfx/gl/SharedSurfaceD3D11Interop.cpp +++ b/gfx/gl/SharedSurfaceD3D11Interop.cpp @@ -386,17 +386,17 @@ SharedSurface_D3D11Interop::ToSurfaceDes return true; } ////////////////////////////////////////////////////////////////////////////////////////// // Factory /*static*/ UniquePtr<SurfaceFactory_D3D11Interop> SurfaceFactory_D3D11Interop::Create(GLContext* gl, const SurfaceCaps& caps, - layers::ClientIPCAllocator* allocator, + layers::LayersIPCChannel* allocator, const layers::TextureFlags& flags) { WGLLibrary* wgl = &sWGLLib; if (!wgl || !wgl->HasDXInterop2()) return nullptr; const RefPtr<DXInterop2Device> interop = DXInterop2Device::Open(wgl, gl); if (!interop) { @@ -406,17 +406,17 @@ SurfaceFactory_D3D11Interop::Create(GLCo typedef SurfaceFactory_D3D11Interop ptrT; UniquePtr<ptrT> ret(new ptrT(gl, caps, allocator, flags, interop)); return Move(ret); } SurfaceFactory_D3D11Interop::SurfaceFactory_D3D11Interop(GLContext* gl, const SurfaceCaps& caps, - layers::ClientIPCAllocator* allocator, + layers::LayersIPCChannel* allocator, const layers::TextureFlags& flags, DXInterop2Device* interop) : SurfaceFactory(SharedSurfaceType::DXGLInterop2, gl, caps, allocator, flags) , mInterop(interop) { } SurfaceFactory_D3D11Interop::~SurfaceFactory_D3D11Interop() { }
--- a/gfx/gl/SharedSurfaceD3D11Interop.h +++ b/gfx/gl/SharedSurfaceD3D11Interop.h @@ -70,22 +70,22 @@ public: class SurfaceFactory_D3D11Interop : public SurfaceFactory { public: const RefPtr<DXInterop2Device> mInterop; static UniquePtr<SurfaceFactory_D3D11Interop> Create(GLContext* gl, const SurfaceCaps& caps, - layers::ClientIPCAllocator* allocator, + layers::LayersIPCChannel* allocator, const layers::TextureFlags& flags); protected: SurfaceFactory_D3D11Interop(GLContext* gl, const SurfaceCaps& caps, - layers::ClientIPCAllocator* allocator, + layers::LayersIPCChannel* allocator, const layers::TextureFlags& flags, DXInterop2Device* interop); public: virtual ~SurfaceFactory_D3D11Interop() override; protected: virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override {
--- a/gfx/gl/SharedSurfaceEGL.cpp +++ b/gfx/gl/SharedSurfaceEGL.cpp @@ -165,17 +165,17 @@ SharedSurface_EGLImage::ReadbackByShared MOZ_ASSERT(NS_IsMainThread()); return sEGLLibrary.ReadbackEGLImage(mImage, out_surface); } //////////////////////////////////////////////////////////////////////// /*static*/ UniquePtr<SurfaceFactory_EGLImage> SurfaceFactory_EGLImage::Create(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) { EGLContext context = GLContextEGL::Cast(prodGL)->mContext; typedef SurfaceFactory_EGLImage ptrT; UniquePtr<ptrT> ret; GLLibraryEGL* egl = &sEGLLibrary;
--- a/gfx/gl/SharedSurfaceEGL.h +++ b/gfx/gl/SharedSurfaceEGL.h @@ -85,24 +85,24 @@ public: class SurfaceFactory_EGLImage : public SurfaceFactory { public: // Fallible: static UniquePtr<SurfaceFactory_EGLImage> Create(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags); protected: const EGLContext mContext; SurfaceFactory_EGLImage(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags, EGLContext context) : SurfaceFactory(SharedSurfaceType::EGLImageShare, prodGL, caps, allocator, flags) , mContext(context) { } public: virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override {
--- a/gfx/gl/SharedSurfaceGL.h +++ b/gfx/gl/SharedSurfaceGL.h @@ -143,17 +143,17 @@ public: }; class SurfaceFactory_GLTexture : public SurfaceFactory { public: SurfaceFactory_GLTexture(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) : SurfaceFactory(SharedSurfaceType::SharedGLTexture, prodGL, caps, allocator, flags) { } virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override { bool hasAlpha = mReadCaps.alpha; return SharedSurface_GLTexture::Create(mGL, mFormats, size, hasAlpha);
--- a/gfx/gl/SharedSurfaceGLX.cpp +++ b/gfx/gl/SharedSurfaceGLX.cpp @@ -8,16 +8,17 @@ #include "GLXLibrary.h" #include "GLContextProvider.h" #include "GLContextGLX.h" #include "GLScreenBuffer.h" #include "mozilla/gfx/SourceSurfaceCairo.h" #include "mozilla/layers/LayersSurfaces.h" #include "mozilla/layers/ShadowLayerUtilsX11.h" #include "mozilla/layers/ISurfaceAllocator.h" +#include "mozilla/layers/TextureForwarder.h" #include "mozilla/X11Util.h" namespace mozilla { namespace gl { /* static */ UniquePtr<SharedSurface_GLXDrawable> SharedSurface_GLXDrawable::Create(GLContext* prodGL, @@ -115,17 +116,17 @@ SharedSurface_GLXDrawable::ReadbackBySha return true; } /* static */ UniquePtr<SurfaceFactory_GLXDrawable> SurfaceFactory_GLXDrawable::Create(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) { MOZ_ASSERT(caps.alpha, "GLX surfaces require an alpha channel!"); typedef SurfaceFactory_GLXDrawable ptrT; UniquePtr<ptrT> ret(new ptrT(prodGL, caps, allocator, flags & ~layers::TextureFlags::ORIGIN_BOTTOM_LEFT)); return Move(ret);
--- a/gfx/gl/SharedSurfaceGLX.h +++ b/gfx/gl/SharedSurfaceGLX.h @@ -44,24 +44,24 @@ private: }; class SurfaceFactory_GLXDrawable : public SurfaceFactory { public: static UniquePtr<SurfaceFactory_GLXDrawable> Create(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags); virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override; private: SurfaceFactory_GLXDrawable(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) : SurfaceFactory(SharedSurfaceType::GLXDrawable, prodGL, caps, allocator, flags) { } }; } // namespace gl } // namespace mozilla
--- a/gfx/gl/SharedSurfaceGralloc.cpp +++ b/gfx/gl/SharedSurfaceGralloc.cpp @@ -30,30 +30,30 @@ namespace mozilla { namespace gl { using namespace mozilla::layers; using namespace android; SurfaceFactory_Gralloc::SurfaceFactory_Gralloc(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) : SurfaceFactory(SharedSurfaceType::Gralloc, prodGL, caps, allocator, flags) { MOZ_ASSERT(mAllocator); } /*static*/ UniquePtr<SharedSurface_Gralloc> SharedSurface_Gralloc::Create(GLContext* prodGL, const GLFormats& formats, const gfx::IntSize& size, bool hasAlpha, layers::TextureFlags flags, - ClientIPCAllocator* allocator) + LayersIPCChannel* allocator) { GLLibraryEGL* egl = &sEGLLibrary; MOZ_ASSERT(egl); UniquePtr<SharedSurface_Gralloc> ret; DEBUG_PRINT("SharedSurface_Gralloc::Create -------\n"); @@ -113,17 +113,17 @@ SharedSurface_Gralloc::Create(GLContext* return Move(ret); } SharedSurface_Gralloc::SharedSurface_Gralloc(GLContext* prodGL, const gfx::IntSize& size, bool hasAlpha, GLLibraryEGL* egl, - layers::ClientIPCAllocator* allocator, + layers::LayersIPCChannel* allocator, layers::TextureClient* textureClient, GLuint prodTex) : SharedSurface(SharedSurfaceType::Gralloc, AttachmentType::GLTexture, prodGL, size, hasAlpha, true)
--- a/gfx/gl/SharedSurfaceGralloc.h +++ b/gfx/gl/SharedSurfaceGralloc.h @@ -7,53 +7,53 @@ #define SHARED_SURFACE_GRALLOC_H_ #include "mozilla/layers/CompositorTypes.h" #include "mozilla/layers/LayersSurfaces.h" #include "SharedSurface.h" namespace mozilla { namespace layers { -class ClientIPCAllocator; +class LayersIPCChannel; class TextureClient; } namespace gl { class GLContext; class GLLibraryEGL; class SharedSurface_Gralloc : public SharedSurface { public: static UniquePtr<SharedSurface_Gralloc> Create(GLContext* prodGL, const GLFormats& formats, const gfx::IntSize& size, bool hasAlpha, layers::TextureFlags flags, - layers::ClientIPCAllocator* allocator); + layers::LayersIPCChannel* allocator); static SharedSurface_Gralloc* Cast(SharedSurface* surf) { MOZ_ASSERT(surf->mType == SharedSurfaceType::Gralloc); return (SharedSurface_Gralloc*)surf; } protected: GLLibraryEGL* const mEGL; EGLSync mSync; - RefPtr<layers::ClientIPCAllocator> mAllocator; + RefPtr<layers::LayersIPCChannel> mAllocator; RefPtr<layers::TextureClient> mTextureClient; const GLuint mProdTex; SharedSurface_Gralloc(GLContext* prodGL, const gfx::IntSize& size, bool hasAlpha, GLLibraryEGL* egl, - layers::ClientIPCAllocator* allocator, + layers::LayersIPCChannel* allocator, layers::TextureClient* textureClient, GLuint prodTex); static bool HasExtensions(GLLibraryEGL* egl, GLContext* gl); public: virtual ~SharedSurface_Gralloc(); @@ -78,17 +78,17 @@ public: virtual bool ReadbackBySharedHandle(gfx::DataSourceSurface* out_surface) override; }; class SurfaceFactory_Gralloc : public SurfaceFactory { public: SurfaceFactory_Gralloc(GLContext* prodGL, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags); virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override { bool hasAlpha = mReadCaps.alpha; UniquePtr<SharedSurface> ret; if (mAllocator) { ret = SharedSurface_Gralloc::Create(mGL, mFormats, size, hasAlpha,
--- a/gfx/gl/SharedSurfaceIO.cpp +++ b/gfx/gl/SharedSurfaceIO.cpp @@ -206,17 +206,17 @@ SharedSurface_IOSurface::ReadbackByShare return true; } //////////////////////////////////////////////////////////////////////// // SurfaceFactory_IOSurface /*static*/ UniquePtr<SurfaceFactory_IOSurface> SurfaceFactory_IOSurface::Create(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags) { auto maxDims = gfx::IntSize::Truncate(MacIOSurface::GetMaxWidth(), MacIOSurface::GetMaxHeight()); typedef SurfaceFactory_IOSurface ptrT; UniquePtr<ptrT> ret( new ptrT(gl, caps, allocator, flags, maxDims) ); return Move(ret);
--- a/gfx/gl/SharedSurfaceIO.h +++ b/gfx/gl/SharedSurfaceIO.h @@ -72,23 +72,23 @@ public: }; class SurfaceFactory_IOSurface : public SurfaceFactory { public: // Infallible. static UniquePtr<SurfaceFactory_IOSurface> Create(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags); protected: const gfx::IntSize mMaxDims; SurfaceFactory_IOSurface(GLContext* gl, const SurfaceCaps& caps, - const RefPtr<layers::ClientIPCAllocator>& allocator, + const RefPtr<layers::LayersIPCChannel>& allocator, const layers::TextureFlags& flags, const gfx::IntSize& maxDims) : SurfaceFactory(SharedSurfaceType::IOSurface, gl, caps, allocator, flags) , mMaxDims(maxDims) { } virtual UniquePtr<SharedSurface> CreateShared(const gfx::IntSize& size) override; };
--- a/gfx/layers/BufferTexture.cpp +++ b/gfx/layers/BufferTexture.cpp @@ -22,26 +22,27 @@ namespace layers { class MemoryTextureData : public BufferTextureData { public: static MemoryTextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2DBackend, LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - virtual void Deallocate(ClientIPCAllocator*) override; + virtual void Deallocate(LayersIPCChannel*) override; MemoryTextureData(const BufferDescriptor& aDesc, gfx::BackendType aMoz2DBackend, uint8_t* aBuffer, size_t aBufferSize) : BufferTextureData(aDesc, aMoz2DBackend) , mBuffer(aBuffer) , mBufferSize(aBufferSize) { @@ -61,26 +62,27 @@ protected: class ShmemTextureData : public BufferTextureData { public: static ShmemTextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2DBackend, LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - virtual void Deallocate(ClientIPCAllocator* aAllocator) override; + virtual void Deallocate(LayersIPCChannel* aAllocator) override; ShmemTextureData(const BufferDescriptor& aDesc, gfx::BackendType aMoz2DBackend, mozilla::ipc::Shmem aShmem) : BufferTextureData(aDesc, aMoz2DBackend) , mShmem(aShmem) { MOZ_ASSERT(mShmem.Size<uint8_t>()); } @@ -109,83 +111,79 @@ bool ComputeHasIntermediateBuffer(gfx::S || aFormat == gfx::SurfaceFormat::UNKNOWN; } BufferTextureData* BufferTextureData::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2DBackend, LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { if (!aAllocator || aAllocator->IsSameProcess()) { return MemoryTextureData::Create(aSize, aFormat, aMoz2DBackend, aLayersBackend, aFlags, aAllocFlags, aAllocator); - } else if (aAllocator->AsShmemAllocator()) { + } else { return ShmemTextureData::Create(aSize, aFormat, aMoz2DBackend, aLayersBackend, aFlags, aAllocFlags, aAllocator); } - return nullptr; } BufferTextureData* -BufferTextureData::CreateInternal(ClientIPCAllocator* aAllocator, +BufferTextureData::CreateInternal(LayersIPCChannel* aAllocator, const BufferDescriptor& aDesc, gfx::BackendType aMoz2DBackend, int32_t aBufferSize, TextureFlags aTextureFlags) { if (!aAllocator || aAllocator->IsSameProcess()) { uint8_t* buffer = new (fallible) uint8_t[aBufferSize]; if (!buffer) { return nullptr; } GfxMemoryImageReporter::DidAlloc(buffer); return new MemoryTextureData(aDesc, aMoz2DBackend, buffer, aBufferSize); - } else if (aAllocator->AsShmemAllocator()) { + } else { ipc::Shmem shm; - if (!aAllocator->AsShmemAllocator()->AllocUnsafeShmem(aBufferSize, OptimalShmemType(), &shm)) { + if (!aAllocator->AllocUnsafeShmem(aBufferSize, OptimalShmemType(), &shm)) { return nullptr; } return new ShmemTextureData(aDesc, aMoz2DBackend, shm); } - return nullptr; } BufferTextureData* -BufferTextureData::CreateForYCbCrWithBufferSize(ClientIPCAllocator* aAllocator, +BufferTextureData::CreateForYCbCrWithBufferSize(KnowsCompositor* aAllocator, int32_t aBufferSize, TextureFlags aTextureFlags) { if (aBufferSize == 0 || !gfx::Factory::CheckBufferSize(aBufferSize)) { return nullptr; } - auto fwd = aAllocator->AsCompositableForwarder(); - bool hasIntermediateBuffer = fwd ? ComputeHasIntermediateBuffer(gfx::SurfaceFormat::YUV, - fwd->GetCompositorBackendType()) - : true; + bool hasIntermediateBuffer = ComputeHasIntermediateBuffer(gfx::SurfaceFormat::YUV, + aAllocator->GetCompositorBackendType()); // Initialize the metadata with something, even if it will have to be rewritten // afterwards since we don't know the dimensions of the texture at this point. BufferDescriptor desc = YCbCrDescriptor(gfx::IntSize(), gfx::IntSize(), 0, 0, 0, StereoMode::MONO, hasIntermediateBuffer); - return CreateInternal(aAllocator, desc, gfx::BackendType::NONE, aBufferSize, + return CreateInternal(aAllocator->GetTextureForwarder(), desc, gfx::BackendType::NONE, aBufferSize, aTextureFlags); } BufferTextureData* -BufferTextureData::CreateForYCbCr(ClientIPCAllocator* aAllocator, +BufferTextureData::CreateForYCbCr(KnowsCompositor* aAllocator, gfx::IntSize aYSize, gfx::IntSize aCbCrSize, StereoMode aStereoMode, TextureFlags aTextureFlags) { uint32_t bufSize = ImageDataSerializer::ComputeYCbCrBufferSize(aYSize, aCbCrSize); if (bufSize == 0) { return nullptr; @@ -193,27 +191,26 @@ BufferTextureData::CreateForYCbCr(Client uint32_t yOffset; uint32_t cbOffset; uint32_t crOffset; ImageDataSerializer::ComputeYCbCrOffsets(aYSize.width, aYSize.height, aCbCrSize.width, aCbCrSize.height, yOffset, cbOffset, crOffset); - auto fwd = aAllocator ? aAllocator->AsCompositableForwarder() : nullptr; - bool hasIntermediateBuffer = fwd ? ComputeHasIntermediateBuffer(gfx::SurfaceFormat::YUV, - fwd->GetCompositorBackendType()) - : true; + bool hasIntermediateBuffer = aAllocator ? ComputeHasIntermediateBuffer(gfx::SurfaceFormat::YUV, + aAllocator->GetCompositorBackendType()) + : true; YCbCrDescriptor descriptor = YCbCrDescriptor(aYSize, aCbCrSize, yOffset, cbOffset, crOffset, aStereoMode, hasIntermediateBuffer); - return CreateInternal(aAllocator, descriptor, gfx::BackendType::NONE, bufSize, - aTextureFlags); + return CreateInternal(aAllocator ? aAllocator->GetTextureForwarder() : nullptr, descriptor, + gfx::BackendType::NONE, bufSize, aTextureFlags); } void BufferTextureData::FillInfo(TextureData::Info& aInfo) const { aInfo.size = GetSize(); aInfo.format = GetFormat(); aInfo.hasSynchronization = false; @@ -457,17 +454,17 @@ InitBuffer(uint8_t* buf, size_t bufSize, return true; } MemoryTextureData* MemoryTextureData::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2DBackend, LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { // Should have used CreateForYCbCr. MOZ_ASSERT(aFormat != gfx::SurfaceFormat::YUV); if (aSize.width <= 0 || aSize.height <= 0) { gfxDebug() << "Asking for buffer of invalid size " << aSize.width << "x" << aSize.height; return nullptr; } @@ -477,48 +474,42 @@ MemoryTextureData::Create(gfx::IntSize a return nullptr; } uint8_t* buf = new (fallible) uint8_t[bufSize]; if (!InitBuffer(buf, bufSize, aFormat, aAllocFlags, false)) { return nullptr; } - // LAYERS_NONE must imply that we have no compositable forwarder - MOZ_ASSERT_IF(aLayersBackend == LayersBackend::LAYERS_NONE, - !aAllocator || !aAllocator->AsCompositableForwarder()); - bool hasIntermediateBuffer = ComputeHasIntermediateBuffer(aFormat, aLayersBackend); GfxMemoryImageReporter::DidAlloc(buf); BufferDescriptor descriptor = RGBDescriptor(aSize, aFormat, hasIntermediateBuffer); return new MemoryTextureData(descriptor, aMoz2DBackend, buf, bufSize); } void -MemoryTextureData::Deallocate(ClientIPCAllocator*) +MemoryTextureData::Deallocate(LayersIPCChannel*) { MOZ_ASSERT(mBuffer); GfxMemoryImageReporter::WillFree(mBuffer); delete [] mBuffer; mBuffer = nullptr; } TextureData* -MemoryTextureData::CreateSimilar(ClientIPCAllocator* aAllocator, +MemoryTextureData::CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { - auto fwd = aAllocator ? aAllocator->AsCompositableForwarder() : nullptr; - auto backend = fwd ? fwd->GetCompositorBackendType() : LayersBackend::LAYERS_NONE; - return MemoryTextureData::Create(GetSize(), GetFormat(), mMoz2DBackend, - backend, aFlags, aAllocFlags, aAllocator); + aLayersBackend, aFlags, aAllocFlags, aAllocator); } bool ShmemTextureData::Serialize(SurfaceDescriptor& aOutDescriptor) { MOZ_ASSERT(GetFormat() != gfx::SurfaceFormat::UNKNOWN); if (GetFormat() == gfx::SurfaceFormat::UNKNOWN) { return false; @@ -529,71 +520,65 @@ ShmemTextureData::Serialize(SurfaceDescr return true; } ShmemTextureData* ShmemTextureData::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2DBackend, LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { MOZ_ASSERT(aAllocator); // Should have used CreateForYCbCr. MOZ_ASSERT(aFormat != gfx::SurfaceFormat::YUV); - if (!aAllocator || !aAllocator->AsShmemAllocator()) { + if (!aAllocator) { return nullptr; } if (aSize.width <= 0 || aSize.height <= 0) { gfxDebug() << "Asking for buffer of invalid size " << aSize.width << "x" << aSize.height; return nullptr; } uint32_t bufSize = ImageDataSerializer::ComputeRGBBufferSize(aSize, aFormat); if (!bufSize) { return nullptr; } mozilla::ipc::Shmem shm; - if (!aAllocator->AsShmemAllocator()->AllocUnsafeShmem(bufSize, OptimalShmemType(), &shm)) { + if (!aAllocator->AllocUnsafeShmem(bufSize, OptimalShmemType(), &shm)) { return nullptr; } uint8_t* buf = shm.get<uint8_t>(); if (!InitBuffer(buf, bufSize, aFormat, aAllocFlags, true)) { return nullptr; } - // LAYERS_NONE must imply that we have no compositable forwarder - MOZ_ASSERT_IF(aLayersBackend == LayersBackend::LAYERS_NONE, - !aAllocator || !aAllocator->AsCompositableForwarder()); - bool hasIntermediateBuffer = ComputeHasIntermediateBuffer(aFormat, aLayersBackend); BufferDescriptor descriptor = RGBDescriptor(aSize, aFormat, hasIntermediateBuffer); return new ShmemTextureData(descriptor, aMoz2DBackend, shm); return nullptr; } TextureData* -ShmemTextureData::CreateSimilar(ClientIPCAllocator* aAllocator, +ShmemTextureData::CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { - auto fwd = aAllocator ? aAllocator->AsCompositableForwarder() : nullptr; - auto backend = fwd ? fwd->GetCompositorBackendType() : LayersBackend::LAYERS_NONE; - return ShmemTextureData::Create(GetSize(), GetFormat(), mMoz2DBackend, - backend, aFlags, aAllocFlags, aAllocator); + aLayersBackend, aFlags, aAllocFlags, aAllocator); } void -ShmemTextureData::Deallocate(ClientIPCAllocator* aAllocator) +ShmemTextureData::Deallocate(LayersIPCChannel* aAllocator) { - aAllocator->AsShmemAllocator()->DeallocShmem(mShmem); + aAllocator->DeallocShmem(mShmem); } } // namespace } // namespace
--- a/gfx/layers/BufferTexture.h +++ b/gfx/layers/BufferTexture.h @@ -21,28 +21,28 @@ bool ComputeHasIntermediateBuffer(gfx::S class BufferTextureData : public TextureData { public: static BufferTextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2DBackend, LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); - static BufferTextureData* CreateForYCbCr(ClientIPCAllocator* aAllocator, + static BufferTextureData* CreateForYCbCr(KnowsCompositor* aAllocator, gfx::IntSize aYSize, gfx::IntSize aCbCrSize, StereoMode aStereoMode, TextureFlags aTextureFlags); // It is generally better to use CreateForYCbCr instead. // This creates a half-initialized texture since we don't know the sizes and // offsets in the buffer. - static BufferTextureData* CreateForYCbCrWithBufferSize(ClientIPCAllocator* aAllocator, + static BufferTextureData* CreateForYCbCrWithBufferSize(KnowsCompositor* aAllocator, int32_t aSize, TextureFlags aTextureFlags); virtual bool Lock(OpenMode aMode, FenceHandle*) override { return true; } virtual void Unlock() override {} virtual void FillInfo(TextureData::Info& aInfo) const override; @@ -65,17 +65,17 @@ public: Maybe<StereoMode> GetStereoMode() const; protected: gfx::IntSize GetSize() const; gfx::SurfaceFormat GetFormat() const; - static BufferTextureData* CreateInternal(ClientIPCAllocator* aAllocator, + static BufferTextureData* CreateInternal(LayersIPCChannel* aAllocator, const BufferDescriptor& aDesc, gfx::BackendType aMoz2DBackend, int32_t aBufferSize, TextureFlags aTextureFlags); virtual uint8_t* GetBuffer() = 0; virtual size_t GetBufferSize() = 0;
--- a/gfx/layers/D3D11ShareHandleImage.cpp +++ b/gfx/layers/D3D11ShareHandleImage.cpp @@ -48,17 +48,17 @@ D3D11ShareHandleImage::AllocateTexture(D gfx::IntSize D3D11ShareHandleImage::GetSize() { return mSize; } TextureClient* -D3D11ShareHandleImage::GetTextureClient(TextureForwarder* aForwarder) +D3D11ShareHandleImage::GetTextureClient(KnowsCompositor* aForwarder) { return mTextureClient; } already_AddRefed<gfx::SourceSurface> D3D11ShareHandleImage::GetAsSourceSurface() { RefPtr<ID3D11Texture2D> texture = GetTexture(); @@ -137,17 +137,17 @@ already_AddRefed<TextureClient> D3D11RecycleAllocator::Allocate(gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { return CreateD3D11TextureClientWithDevice(aSize, aFormat, aTextureFlags, aAllocFlags, - mDevice, mSurfaceAllocator); + mDevice, mSurfaceAllocator->GetTextureForwarder()); } already_AddRefed<TextureClient> D3D11RecycleAllocator::CreateOrRecycleClient(gfx::SurfaceFormat aFormat, const gfx::IntSize& aSize) { RefPtr<TextureClient> textureClient = CreateOrRecycle(aFormat,
--- a/gfx/layers/D3D11ShareHandleImage.h +++ b/gfx/layers/D3D11ShareHandleImage.h @@ -14,17 +14,17 @@ #include "mozilla/layers/TextureClientRecycleAllocator.h" namespace mozilla { namespace layers { class D3D11RecycleAllocator : public TextureClientRecycleAllocator { public: - explicit D3D11RecycleAllocator(TextureForwarder* aAllocator, + explicit D3D11RecycleAllocator(KnowsCompositor* aAllocator, ID3D11Device* aDevice) : TextureClientRecycleAllocator(aAllocator) , mDevice(aDevice) {} already_AddRefed<TextureClient> CreateOrRecycleClient(gfx::SurfaceFormat aFormat, const gfx::IntSize& aSize); @@ -49,17 +49,17 @@ public: D3D11ShareHandleImage(const gfx::IntSize& aSize, const gfx::IntRect& aRect); ~D3D11ShareHandleImage() override {} bool AllocateTexture(D3D11RecycleAllocator* aAllocator, ID3D11Device* aDevice); gfx::IntSize GetSize() override; virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override; - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; virtual gfx::IntRect GetPictureRect() override { return mPictureRect; } ID3D11Texture2D* GetTexture() const; private: gfx::IntSize mSize; gfx::IntRect mPictureRect; RefPtr<TextureClient> mTextureClient;
--- a/gfx/layers/D3D9SurfaceImage.cpp +++ b/gfx/layers/D3D9SurfaceImage.cpp @@ -123,20 +123,20 @@ D3D9SurfaceImage::GetShareHandle() const gfx::IntSize D3D9SurfaceImage::GetSize() { return mSize; } TextureClient* -D3D9SurfaceImage::GetTextureClient(TextureForwarder* aForwarder) +D3D9SurfaceImage::GetTextureClient(KnowsCompositor* aForwarder) { MOZ_ASSERT(mTextureClient); - MOZ_ASSERT(mTextureClient->GetAllocator() == aForwarder); + MOZ_ASSERT(mTextureClient->GetAllocator() == aForwarder->GetTextureForwarder()); return mTextureClient; } already_AddRefed<gfx::SourceSurface> D3D9SurfaceImage::GetAsSourceSurface() { if (!mTexture) { return nullptr; @@ -202,17 +202,18 @@ D3D9RecycleAllocator::Allocate(gfx::Surf TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { TextureData* data = DXGID3D9TextureData::Create(aSize, aFormat, aTextureFlags, mDevice); if (!data) { return nullptr; } - return MakeAndAddRef<TextureClient>(data, aTextureFlags, mSurfaceAllocator); + return MakeAndAddRef<TextureClient>(data, aTextureFlags, + mSurfaceAllocator->GetTextureForwarder()); } already_AddRefed<TextureClient> D3D9RecycleAllocator::CreateOrRecycleClient(gfx::SurfaceFormat aFormat, const gfx::IntSize& aSize) { return CreateOrRecycle(aFormat, aSize, BackendSelector::Content, TextureFlags::DEFAULT);
--- a/gfx/layers/D3D9SurfaceImage.h +++ b/gfx/layers/D3D9SurfaceImage.h @@ -14,17 +14,17 @@ namespace mozilla { namespace layers { class TextureClient; class D3D9RecycleAllocator : public TextureClientRecycleAllocator { public: - explicit D3D9RecycleAllocator(TextureForwarder* aAllocator, + explicit D3D9RecycleAllocator(KnowsCompositor* aAllocator, IDirect3DDevice9* aDevice) : TextureClientRecycleAllocator(aAllocator) , mDevice(aDevice) {} already_AddRefed<TextureClient> CreateOrRecycleClient(gfx::SurfaceFormat aFormat, const gfx::IntSize& aSize); @@ -55,17 +55,17 @@ public: // Returns the description of the shared surface. const D3DSURFACE_DESC& GetDesc() const; gfx::IntSize GetSize() override; virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override; - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; already_AddRefed<IDirect3DSurface9> GetD3D9Surface(); HANDLE GetShareHandle() const; virtual bool IsValid() override { return mValid; } void Invalidate() { mValid = false; }
--- a/gfx/layers/GPUVideoImage.h +++ b/gfx/layers/GPUVideoImage.h @@ -35,17 +35,17 @@ public: ~GPUVideoImage() override {} gfx::IntSize GetSize() override { return mSize; } // TODO: We really want to be able to support this, but it's complex, since we need to readback // in the other process and send it across. virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override { return nullptr; } - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override { MOZ_ASSERT(aForwarder == ImageBridgeChild::GetSingleton(), "Must only use GPUVideo on ImageBridge"); return mTextureClient; } private: gfx::IntSize mSize; RefPtr<TextureClient> mTextureClient;
--- a/gfx/layers/IMFYCbCrImage.cpp +++ b/gfx/layers/IMFYCbCrImage.cpp @@ -150,17 +150,17 @@ static bool UploadData(IDirect3DDevice9* aSrcSize.width); } } return FinishTextures(aDevice, aTexture, surf); } TextureClient* -IMFYCbCrImage::GetD3D9TextureClient(TextureForwarder* aForwarder) +IMFYCbCrImage::GetD3D9TextureClient(KnowsCompositor* aForwarder) { RefPtr<IDirect3DDevice9> device = DeviceManagerD3D9::GetDevice(); if (!device) { return nullptr; } RefPtr<IDirect3DTexture9> textureY; HANDLE shareHandleY = 0; @@ -202,30 +202,29 @@ IMFYCbCrImage::GetD3D9TextureClient(Text break; } if (!valid) { return nullptr; } mTextureClient = TextureClient::CreateWithData( - DXGIYCbCrTextureData::Create(aForwarder, - TextureFlags::DEFAULT, + DXGIYCbCrTextureData::Create(TextureFlags::DEFAULT, textureY, textureCb, textureCr, shareHandleY, shareHandleCb, shareHandleCr, GetSize(), mData.mYSize, mData.mCbCrSize), TextureFlags::DEFAULT, - aForwarder + aForwarder->GetTextureForwarder() ); return mTextureClient; } TextureClient* -IMFYCbCrImage::GetTextureClient(TextureForwarder* aForwarder) +IMFYCbCrImage::GetTextureClient(KnowsCompositor* aForwarder) { if (mTextureClient) { return mTextureClient; } RefPtr<ID3D11Device> device = gfx::DeviceManagerDx::Get()->GetContentDevice(); @@ -270,21 +269,20 @@ IMFYCbCrImage::GetTextureClient(TextureF // it appears that D3D doesn't include the initial memory upload within this // synchronization. Add an empty lock/unlock pair since that appears to // be sufficient to make sure we synchronize. { AutoLockTexture lockCr(textureCr); } mTextureClient = TextureClient::CreateWithData( - DXGIYCbCrTextureData::Create(aForwarder, - TextureFlags::DEFAULT, + DXGIYCbCrTextureData::Create(TextureFlags::DEFAULT, textureY, textureCb, textureCr, GetSize(), mData.mYSize, mData.mCbCrSize), TextureFlags::DEFAULT, - aForwarder + aForwarder->GetTextureForwarder() ); return mTextureClient; } } // namespace layers } // namespace mozilla
--- a/gfx/layers/IMFYCbCrImage.h +++ b/gfx/layers/IMFYCbCrImage.h @@ -15,21 +15,21 @@ namespace layers { class IMFYCbCrImage : public RecyclingPlanarYCbCrImage { public: IMFYCbCrImage(IMFMediaBuffer* aBuffer, IMF2DBuffer* a2DBuffer); virtual bool IsValid() { return true; } - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; protected: - TextureClient* GetD3D9TextureClient(TextureForwarder* aForwarder); + TextureClient* GetD3D9TextureClient(KnowsCompositor* aForwarder); ~IMFYCbCrImage(); RefPtr<IMFMediaBuffer> mBuffer; RefPtr<IMF2DBuffer> m2DBuffer; RefPtr<TextureClient> mTextureClient; };
--- a/gfx/layers/ImageContainer.cpp +++ b/gfx/layers/ImageContainer.cpp @@ -734,17 +734,17 @@ SourceSurfaceImage::SourceSurfaceImage(g mTextureFlags(TextureFlags::DEFAULT) {} SourceSurfaceImage::~SourceSurfaceImage() { } TextureClient* -SourceSurfaceImage::GetTextureClient(TextureForwarder* aForwarder) +SourceSurfaceImage::GetTextureClient(KnowsCompositor* aForwarder) { if (!aForwarder) { return nullptr; } RefPtr<TextureClient> textureClient = mTextureClients.Get(aForwarder->GetSerial()); if (textureClient) { return textureClient; @@ -755,17 +755,16 @@ SourceSurfaceImage::GetTextureClient(Tex if (!surface) { return nullptr; } if (!textureClient) { // gfx::BackendType::NONE means default to content backend textureClient = TextureClient::CreateFromSurface(aForwarder, surface, - aForwarder->GetCompositorBackendType(), BackendSelector::Content, mTextureFlags, ALLOC_DEFAULT); } if (!textureClient) { return nullptr; }
--- a/gfx/layers/ImageContainer.h +++ b/gfx/layers/ImageContainer.h @@ -146,17 +146,17 @@ namespace layers { class ImageClient; class ImageCompositeNotification; class ImageContainerChild; class PImageContainerChild; class SharedPlanarYCbCrImage; class PlanarYCbCrImage; class TextureClient; -class TextureForwarder; +class KnowsCompositor; class GrallocImage; class NVImage; struct ImageBackendData { virtual ~ImageBackendData() {} protected: @@ -223,17 +223,17 @@ public: virtual bool IsValid() { return true; } virtual uint8_t* GetBuffer() { return nullptr; } /** * For use with the TextureForwarder only (so that the later can * synchronize the TextureClient with the TextureHost). */ - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) { return nullptr; } + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) { return nullptr; } /* Access to derived classes. */ virtual EGLImageImage* AsEGLImageImage() { return nullptr; } virtual GLImage* AsGLImage() { return nullptr; } #ifdef MOZ_WIDGET_ANDROID virtual SurfaceTextureImage* AsSurfaceTextureImage() { return nullptr; } #endif #ifdef XP_MACOSX @@ -885,17 +885,17 @@ class SourceSurfaceImage final : public public: virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override { RefPtr<gfx::SourceSurface> surface(mSourceSurface); return surface.forget(); } void SetTextureFlags(TextureFlags aTextureFlags) { mTextureFlags = aTextureFlags; } - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; virtual gfx::IntSize GetSize() override { return mSize; } SourceSurfaceImage(const gfx::IntSize& aSize, gfx::SourceSurface* aSourceSurface); explicit SourceSurfaceImage(gfx::SourceSurface* aSourceSurface); ~SourceSurfaceImage(); private:
--- a/gfx/layers/MacIOSurfaceImage.cpp +++ b/gfx/layers/MacIOSurfaceImage.cpp @@ -11,24 +11,24 @@ #include "mozilla/layers/MacIOSurfaceTextureClientOGL.h" #include "mozilla/UniquePtr.h" using namespace mozilla; using namespace mozilla::layers; using namespace mozilla::gfx; TextureClient* -MacIOSurfaceImage::GetTextureClient(TextureForwarder* aForwarder) +MacIOSurfaceImage::GetTextureClient(KnowsCompositor* aForwarder) { if (!mTextureClient) { BackendType backend = BackendType::NONE; mTextureClient = TextureClient::CreateWithData( MacIOSurfaceTextureData::Create(mSurface, backend), TextureFlags::DEFAULT, - aForwarder + aForwarder->GetTextureForwarder() ); } return mTextureClient; } already_AddRefed<SourceSurface> MacIOSurfaceImage::GetAsSourceSurface() {
--- a/gfx/layers/MacIOSurfaceImage.h +++ b/gfx/layers/MacIOSurfaceImage.h @@ -26,17 +26,17 @@ public: gfx::IntSize GetSize() override { return gfx::IntSize::Truncate(mSurface->GetDevicePixelWidth(), mSurface->GetDevicePixelHeight()); } virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override; - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; virtual MacIOSurfaceImage* AsMacIOSurfaceImage() override { return this; } private: RefPtr<MacIOSurface> mSurface; RefPtr<TextureClient> mTextureClient;
--- a/gfx/layers/PersistentBufferProvider.cpp +++ b/gfx/layers/PersistentBufferProvider.cpp @@ -81,19 +81,19 @@ PersistentBufferProviderBasic::Create(gf return provider.forget(); } //static already_AddRefed<PersistentBufferProviderShared> PersistentBufferProviderShared::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - CompositableForwarder* aFwd) + KnowsCompositor* aFwd) { - if (!aFwd || !aFwd->IPCOpen()) { + if (!aFwd || !aFwd->GetTextureForwarder()->IPCOpen()) { return nullptr; } RefPtr<TextureClient> texture = TextureClient::CreateForDrawing( aFwd, aFormat, aSize, BackendSelector::Canvas, TextureFlags::DEFAULT, TextureAllocationFlags::ALLOC_DEFAULT @@ -105,17 +105,17 @@ PersistentBufferProviderShared::Create(g RefPtr<PersistentBufferProviderShared> provider = new PersistentBufferProviderShared(aSize, aFormat, aFwd, texture); return provider.forget(); } PersistentBufferProviderShared::PersistentBufferProviderShared(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - CompositableForwarder* aFwd, + KnowsCompositor* aFwd, RefPtr<TextureClient>& aTexture) : mSize(aSize) , mFormat(aFormat) , mFwd(aFwd) , mFront(Nothing()) { if (mTextures.append(aTexture)) { @@ -131,33 +131,33 @@ PersistentBufferProviderShared::~Persist if (IsActivityTracked()) { mFwd->GetActiveResourceTracker().RemoveObject(this); } Destroy(); } bool -PersistentBufferProviderShared::SetForwarder(CompositableForwarder* aFwd) +PersistentBufferProviderShared::SetForwarder(KnowsCompositor* aFwd) { MOZ_ASSERT(aFwd); if (!aFwd) { return false; } if (mFwd == aFwd) { // The forwarder should not change most of the time. return true; } if (IsActivityTracked()) { mFwd->GetActiveResourceTracker().RemoveObject(this); } - if (mFwd->AsTextureForwarder() != aFwd->AsTextureForwarder() || + if (mFwd->GetTextureForwarder() != aFwd->GetTextureForwarder() || mFwd->GetCompositorBackendType() != aFwd->GetCompositorBackendType()) { // We are going to be used with an different and/or incompatible forwarder. // This should be extremely rare. We have to copy the front buffer into a // texture that is compatible with the new forwarder. // Grab the current front buffer. RefPtr<TextureClient> prevTexture = GetTexture(mFront); @@ -220,17 +220,17 @@ PersistentBufferProviderShared::GetTextu return nullptr; } return mTextures[aIndex.value()]; } already_AddRefed<gfx::DrawTarget> PersistentBufferProviderShared::BorrowDrawTarget(const gfx::IntRect& aPersistedRect) { - if (!mFwd->IPCOpen()) { + if (!mFwd->GetTextureForwarder()->IPCOpen()) { return nullptr; } MOZ_ASSERT(!mSnapshot); if (IsActivityTracked()) { mFwd->GetActiveResourceTracker().MarkUsed(this); } else { @@ -437,9 +437,9 @@ PersistentBufferProviderShared::Destroy( texture->Unlock(); } } mTextures.clear(); } } // namespace layers -} // namespace mozilla \ No newline at end of file +} // namespace mozilla
--- a/gfx/layers/PersistentBufferProvider.h +++ b/gfx/layers/PersistentBufferProvider.h @@ -4,17 +4,17 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef MOZILLA_GFX_PersistentBUFFERPROVIDER_H #define MOZILLA_GFX_PersistentBUFFERPROVIDER_H #include "mozilla/Assertions.h" // for MOZ_ASSERT, etc #include "mozilla/RefPtr.h" // for RefPtr, already_AddRefed, etc #include "mozilla/layers/LayersTypes.h" -#include "mozilla/layers/CompositableForwarder.h" +#include "mozilla/layers/TextureForwarder.h" #include "mozilla/gfx/Types.h" #include "mozilla/Vector.h" namespace mozilla { namespace gfx { class SourceSurface; class DrawTarget; @@ -59,17 +59,17 @@ public: virtual already_AddRefed<gfx::SourceSurface> BorrowSnapshot() = 0; virtual void ReturnSnapshot(already_AddRefed<gfx::SourceSurface> aSnapshot) = 0; virtual TextureClient* GetTextureClient() { return nullptr; } virtual void OnShutdown() {} - virtual bool SetForwarder(CompositableForwarder* aFwd) { return true; } + virtual bool SetForwarder(KnowsCompositor* aFwd) { return true; } /** * Return true if this provider preserves the drawing state (clips, transforms, * etc.) across frames. In practice this means users of the provider can skip * popping all of the clips at the end of the frames and pushing them back at * the beginning of the following frames, which can be costly (cf. bug 1294351). */ virtual bool PreservesDrawingState() const = 0; @@ -112,17 +112,17 @@ private: class PersistentBufferProviderShared : public PersistentBufferProvider , public ActiveResource { public: MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PersistentBufferProviderShared, override) static already_AddRefed<PersistentBufferProviderShared> Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - CompositableForwarder* aFwd); + KnowsCompositor* aFwd); virtual LayersBackend GetType() override { return LayersBackend::LAYERS_CLIENT; } virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget(const gfx::IntRect& aPersistedRect) override; virtual bool ReturnDrawTarget(already_AddRefed<gfx::DrawTarget> aDT) override; virtual already_AddRefed<gfx::SourceSurface> BorrowSnapshot() override; @@ -130,34 +130,34 @@ public: virtual void ReturnSnapshot(already_AddRefed<gfx::SourceSurface> aSnapshot) override; virtual TextureClient* GetTextureClient() override; virtual void NotifyInactive() override; virtual void OnShutdown() override { Destroy(); } - virtual bool SetForwarder(CompositableForwarder* aFwd) override; + virtual bool SetForwarder(KnowsCompositor* aFwd) override; virtual bool PreservesDrawingState() const override { return false; } protected: PersistentBufferProviderShared(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - CompositableForwarder* aFwd, + KnowsCompositor* aFwd, RefPtr<TextureClient>& aTexture); ~PersistentBufferProviderShared(); TextureClient* GetTexture(Maybe<uint32_t> aIndex); bool CheckIndex(uint32_t aIndex) { return aIndex < mTextures.length(); } void Destroy(); gfx::IntSize mSize; gfx::SurfaceFormat mFormat; - RefPtr<CompositableForwarder> mFwd; + RefPtr<KnowsCompositor> mFwd; Vector<RefPtr<TextureClient>, 4> mTextures; // Offset of the texture in mTextures that the canvas uses. Maybe<uint32_t> mBack; // Offset of the texture in mTextures that is presented to the compositor. Maybe<uint32_t> mFront; RefPtr<gfx::DrawTarget> mDrawTarget; RefPtr<gfx::SourceSurface > mSnapshot;
--- a/gfx/layers/TextureDIB.cpp +++ b/gfx/layers/TextureDIB.cpp @@ -20,26 +20,27 @@ namespace layers { * The coresponding TextureHost depends on the compositor */ class MemoryDIBTextureData : public DIBTextureData { public: virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override; virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) override; static DIBTextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat); - virtual void Deallocate(ClientIPCAllocator* aAllocator) override + virtual void Deallocate(LayersIPCChannel* aAllocator) override { mSurface = nullptr; } MemoryDIBTextureData(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfxWindowsSurface* aSurface) : DIBTextureData(aSize, aFormat, aSurface) { @@ -57,40 +58,41 @@ public: * The coresponding TextureHost depends on the compositor */ class ShmemDIBTextureData : public DIBTextureData { public: virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override; virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) override; static DIBTextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); void DeallocateData() { if (mSurface) { ::DeleteObject(mBitmap); ::DeleteDC(mDC); ::CloseHandle(mFileMapping); mBitmap = NULL; mDC = NULL; mFileMapping = NULL; mSurface = nullptr; } } - virtual void Deallocate(ClientIPCAllocator* aAllocator) override + virtual void Deallocate(LayersIPCChannel* aAllocator) override { DeallocateData(); } ShmemDIBTextureData(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfxWindowsSurface* aSurface, HANDLE aFileMapping, HANDLE aHostHandle, HDC aDC, HBITMAP aBitmap) @@ -132,33 +134,34 @@ DIBTextureData::FillInfo(TextureData::In already_AddRefed<gfx::DrawTarget> DIBTextureData::BorrowDrawTarget() { return gfxPlatform::GetPlatform()->CreateDrawTargetForSurface(mSurface, mSize); } DIBTextureData* DIBTextureData::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { if (!aAllocator) { return nullptr; } if (aFormat == gfx::SurfaceFormat::UNKNOWN) { return nullptr; } if (aAllocator->IsSameProcess()) { return MemoryDIBTextureData::Create(aSize, aFormat); } else { return ShmemDIBTextureData::Create(aSize, aFormat, aAllocator); } } TextureData* -MemoryDIBTextureData::CreateSimilar(ClientIPCAllocator* aAllocator, +MemoryDIBTextureData::CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { if (!aAllocator) { return nullptr; } return MemoryDIBTextureData::Create(mSize, mFormat); } @@ -211,17 +214,18 @@ MemoryDIBTextureData::UpdateFromSurface( srcSurf->GetSize().width * BytesPerPixel(srcSurf->GetFormat())); } srcSurf->Unmap(); return true; } TextureData* -ShmemDIBTextureData::CreateSimilar(ClientIPCAllocator* aAllocator, +ShmemDIBTextureData::CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { if (!aAllocator) { return nullptr; } return ShmemDIBTextureData::Create(mSize, mFormat, aAllocator); } @@ -275,17 +279,17 @@ ShmemDIBTextureData::Serialize(SurfaceDe ::GdiFlush(); aOutDescriptor = SurfaceDescriptorFileMapping((WindowsHandle)mHostHandle, mFormat, mSize); return true; } DIBTextureData* ShmemDIBTextureData::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { MOZ_ASSERT(aAllocator->GetParentPid() != base::ProcessId()); DWORD mapSize = aSize.width * aSize.height * BytesPerPixel(aFormat); HANDLE fileMapping = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, mapSize, NULL); if (!fileMapping) { gfxCriticalError() << "Failed to create memory file mapping for " << mapSize << " bytes.";
--- a/gfx/layers/TextureDIB.h +++ b/gfx/layers/TextureDIB.h @@ -23,17 +23,17 @@ public: virtual void Unlock() override {} virtual void FillInfo(TextureData::Info& aInfo) const override; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override; static DIBTextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); protected: DIBTextureData(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfxWindowsSurface* aSurface) : mSurface(aSurface) , mSize(aSize) , mFormat(aFormat) {
--- a/gfx/layers/TextureWrapperImage.cpp +++ b/gfx/layers/TextureWrapperImage.cpp @@ -44,15 +44,15 @@ TextureWrapperImage::GetAsSourceSurface( if (!dt) { return nullptr; } return dt->Snapshot(); } TextureClient* -TextureWrapperImage::GetTextureClient(TextureForwarder* aForwarder) +TextureWrapperImage::GetTextureClient(KnowsCompositor* aForwarder) { return mTextureClient; } } // namespace layers } // namespace mozilla
--- a/gfx/layers/TextureWrapperImage.h +++ b/gfx/layers/TextureWrapperImage.h @@ -19,17 +19,17 @@ class TextureWrapperImage final : public { public: TextureWrapperImage(TextureClient* aClient, const gfx::IntRect& aPictureRect); ~TextureWrapperImage() override; gfx::IntSize GetSize() override; gfx::IntRect GetPictureRect() override; already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override; - TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; private: gfx::IntRect mPictureRect; RefPtr<TextureClient> mTextureClient; }; } // namespace layers } // namespace mozilla
--- a/gfx/layers/basic/TextureClientX11.cpp +++ b/gfx/layers/basic/TextureClientX11.cpp @@ -101,32 +101,33 @@ X11TextureData::UpdateFromSurface(gfx::S } dt->CopySurface(aSurface, IntRect(IntPoint(), aSurface->GetSize()), IntPoint()); return true; } void -X11TextureData::Deallocate(ClientIPCAllocator*) +X11TextureData::Deallocate(LayersIPCChannel*) { mSurface = nullptr; } TextureData* -X11TextureData::CreateSimilar(ClientIPCAllocator* aAllocator, +X11TextureData::CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { return X11TextureData::Create(mSize, mFormat, aFlags, aAllocator); } X11TextureData* X11TextureData::Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - TextureFlags aFlags, ClientIPCAllocator* aAllocator) + TextureFlags aFlags, LayersIPCChannel* aAllocator) { MOZ_ASSERT(aSize.width >= 0 && aSize.height >= 0); if (aSize.width <= 0 || aSize.height <= 0 || aSize.width > XLIB_IMAGE_SIDE_SIZE_LIMIT || aSize.height > XLIB_IMAGE_SIDE_SIZE_LIMIT) { gfxDebug() << "Asking for X11 surface of invalid size " << aSize.width << "x" << aSize.height; return nullptr; }
--- a/gfx/layers/basic/TextureClientX11.h +++ b/gfx/layers/basic/TextureClientX11.h @@ -12,32 +12,33 @@ namespace mozilla { namespace layers { class X11TextureData : public TextureData { public: static X11TextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - TextureFlags aFlags, ClientIPCAllocator* aAllocator); + TextureFlags aFlags, LayersIPCChannel* aAllocator); virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; virtual bool Lock(OpenMode aMode, FenceHandle*) override; virtual void Unlock() override; virtual void FillInfo(TextureData::Info& aInfo) const override; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override; - virtual void Deallocate(ClientIPCAllocator*) override; + virtual void Deallocate(LayersIPCChannel*) override; virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override; virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) override; protected: X11TextureData(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, bool aClientDeallocation, bool aIsCrossProcess,
--- a/gfx/layers/client/CanvasClient.cpp +++ b/gfx/layers/client/CanvasClient.cpp @@ -206,25 +206,25 @@ CanvasClientSharedSurface::~CanvasClient // For formats compatible with R8G8B8A8. static inline void SwapRB_R8G8B8A8(uint8_t* pixel) { // [RR, GG, BB, AA] Swap(pixel[0], pixel[2]); } class TexClientFactory { - ClientIPCAllocator* const mAllocator; + CompositableForwarder* const mAllocator; const bool mHasAlpha; const gfx::IntSize mSize; const gfx::BackendType mBackendType; const TextureFlags mBaseTexFlags; const LayersBackend mLayersBackend; public: - TexClientFactory(ClientIPCAllocator* allocator, bool hasAlpha, + TexClientFactory(CompositableForwarder* allocator, bool hasAlpha, const gfx::IntSize& size, gfx::BackendType backendType, TextureFlags baseTexFlags, LayersBackend layersBackend) : mAllocator(allocator) , mHasAlpha(hasAlpha) , mSize(size) , mBackendType(backendType) , mBaseTexFlags(baseTexFlags) , mLayersBackend(layersBackend) @@ -262,17 +262,17 @@ public: } } return ret.forget(); } }; static already_AddRefed<TextureClient> -TexClientFromReadback(SharedSurface* src, ClientIPCAllocator* allocator, +TexClientFromReadback(SharedSurface* src, CompositableForwarder* allocator, TextureFlags baseFlags, LayersBackend layersBackend) { auto backendType = gfx::BackendType::CAIRO; TexClientFactory factory(allocator, src->mHasAlpha, src->mSize, backendType, baseFlags, layersBackend); RefPtr<TextureClient> texClient; @@ -418,17 +418,17 @@ CanvasClientSharedSurface::UpdateRendere } else if (layer && layer->mIsMirror) { mShSurfClient = CloneSurface(gl->Screen()->Front()->Surf(), layer->mFactory.get()); if (!mShSurfClient) { return; } } else { mShSurfClient = gl->Screen()->Front(); if (mShSurfClient && mShSurfClient->GetAllocator() && - mShSurfClient->GetAllocator()->AsCompositableForwarder() != GetForwarder()) { + mShSurfClient->GetAllocator() != GetForwarder()->GetTextureForwarder()) { mShSurfClient = CloneSurface(mShSurfClient->Surf(), gl->Screen()->Factory()); } if (!mShSurfClient) { return; } } MOZ_ASSERT(mShSurfClient);
--- a/gfx/layers/client/ClientLayerManager.h +++ b/gfx/layers/client/ClientLayerManager.h @@ -87,17 +87,17 @@ public: virtual already_AddRefed<CanvasLayer> CreateCanvasLayer() override; virtual already_AddRefed<ReadbackLayer> CreateReadbackLayer() override; virtual already_AddRefed<ColorLayer> CreateColorLayer() override; virtual already_AddRefed<RefLayer> CreateRefLayer() override; void UpdateTextureFactoryIdentifier(const TextureFactoryIdentifier& aNewIdentifier); TextureFactoryIdentifier GetTextureFactoryIdentifier() { - return mForwarder->GetTextureFactoryIdentifier(); + return AsShadowForwarder()->GetTextureFactoryIdentifier(); } virtual void FlushRendering() override; void SendInvalidRegion(const nsIntRegion& aRegion); virtual uint32_t StartFrameTimeRecording(int32_t aBufferSize) override; virtual void StopFrameTimeRecording(uint32_t aStartIndex,
--- a/gfx/layers/client/CompositableClient.cpp +++ b/gfx/layers/client/CompositableClient.cpp @@ -30,19 +30,19 @@ using namespace mozilla::gfx; void RemoveTextureFromCompositableTracker::ReleaseTextureClient() { if (mTextureClient && mTextureClient->GetAllocator() && !mTextureClient->GetAllocator()->UsesImageBridge()) { RefPtr<TextureClientReleaseTask> task = new TextureClientReleaseTask(mTextureClient); - RefPtr<ClientIPCAllocator> allocator = mTextureClient->GetAllocator(); + RefPtr<LayersIPCChannel> allocator = mTextureClient->GetAllocator(); mTextureClient = nullptr; - allocator->AsClientAllocator()->GetMessageLoop()->PostTask(task.forget()); + allocator->GetMessageLoop()->PostTask(task.forget()); } else { mTextureClient = nullptr; } } void CompositableClient::InitIPDLActor(PCompositableChild* aActor, uint64_t aAsyncID) { @@ -168,19 +168,18 @@ CompositableClient::CreateTextureClientF } already_AddRefed<TextureClient> CompositableClient::CreateTextureClientFromSurface(gfx::SourceSurface* aSurface, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { - return TextureClient::CreateFromSurface(GetForwarder()->AsTextureForwarder(), + return TextureClient::CreateFromSurface(GetForwarder(), aSurface, - GetForwarder()->GetCompositorBackendType(), aSelector, aTextureFlags | mTextureFlags, aAllocFlags); } bool CompositableClient::AddTextureClient(TextureClient* aClient) { @@ -219,17 +218,17 @@ CompositableClient::GetTextureClientRecy if (mTextureClientRecycler) { return mTextureClientRecycler; } if (!mForwarder) { return nullptr; } - if(!mForwarder->UsesImageBridge()) { + if(!mForwarder->GetTextureForwarder()->UsesImageBridge()) { MOZ_ASSERT(NS_IsMainThread()); mTextureClientRecycler = new layers::TextureClientRecycleAllocator(mForwarder); return mTextureClientRecycler; } // Handle a case that mForwarder is ImageBridge if (InImageBridgeChildThread()) {
--- a/gfx/layers/client/ContentClient.cpp +++ b/gfx/layers/client/ContentClient.cpp @@ -305,16 +305,17 @@ ContentClientRemoteBuffer::CreateBackBuf ); if (!mTextureClient || !AddTextureClient(mTextureClient)) { AbortTextureClientCreation(); return; } if (mTextureFlags & TextureFlags::COMPONENT_ALPHA) { mTextureClientOnWhite = mTextureClient->CreateSimilar( + mForwarder->GetCompositorBackendType(), mTextureFlags | ExtraTextureFlags(), TextureAllocationFlags::ALLOC_CLEAR_BUFFER_WHITE ); if (!mTextureClientOnWhite || !AddTextureClient(mTextureClientOnWhite)) { AbortTextureClientCreation(); return; } }
--- a/gfx/layers/client/GPUVideoTextureClient.cpp +++ b/gfx/layers/client/GPUVideoTextureClient.cpp @@ -28,24 +28,24 @@ GPUVideoTextureData::FillInfo(TextureDat aInfo.format = SurfaceFormat::B8G8R8X8; aInfo.hasIntermediateBuffer = false; aInfo.hasSynchronization = false; aInfo.supportsMoz2D = false; aInfo.canExposeMappedData = false; } void -GPUVideoTextureData::Deallocate(ClientIPCAllocator* aAllocator) +GPUVideoTextureData::Deallocate(LayersIPCChannel* aAllocator) { dom::VideoDecoderManagerChild::GetSingleton()->DeallocateSurfaceDescriptorGPUVideo(mSD); mSD = SurfaceDescriptorGPUVideo(); } void -GPUVideoTextureData::Forget(ClientIPCAllocator* aAllocator) +GPUVideoTextureData::Forget(LayersIPCChannel* aAllocator) { // We always need to manually deallocate on the client side. // Ideally we'd set up our TextureClient with the DEALLOCATE_CLIENT // flag, but that forces texture destruction to be synchronous. // Instead let's just deallocate from here as well. Deallocate(aAllocator); }
--- a/gfx/layers/client/GPUVideoTextureClient.h +++ b/gfx/layers/client/GPUVideoTextureClient.h @@ -25,19 +25,19 @@ public: virtual void FillInfo(TextureData::Info& aInfo) const override; virtual bool Lock(OpenMode, FenceHandle*) override { return true; }; virtual void Unlock() override {}; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - virtual void Deallocate(ClientIPCAllocator* aAllocator) override; + virtual void Deallocate(LayersIPCChannel* aAllocator) override; - virtual void Forget(ClientIPCAllocator* aAllocator) override; + virtual void Forget(LayersIPCChannel* aAllocator) override; protected: SurfaceDescriptorGPUVideo mSD; gfx::IntSize mSize; }; } // namespace layers } // namespace mozilla
--- a/gfx/layers/client/ImageClient.cpp +++ b/gfx/layers/client/ImageClient.cpp @@ -73,17 +73,17 @@ ImageClient::RemoveTexture(TextureClient RemoveTextureWithWaiter(aTexture); } void ImageClient::RemoveTextureWithWaiter(TextureClient* aTexture, AsyncTransactionWaiter* aAsyncTransactionWaiter) { if (aAsyncTransactionWaiter && - GetForwarder()->UsesImageBridge()) { + GetForwarder()->GetTextureForwarder()->UsesImageBridge()) { RefPtr<AsyncTransactionTracker> request = new RemoveTextureFromCompositableTracker(aAsyncTransactionWaiter); GetForwarder()->RemoveTextureFromCompositableAsync(request, this, aTexture); return; } MOZ_ASSERT(!aAsyncTransactionWaiter); GetForwarder()->RemoveTextureFromCompositable(this, aTexture); } @@ -98,17 +98,17 @@ ImageClientSingle::ImageClientSingle(Com TextureInfo ImageClientSingle::GetTextureInfo() const { return TextureInfo(CompositableType::IMAGE); } void ImageClientSingle::FlushAllImages(AsyncTransactionWaiter* aAsyncTransactionWaiter) { - MOZ_ASSERT(GetForwarder()->UsesImageBridge()); + MOZ_ASSERT(GetForwarder()->GetTextureForwarder()->UsesImageBridge()); for (auto& b : mBuffers) { RemoveTextureWithWaiter(b.mTextureClient, aAsyncTransactionWaiter); } mBuffers.Clear(); } bool @@ -214,23 +214,23 @@ ImageClientSingle::UpdateImage(ImageCont } } else if (image->GetFormat() == ImageFormat::SURFACE_TEXTURE || image->GetFormat() == ImageFormat::EGLIMAGE) { gfx::IntSize size = image->GetSize(); if (image->GetFormat() == ImageFormat::EGLIMAGE) { EGLImageImage* typedImage = image->AsEGLImageImage(); texture = EGLImageTextureData::CreateTextureClient( - typedImage, size, GetForwarder(), mTextureFlags); + typedImage, size, GetForwarder()->GetTextureForwarder(), mTextureFlags); #ifdef MOZ_WIDGET_ANDROID } else if (image->GetFormat() == ImageFormat::SURFACE_TEXTURE) { SurfaceTextureImage* typedImage = image->AsSurfaceTextureImage(); texture = AndroidSurfaceTextureData::CreateTextureClient( typedImage->GetSurfaceTexture(), size, typedImage->GetOriginPos(), - GetForwarder(), mTextureFlags + GetForwarder()->GetTextureForwarder(), mTextureFlags ); #endif } else { MOZ_ASSERT(false, "Bad ImageFormat."); } } else { RefPtr<gfx::SourceSurface> surface = image->GetAsSourceSurface(); MOZ_ASSERT(surface);
--- a/gfx/layers/client/TextureClient.cpp +++ b/gfx/layers/client/TextureClient.cpp @@ -70,17 +70,17 @@ namespace layers { using namespace mozilla::ipc; using namespace mozilla::gl; using namespace mozilla::gfx; struct TextureDeallocParams { TextureData* data; RefPtr<TextureChild> actor; - RefPtr<ClientIPCAllocator> allocator; + RefPtr<LayersIPCChannel> allocator; bool clientDeallocation; bool syncDeallocation; bool workAroundSharedSurfaceOwnershipIssue; }; void DeallocateTextureClient(TextureDeallocParams params); /** @@ -114,25 +114,25 @@ public: , mMainThreadOnly(false) , mIPCOpen(false) , mOwnsTextureData(false) , mOwnerCalledDestroy(false) {} bool Recv__delete__() override { return true; } - ClientIPCAllocator* GetAllocator() { return mTextureForwarder; } + LayersIPCChannel* GetAllocator() { return mTextureForwarder; } void ActorDestroy(ActorDestroyReason why) override; bool IPCOpen() const { return mIPCOpen; } - void Lock() const { if (mCompositableForwarder && mCompositableForwarder->UsesImageBridge()) { mLock.Enter(); } } + void Lock() const { if (mCompositableForwarder && mCompositableForwarder->GetTextureForwarder()->UsesImageBridge()) { mLock.Enter(); } } - void Unlock() const { if (mCompositableForwarder && mCompositableForwarder->UsesImageBridge()) { mLock.Leave(); } } + void Unlock() const { if (mCompositableForwarder && mCompositableForwarder->GetTextureForwarder()->UsesImageBridge()) { mLock.Leave(); } } private: // AddIPDLReference and ReleaseIPDLReference are only to be called by CreateIPDLActor // and DestroyIPDLActor, respectively. We intentionally make them private to prevent misuse. // The purpose of these methods is to be aware of when the IPC system around this // actor goes down: mIPCOpen is then set to false. void AddIPDLReference() { @@ -235,25 +235,25 @@ private: bool mOwnsTextureData; bool mOwnerCalledDestroy; friend class TextureClient; friend void DeallocateTextureClient(TextureDeallocParams params); }; -static void DestroyTextureData(TextureData* aTextureData, ClientIPCAllocator* aAllocator, +static void DestroyTextureData(TextureData* aTextureData, LayersIPCChannel* aAllocator, bool aDeallocate, bool aMainThreadOnly) { if (!aTextureData) { return; } if (aMainThreadOnly && !NS_IsMainThread()) { - RefPtr<ClientIPCAllocator> allocatorRef = aAllocator; + RefPtr<LayersIPCChannel> allocatorRef = aAllocator; NS_DispatchToMainThread(NS_NewRunnableFunction([aTextureData, allocatorRef, aDeallocate]() -> void { DestroyTextureData(aTextureData, allocatorRef, aDeallocate, true); })); return; } if (aDeallocate) { aTextureData->Deallocate(aAllocator); @@ -347,17 +347,17 @@ DeallocateTextureClient(TextureDeallocPa // Nothing to do return; } TextureChild* actor = params.actor; MessageLoop* ipdlMsgLoop = nullptr; if (params.allocator) { - ipdlMsgLoop = params.allocator->AsClientAllocator()->GetMessageLoop(); + ipdlMsgLoop = params.allocator->GetMessageLoop(); if (!ipdlMsgLoop) { // An allocator with no message loop means we are too late in the shutdown // sequence. gfxCriticalError() << "Texture deallocated too late during shutdown"; return; } } @@ -380,17 +380,17 @@ DeallocateTextureClient(TextureDeallocPa return; } // Below this line, we are either in the IPDL thread or ther is no IPDL // thread anymore. if (!ipdlMsgLoop) { // If we don't have a message loop we can't know for sure that we are in - // the IPDL thread and use the ClientIPCAllocator. + // the IPDL thread and use the LayersIPCChannel. // This should ideally not happen outside of gtest, but some shutdown raciness // could put us in this situation. params.allocator = nullptr; } if (!actor) { // We don't have an IPDL actor, probably because we destroyed the TextureClient // before sharing it with the compositor. It means the data cannot be owned by @@ -636,27 +636,27 @@ TextureClient::UpdateFromSurface(gfx::So return; } } NS_WARNING("TextureClient::UpdateFromSurface failed"); } already_AddRefed<TextureClient> -TextureClient::CreateSimilar(TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const +TextureClient::CreateSimilar(LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { MOZ_ASSERT(IsValid()); MOZ_ASSERT(!mIsLocked); if (mIsLocked) { return nullptr; } LockActor(); - TextureData* data = mData->CreateSimilar(mAllocator, aFlags, aAllocFlags); + TextureData* data = mData->CreateSimilar(mAllocator, aLayersBackend, aFlags, aAllocFlags); UnlockActor(); if (!data) { return nullptr; } return MakeAndAddRef<TextureClient>(data, aFlags, mAllocator); } @@ -864,17 +864,17 @@ void TextureClient::CancelWaitFenceHandleOnImageBridge() { if (!NeedsFenceHandle() || GetFlags() & TextureFlags::RECYCLE) { return; } ImageBridgeChild::GetSingleton()->CancelWaitFenceHandle(this); } -void CancelTextureClientRecycle(uint64_t aTextureId, ClientIPCAllocator* aAllocator) +void CancelTextureClientRecycle(uint64_t aTextureId, LayersIPCChannel* aAllocator) { if (!aAllocator) { return; } MessageLoop* msgLoop = nullptr; msgLoop = aAllocator->GetMessageLoop(); if (!msgLoop) { return; @@ -913,27 +913,27 @@ TextureClient::SetRecycleAllocator(IText } else { ClearRecycleCallback(); } } bool TextureClient::InitIPDLActor(CompositableForwarder* aForwarder) { - MOZ_ASSERT(aForwarder && aForwarder->GetMessageLoop() == mAllocator->AsClientAllocator()->GetMessageLoop()); + MOZ_ASSERT(aForwarder && aForwarder->GetTextureForwarder()->GetMessageLoop() == mAllocator->GetMessageLoop()); if (mActor && !mActor->mDestroyed) { CompositableForwarder* currentFwd = mActor->mCompositableForwarder; TextureForwarder* currentTexFwd = mActor->mTextureForwarder; if (currentFwd != aForwarder) { // It's a bit iffy but right now ShadowLayerForwarder inherits TextureForwarder - // even though it should not. ShadowLayerForwarder::AsTextureForwarder actually + // even though it should not. ShadowLayerForwarder::GetTextureForwarder actually // returns a pointer to the CompositorBridgeChild. // It's Ok for a texture to move from a ShadowLayerForwarder to another, but // not form a CompositorBridgeChild to another (they use different channels). - if (currentTexFwd && currentTexFwd != aForwarder->AsTextureForwarder()) { + if (currentTexFwd && currentTexFwd != aForwarder->GetTextureForwarder()) { gfxCriticalError() << "Attempt to move a texture to a different channel CF."; return false; } if (currentFwd && currentFwd->GetCompositorBackendType() != aForwarder->GetCompositorBackendType()) { gfxCriticalError() << "Attempt to move a texture to different compositor backend."; return false; } mActor->mCompositableForwarder = aForwarder; @@ -942,74 +942,75 @@ TextureClient::InitIPDLActor(Compositabl } MOZ_ASSERT(!mActor || mActor->mDestroyed, "Cannot use a texture on several IPC channels."); SurfaceDescriptor desc; if (!ToSurfaceDescriptor(desc)) { return false; } - mActor = static_cast<TextureChild*>(aForwarder->CreateTexture(desc, - aForwarder->GetCompositorBackendType(), - GetFlags(), - mSerial)); + mActor = static_cast<TextureChild*>(aForwarder->GetTextureForwarder()->CreateTexture(desc, + aForwarder->GetCompositorBackendType(), + GetFlags(), + mSerial)); if (!mActor) { gfxCriticalError() << static_cast<int32_t>(desc.type()) << ", " << static_cast<int32_t>(aForwarder->GetCompositorBackendType()) << ", " << static_cast<uint32_t>(GetFlags()) << ", " << mSerial; MOZ_CRASH("GFX: Invalid actor"); } mActor->mCompositableForwarder = aForwarder; - mActor->mTextureForwarder = aForwarder->AsTextureForwarder(); + mActor->mTextureForwarder = aForwarder->GetTextureForwarder(); mActor->mTextureClient = this; mActor->mMainThreadOnly = !!(mFlags & TextureFlags::DEALLOCATE_MAIN_THREAD); // If the TextureClient is already locked, we have to lock TextureChild's mutex // since it will be unlocked in TextureClient::Unlock. if (mIsLocked) { LockActor(); } return mActor->IPCOpen(); } bool -TextureClient::InitIPDLActor(TextureForwarder* aForwarder) +TextureClient::InitIPDLActor(KnowsCompositor* aForwarder) { - MOZ_ASSERT(aForwarder && aForwarder->GetMessageLoop() == mAllocator->AsClientAllocator()->GetMessageLoop()); + MOZ_ASSERT(aForwarder && aForwarder->GetTextureForwarder()->GetMessageLoop() == mAllocator->GetMessageLoop()); + TextureForwarder* fwd = aForwarder->GetTextureForwarder(); if (mActor && !mActor->mDestroyed) { CompositableForwarder* currentFwd = mActor->mCompositableForwarder; TextureForwarder* currentTexFwd = mActor->mTextureForwarder; if (currentFwd) { gfxCriticalError() << "Attempt to remove a texture from a CompositableForwarder."; return false; } - if (currentTexFwd && currentTexFwd != aForwarder) { + if (currentTexFwd && currentTexFwd != fwd) { gfxCriticalError() << "Attempt to move a texture to a different channel TF."; return false; } - mActor->mTextureForwarder = aForwarder; + mActor->mTextureForwarder = fwd; return true; } MOZ_ASSERT(!mActor || mActor->mDestroyed, "Cannot use a texture on several IPC channels."); SurfaceDescriptor desc; if (!ToSurfaceDescriptor(desc)) { return false; } - mActor = static_cast<TextureChild*>(aForwarder->CreateTexture(desc, - aForwarder->GetCompositorBackendType(), - GetFlags(), - mSerial)); + mActor = static_cast<TextureChild*>(fwd->CreateTexture(desc, + aForwarder->GetCompositorBackendType(), + GetFlags(), + mSerial)); MOZ_ASSERT(mActor); - mActor->mTextureForwarder = aForwarder; + mActor->mTextureForwarder = fwd; mActor->mTextureClient = this; mActor->mMainThreadOnly = !!(mFlags & TextureFlags::DEALLOCATE_MAIN_THREAD); // If the TextureClient is already locked, we have to lock TextureChild's mutex // since it will be unlocked in TextureClient::Unlock. if (mIsLocked) { LockActor(); } @@ -1034,84 +1035,74 @@ BackendTypeForBackendSelector(LayersBack default: MOZ_ASSERT_UNREACHABLE("Unknown backend selector"); return gfx::BackendType::NONE; } }; // static already_AddRefed<TextureClient> -TextureClient::CreateForDrawing(CompositableForwarder* aAllocator, +TextureClient::CreateForDrawing(KnowsCompositor* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { LayersBackend layersBackend = aAllocator->GetCompositorBackendType(); - return TextureClient::CreateForDrawing(aAllocator->AsTextureForwarder(), + return TextureClient::CreateForDrawing(aAllocator->GetTextureForwarder(), aFormat, aSize, layersBackend, + aAllocator->GetMaxTextureSize(), aSelector, aTextureFlags, aAllocFlags); } // static already_AddRefed<TextureClient> TextureClient::CreateForDrawing(TextureForwarder* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, LayersBackend aLayersBackend, + int32_t aMaxTextureSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { - // What we want here is the "real" TextureForwarder. ShadowLayerForwarder, - // while inheriting TextureForwarder, actually forwards all of its TF methods - // to CompositorBridgeChild. In order to avoid odd situations where some - // textures point to a ShadowLayerForwarder and some point directly to the - // CompositorBridgeChild, we just get the actual TextureForwarder which is - // returned by AsTextureForwarder... - aAllocator = aAllocator->AsTextureForwarder(); - gfx::BackendType moz2DBackend = BackendTypeForBackendSelector(aLayersBackend, aSelector); // also test the validity of aAllocator MOZ_ASSERT(aAllocator && aAllocator->IPCOpen()); if (!aAllocator || !aAllocator->IPCOpen()) { return nullptr; } if (!gfx::Factory::AllowedSurfaceSize(aSize)) { return nullptr; } TextureData* data = nullptr; -#if defined(XP_WIN) - int32_t maxTextureSize = aAllocator->GetMaxTextureSize(); -#endif - #ifdef XP_WIN if (aLayersBackend == LayersBackend::LAYERS_D3D11 && (moz2DBackend == gfx::BackendType::DIRECT2D || moz2DBackend == gfx::BackendType::DIRECT2D1_1 || (!!(aAllocFlags & ALLOC_FOR_OUT_OF_BAND_CONTENT) && DeviceManagerDx::Get()->GetContentDevice())) && - aSize.width <= maxTextureSize && - aSize.height <= maxTextureSize) + aSize.width <= aMaxTextureSize && + aSize.height <= aMaxTextureSize) { data = DXGITextureData::Create(aSize, aFormat, aAllocFlags); } if (aLayersBackend == LayersBackend::LAYERS_D3D9 && moz2DBackend == gfx::BackendType::CAIRO && aAllocator->IsSameProcess() && - aSize.width <= maxTextureSize && - aSize.height <= maxTextureSize && + aSize.width <= aMaxTextureSize && + aSize.height <= aMaxTextureSize && NS_IsMainThread() && DeviceManagerD3D9::GetDevice()) { data = D3D9TextureData::Create(aSize, aFormat, aAllocFlags); } if (!data && aFormat == SurfaceFormat::B8G8R8X8 && moz2DBackend == gfx::BackendType::CAIRO && NS_IsMainThread()) { @@ -1165,94 +1156,92 @@ TextureClient::CreateForDrawing(TextureF // Can't do any better than a buffer texture client. return TextureClient::CreateForRawBufferAccess(aAllocator, aFormat, aSize, moz2DBackend, aLayersBackend, aTextureFlags, aAllocFlags); } // static already_AddRefed<TextureClient> -TextureClient::CreateFromSurface(TextureForwarder* aAllocator, +TextureClient::CreateFromSurface(KnowsCompositor* aAllocator, gfx::SourceSurface* aSurface, - LayersBackend aLayersBackend, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { - aAllocator = aAllocator->AsTextureForwarder(); - // also test the validity of aAllocator - MOZ_ASSERT(aAllocator && aAllocator->IPCOpen()); - if (!aAllocator || !aAllocator->IPCOpen()) { + MOZ_ASSERT(aAllocator && aAllocator->GetTextureForwarder()->IPCOpen()); + if (!aAllocator || !aAllocator->GetTextureForwarder()->IPCOpen()) { return nullptr; } gfx::IntSize size = aSurface->GetSize(); if (!gfx::Factory::AllowedSurfaceSize(size)) { return nullptr; } TextureData* data = nullptr; #if defined(XP_WIN) - gfx::BackendType moz2DBackend = BackendTypeForBackendSelector(aLayersBackend, aSelector); + LayersBackend layersBackend = aAllocator->GetCompositorBackendType(); + gfx::BackendType moz2DBackend = BackendTypeForBackendSelector(layersBackend, aSelector); int32_t maxTextureSize = aAllocator->GetMaxTextureSize(); - if (aLayersBackend == LayersBackend::LAYERS_D3D11 && + if (layersBackend == LayersBackend::LAYERS_D3D11 && (moz2DBackend == gfx::BackendType::DIRECT2D || moz2DBackend == gfx::BackendType::DIRECT2D1_1 || (!!(aAllocFlags & ALLOC_FOR_OUT_OF_BAND_CONTENT) && DeviceManagerDx::Get()->GetContentDevice())) && size.width <= maxTextureSize && size.height <= maxTextureSize) { data = D3D11TextureData::Create(aSurface, aAllocFlags); } #endif if (data) { - return MakeAndAddRef<TextureClient>(data, aTextureFlags, aAllocator); + return MakeAndAddRef<TextureClient>(data, aTextureFlags, aAllocator->GetTextureForwarder()); } // Fall back to using UpdateFromSurface RefPtr<TextureClient> client = CreateForDrawing(aAllocator, aSurface->GetFormat(), size, - aLayersBackend, aSelector, aTextureFlags, aAllocFlags); + aSelector, aTextureFlags, aAllocFlags); if (!client) { return nullptr; } TextureClientAutoLock autoLock(client, OpenMode::OPEN_WRITE_ONLY); if (!autoLock.Succeeded()) { return nullptr; } client->UpdateFromSurface(aSurface); return client.forget(); } // static already_AddRefed<TextureClient> -TextureClient::CreateForRawBufferAccess(ClientIPCAllocator* aAllocator, +TextureClient::CreateForRawBufferAccess(KnowsCompositor* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, gfx::BackendType aMoz2DBackend, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { - auto fwd = aAllocator->AsCompositableForwarder(); - auto backend = fwd ? fwd->GetCompositorBackendType() : LayersBackend::LAYERS_NONE; - return CreateForRawBufferAccess(aAllocator, aFormat, aSize, aMoz2DBackend, - backend, aTextureFlags, aAllocFlags); + return CreateForRawBufferAccess(aAllocator->GetTextureForwarder(), + aFormat, aSize, aMoz2DBackend, + aAllocator->GetCompositorBackendType(), + aTextureFlags, aAllocFlags); } // static already_AddRefed<TextureClient> -TextureClient::CreateForRawBufferAccess(ClientIPCAllocator* aAllocator, +TextureClient::CreateForRawBufferAccess(LayersIPCChannel* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, gfx::BackendType aMoz2DBackend, LayersBackend aLayersBackend, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { // also test the validity of aAllocator @@ -1282,64 +1271,66 @@ TextureClient::CreateForRawBufferAccess( return nullptr; } return MakeAndAddRef<TextureClient>(texData, aTextureFlags, aAllocator); } // static already_AddRefed<TextureClient> -TextureClient::CreateForYCbCr(ClientIPCAllocator* aAllocator, +TextureClient::CreateForYCbCr(KnowsCompositor* aAllocator, gfx::IntSize aYSize, gfx::IntSize aCbCrSize, StereoMode aStereoMode, TextureFlags aTextureFlags) { // The only reason we allow aAllocator to be null is for gtests - MOZ_ASSERT(!aAllocator || aAllocator->IPCOpen()); - if (aAllocator && !aAllocator->IPCOpen()) { + MOZ_ASSERT(!aAllocator || aAllocator->GetLayersIPCActor()->IPCOpen()); + if (aAllocator && !aAllocator->GetLayersIPCActor()->IPCOpen()) { return nullptr; } if (!gfx::Factory::AllowedSurfaceSize(aYSize)) { return nullptr; } TextureData* data = BufferTextureData::CreateForYCbCr(aAllocator, aYSize, aCbCrSize, aStereoMode, aTextureFlags); if (!data) { return nullptr; } - return MakeAndAddRef<TextureClient>(data, aTextureFlags, aAllocator); + return MakeAndAddRef<TextureClient>(data, aTextureFlags, + aAllocator ? aAllocator->GetTextureForwarder() : nullptr); } // static already_AddRefed<TextureClient> -TextureClient::CreateForYCbCrWithBufferSize(ClientIPCAllocator* aAllocator, +TextureClient::CreateForYCbCrWithBufferSize(KnowsCompositor* aAllocator, size_t aSize, TextureFlags aTextureFlags) { // also test the validity of aAllocator - MOZ_ASSERT(aAllocator && aAllocator->IPCOpen()); - if (!aAllocator || !aAllocator->IPCOpen()) { + MOZ_ASSERT(!aAllocator || aAllocator->GetLayersIPCActor()->IPCOpen()); + if (aAllocator && !aAllocator->GetLayersIPCActor()->IPCOpen()) { return nullptr; } TextureData* data = BufferTextureData::CreateForYCbCrWithBufferSize(aAllocator, aSize, aTextureFlags); if (!data) { return nullptr; } - return MakeAndAddRef<TextureClient>(data, aTextureFlags, aAllocator); + return MakeAndAddRef<TextureClient>(data, aTextureFlags, + aAllocator ? aAllocator->GetTextureForwarder() : 0); } -TextureClient::TextureClient(TextureData* aData, TextureFlags aFlags, ClientIPCAllocator* aAllocator) +TextureClient::TextureClient(TextureData* aData, TextureFlags aFlags, LayersIPCChannel* aAllocator) : AtomicRefCountedWithFinalize("TextureClient") , mAllocator(aAllocator) , mActor(nullptr) , mData(aData) , mFlags(aFlags) , mOpenMode(OpenMode::OPEN_NONE) #ifdef DEBUG , mExpectedDtRefs(0) @@ -1462,17 +1453,17 @@ public: // it means that we can safely deallocate the shmem section without causing a race // condition with the other process. class ShmemTextureReadLock : public TextureReadLock { public: struct ShmReadLockInfo { int32_t readCount; }; - explicit ShmemTextureReadLock(ClientIPCAllocator* aAllocator); + explicit ShmemTextureReadLock(LayersIPCChannel* aAllocator); ~ShmemTextureReadLock(); virtual int32_t ReadLock() override; virtual int32_t ReadUnlock() override; virtual int32_t GetReadCount() override; @@ -1480,44 +1471,43 @@ public: virtual bool IsValid() const override { return mAllocSuccess; }; virtual LockType GetType() override { return TYPE_SHMEM; } virtual bool Serialize(ReadLockDescriptor& aOutput) override; mozilla::layers::ShmemSection& GetShmemSection() { return mShmemSection; } - ShmemTextureReadLock(ISurfaceAllocator* aAllocator, const mozilla::layers::ShmemSection& aShmemSection) - : mAllocator(aAllocator) - , mShmemSection(aShmemSection) + explicit ShmemTextureReadLock(const mozilla::layers::ShmemSection& aShmemSection) + : mShmemSection(aShmemSection) , mAllocSuccess(true) { MOZ_COUNT_CTOR(ShmemTextureReadLock); } ShmReadLockInfo* GetShmReadLockInfoPtr() { return reinterpret_cast<ShmReadLockInfo*> (mShmemSection.shmem().get<char>() + mShmemSection.offset()); } - RefPtr<ISurfaceAllocator> mAllocator; + RefPtr<LayersIPCChannel> mClientAllocator; mozilla::layers::ShmemSection mShmemSection; bool mAllocSuccess; }; // static already_AddRefed<TextureReadLock> TextureReadLock::Deserialize(const ReadLockDescriptor& aDescriptor, ISurfaceAllocator* aAllocator) { switch (aDescriptor.type()) { case ReadLockDescriptor::TShmemSection: { const ShmemSection& section = aDescriptor.get_ShmemSection(); MOZ_RELEASE_ASSERT(section.shmem().IsReadable()); - return MakeAndAddRef<ShmemTextureReadLock>(aAllocator, section); + return MakeAndAddRef<ShmemTextureReadLock>(section); } case ReadLockDescriptor::Tuintptr_t: { if (!aAllocator->IsSameProcess()) { // Trying to use a memory based lock instead of a shmem based one in // the cross-process case is a bad security violation. NS_ERROR("A client process may be trying to peek at the host's address space!"); return nullptr; } @@ -1540,17 +1530,17 @@ TextureReadLock::Deserialize(const ReadL // Invalid descriptor. MOZ_DIAGNOSTIC_ASSERT(false); } } return nullptr; } // static already_AddRefed<TextureReadLock> -TextureReadLock::Create(ClientIPCAllocator* aAllocator) +TextureReadLock::Create(LayersIPCChannel* aAllocator) { if (aAllocator->IsSameProcess()) { // If our compositor is in the same process, we can save some cycles by not // using shared memory. return MakeAndAddRef<MemoryTextureReadLock>(); } return MakeAndAddRef<ShmemTextureReadLock>(aAllocator); @@ -1599,36 +1589,34 @@ MemoryTextureReadLock::ReadUnlock() int32_t MemoryTextureReadLock::GetReadCount() { NS_ASSERT_OWNINGTHREAD(MemoryTextureReadLock); return mReadCount; } -ShmemTextureReadLock::ShmemTextureReadLock(ClientIPCAllocator* aAllocator) - : mAllocator(aAllocator) +ShmemTextureReadLock::ShmemTextureReadLock(LayersIPCChannel* aAllocator) + : mClientAllocator(aAllocator) , mAllocSuccess(false) { MOZ_COUNT_CTOR(ShmemTextureReadLock); - MOZ_ASSERT(mAllocator); - MOZ_ASSERT(mAllocator->AsTextureForwarder()); + MOZ_ASSERT(mClientAllocator); #define MOZ_ALIGN_WORD(x) (((x) + 3) & ~3) - if (mAllocator->AsTextureForwarder()->GetTileLockAllocator()->AllocShmemSection( + if (mClientAllocator->GetTileLockAllocator()->AllocShmemSection( MOZ_ALIGN_WORD(sizeof(ShmReadLockInfo)), &mShmemSection)) { ShmReadLockInfo* info = GetShmReadLockInfoPtr(); info->readCount = 1; mAllocSuccess = true; } } ShmemTextureReadLock::~ShmemTextureReadLock() { - auto fwd = mAllocator->AsTextureForwarder(); - if (fwd) { + if (mClientAllocator) { // Release one read count that is added in constructor. // The count is kept for calling GetReadCount() by TextureClientPool. ReadUnlock(); } MOZ_COUNT_DTOR(ShmemTextureReadLock); } bool @@ -1652,19 +1640,18 @@ int32_t ShmemTextureReadLock::ReadUnlock() { if (!mAllocSuccess) { return 0; } ShmReadLockInfo* info = GetShmReadLockInfoPtr(); int32_t readCount = PR_ATOMIC_DECREMENT(&info->readCount); MOZ_ASSERT(readCount >= 0); if (readCount <= 0) { - auto fwd = mAllocator->AsTextureForwarder(); - if (fwd) { - fwd->GetTileLockAllocator()->DeallocShmemSection(mShmemSection); + if (mClientAllocator) { + mClientAllocator->GetTileLockAllocator()->DeallocShmemSection(mShmemSection); } else { // we are on the compositor process FixedSizeSmallShmemSectionAllocator::FreeShmemSection(mShmemSection); } } return readCount; } @@ -1733,17 +1720,17 @@ SyncObject::CreateSyncObject(SyncHandle return MakeAndAddRef<SyncObjectD3D11>(aHandle); #else MOZ_ASSERT_UNREACHABLE(); return nullptr; #endif } already_AddRefed<TextureClient> -TextureClient::CreateWithData(TextureData* aData, TextureFlags aFlags, ClientIPCAllocator* aAllocator) +TextureClient::CreateWithData(TextureData* aData, TextureFlags aFlags, LayersIPCChannel* aAllocator) { if (!aData) { return nullptr; } return MakeAndAddRef<TextureClient>(aData, aFlags, aAllocator); } bool
--- a/gfx/layers/client/TextureClient.h +++ b/gfx/layers/client/TextureClient.h @@ -45,18 +45,19 @@ namespace gl { class SharedSurface_Gralloc; } namespace layers { class AsyncTransactionWaiter; class BufferTextureData; class CompositableForwarder; +class KnowsCompositor; class GrallocTextureData; -class ClientIPCAllocator; +class LayersIPCChannel; class CompositableClient; struct PlanarYCbCrData; class Image; class PTextureChild; class TextureChild; class TextureData; struct RawTextureBuffer; class RawYCbCrTextureBuffer; @@ -208,17 +209,17 @@ public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(TextureReadLock) virtual int32_t ReadLock() = 0; virtual int32_t ReadUnlock() = 0; virtual int32_t GetReadCount() = 0; virtual bool IsValid() const = 0; static already_AddRefed<TextureReadLock> - Create(ClientIPCAllocator* aAllocator); + Create(LayersIPCChannel* aAllocator); static already_AddRefed<TextureReadLock> Deserialize(const ReadLockDescriptor& aDescriptor, ISurfaceAllocator* aAllocator); virtual bool Serialize(ReadLockDescriptor& aOutput) = 0; enum LockType { TYPE_MEMORY, @@ -264,25 +265,26 @@ public: virtual void Unlock() = 0; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() { return nullptr; } virtual bool BorrowMappedData(MappedTextureData&) { return false; } virtual bool BorrowMappedYCbCrData(MappedYCbCrTextureData&) { return false; } - virtual void Deallocate(ClientIPCAllocator* aAllocator) = 0; + virtual void Deallocate(LayersIPCChannel* aAllocator) = 0; /// Depending on the texture's flags either Deallocate or Forget is called. - virtual void Forget(ClientIPCAllocator* aAllocator) {} + virtual void Forget(LayersIPCChannel* aAllocator) {} virtual bool Serialize(SurfaceDescriptor& aDescriptor) = 0; virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const { return nullptr; } virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) { return false; }; virtual bool ReadBack(TextureReadbackSink* aReadbackSink) { return false; } /// Ideally this should not be exposed and users of TextureClient would use Lock/Unlock @@ -326,89 +328,69 @@ public: * responsibility of the compositable (which would use two Texture pairs). * In order to send several different buffers to the compositor side, use * several TextureClients. */ class TextureClient : public AtomicRefCountedWithFinalize<TextureClient> { public: - explicit TextureClient(TextureData* aData, TextureFlags aFlags, ClientIPCAllocator* aAllocator); + explicit TextureClient(TextureData* aData, TextureFlags aFlags, LayersIPCChannel* aAllocator); virtual ~TextureClient(); static already_AddRefed<TextureClient> - CreateWithData(TextureData* aData, TextureFlags aFlags, ClientIPCAllocator* aAllocator); + CreateWithData(TextureData* aData, TextureFlags aFlags, LayersIPCChannel* aAllocator); // Creates and allocates a TextureClient usable with Moz2D. static already_AddRefed<TextureClient> - CreateForDrawing(TextureForwarder* aAllocator, - gfx::SurfaceFormat aFormat, - gfx::IntSize aSize, - LayersBackend aLayersBackend, - BackendSelector aSelector, - TextureFlags aTextureFlags, - TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT); - - // TODO: remove this one and use the one above instead. - static already_AddRefed<TextureClient> - CreateForDrawing(CompositableForwarder* aAllocator, + CreateForDrawing(KnowsCompositor* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags flags = ALLOC_DEFAULT); static already_AddRefed<TextureClient> - CreateFromSurface(TextureForwarder* aAllocator, + CreateFromSurface(KnowsCompositor* aAllocator, gfx::SourceSurface* aSurface, - LayersBackend aLayersBackend, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags); // Creates and allocates a TextureClient supporting the YCbCr format. static already_AddRefed<TextureClient> - CreateForYCbCr(ClientIPCAllocator* aAllocator, + CreateForYCbCr(KnowsCompositor* aAllocator, gfx::IntSize aYSize, gfx::IntSize aCbCrSize, StereoMode aStereoMode, TextureFlags aTextureFlags); // Creates and allocates a TextureClient (can be accessed through raw // pointers). static already_AddRefed<TextureClient> - CreateForRawBufferAccess(ClientIPCAllocator* aAllocator, - gfx::SurfaceFormat aFormat, - gfx::IntSize aSize, - gfx::BackendType aMoz2dBackend, - LayersBackend aLayersBackend, - TextureFlags aTextureFlags, - TextureAllocationFlags flags = ALLOC_DEFAULT); - - // TODO: remove this one and use the one above instead. - static already_AddRefed<TextureClient> - CreateForRawBufferAccess(ClientIPCAllocator* aAllocator, + CreateForRawBufferAccess(KnowsCompositor* aAllocator, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, gfx::BackendType aMoz2dBackend, TextureFlags aTextureFlags, TextureAllocationFlags flags = ALLOC_DEFAULT); // Creates and allocates a TextureClient (can beaccessed through raw // pointers) with a certain buffer size. It's unfortunate that we need this. // providing format and sizes could let us do more optimization. static already_AddRefed<TextureClient> - CreateForYCbCrWithBufferSize(ClientIPCAllocator* aAllocator, + CreateForYCbCrWithBufferSize(KnowsCompositor* aAllocator, size_t aSize, TextureFlags aTextureFlags); // Creates and allocates a TextureClient of the same type. already_AddRefed<TextureClient> - CreateSimilar(TextureFlags aFlags = TextureFlags::DEFAULT, + CreateSimilar(LayersBackend aLayersBackend = LayersBackend::LAYERS_NONE, + TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const; /** * Locks the shared data, allowing the caller to get access to it. * * Please always lock/unlock when accessing the shared data. * If Lock() returns false, you should not attempt to access the shared data. */ @@ -575,17 +557,17 @@ public: /** * Create and init the TextureChild/Parent IPDL actor pair * with a TextureForwarder. * * Should be called only once per TextureClient. * The TextureClient must not be locked when calling this method. */ - bool InitIPDLActor(TextureForwarder* aForwarder); + bool InitIPDLActor(KnowsCompositor* aForwarder); /** * Return a pointer to the IPDLActor. * * This is to be used with IPDL messages only. Do not store the returned * pointer. */ PTextureChild* GetIPDLActor(); @@ -645,17 +627,17 @@ public: * texture unlock. */ virtual void SetReadbackSink(TextureReadbackSink* aReadbackSink) { mReadbackSink = aReadbackSink; } void SyncWithObject(SyncObject* aFence) { mData->SyncWithObject(aFence); } - ClientIPCAllocator* GetAllocator() { return mAllocator; } + LayersIPCChannel* GetAllocator() { return mAllocator; } ITextureClientRecycleAllocator* GetRecycleAllocator() { return mRecycleAllocator; } void SetRecycleAllocator(ITextureClientRecycleAllocator* aAllocator); /// If you add new code that uses this method, you are probably doing something wrong. TextureData* GetInternalData() { return mData; } const TextureData* GetInternalData() const { return mData; } @@ -702,16 +684,40 @@ public: TextureReadLock* GetReadLock() { return mReadLock; } bool IsReadLocked() const; void SerializeReadLock(ReadLockDescriptor& aDescriptor); private: static void TextureClientRecycleCallback(TextureClient* aClient, void* aClosure); + + // Internal helpers for creating texture clients using the actual forwarder instead + // of KnowsCompositor. TextureClientPool uses these to let it cache texture clients + // per-process instead of per ShadowLayerForwarder, but everyone else should + // use the public functions instead. + friend class TextureClientPool; + static already_AddRefed<TextureClient> + CreateForDrawing(TextureForwarder* aAllocator, + gfx::SurfaceFormat aFormat, + gfx::IntSize aSize, + LayersBackend aLayersBackend, + int32_t aMaxTextureSize, + BackendSelector aSelector, + TextureFlags aTextureFlags, + TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT); + + static already_AddRefed<TextureClient> + CreateForRawBufferAccess(LayersIPCChannel* aAllocator, + gfx::SurfaceFormat aFormat, + gfx::IntSize aSize, + gfx::BackendType aMoz2dBackend, + LayersBackend aLayersBackend, + TextureFlags aTextureFlags, + TextureAllocationFlags flags = ALLOC_DEFAULT); /** * Called once, during the destruction of the Texture, on the thread in which * texture's reference count reaches 0 (could be any thread). * * Here goes the shut-down code that uses virtual methods. * Must only be called by Release(). */ @@ -730,17 +736,17 @@ protected: */ bool ToSurfaceDescriptor(SurfaceDescriptor& aDescriptor); void LockActor() const; void UnlockActor() const; TextureData::Info mInfo; - RefPtr<ClientIPCAllocator> mAllocator; + RefPtr<LayersIPCChannel> mAllocator; RefPtr<TextureChild> mActor; RefPtr<ITextureClientRecycleAllocator> mRecycleAllocator; RefPtr<TextureReadLock> mReadLock; TextureData* mData; RefPtr<gfx::DrawTarget> mBorrowedDrawTarget; TextureFlags mFlags;
--- a/gfx/layers/client/TextureClientPool.cpp +++ b/gfx/layers/client/TextureClientPool.cpp @@ -33,25 +33,27 @@ ShrinkCallback(nsITimer *aTimer, void *a // at an inopportune time (e.g. mid-animation). static void ClearCallback(nsITimer *aTimer, void *aClosure) { static_cast<TextureClientPool*>(aClosure)->Clear(); } TextureClientPool::TextureClientPool(LayersBackend aLayersBackend, + int32_t aMaxTextureSize, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, TextureFlags aFlags, uint32_t aShrinkTimeoutMsec, uint32_t aClearTimeoutMsec, uint32_t aInitialPoolSize, uint32_t aPoolUnusedSize, TextureForwarder* aAllocator) : mBackend(aLayersBackend) + , mMaxTextureSize(aMaxTextureSize) , mFormat(aFormat) , mSize(aSize) , mFlags(aFlags) , mShrinkTimeoutMsec(aShrinkTimeoutMsec) , mClearTimeoutMsec(aClearTimeoutMsec) , mInitialPoolSize(aInitialPoolSize) , mPoolUnusedSize(aPoolUnusedSize) , mOutstandingClients(0) @@ -155,16 +157,17 @@ TextureClientPool::AllocateTextureClient gfx::BackendType::NONE, mBackend, mFlags, ALLOC_DEFAULT); } else { newClient = TextureClient::CreateForDrawing(mSurfaceAllocator, mFormat, mSize, mBackend, + mMaxTextureSize, BackendSelector::Content, mFlags); } if (newClient) { mTextureClients.push(newClient); } }
--- a/gfx/layers/client/TextureClientPool.h +++ b/gfx/layers/client/TextureClientPool.h @@ -40,16 +40,17 @@ public: }; class TextureClientPool final : public TextureClientAllocator { ~TextureClientPool(); public: TextureClientPool(LayersBackend aBackend, + int32_t aMaxTextureSize, gfx::SurfaceFormat aFormat, gfx::IntSize aSize, TextureFlags aFlags, uint32_t aShrinkTimeoutMsec, uint32_t aClearTimeoutMsec, uint32_t aInitialPoolSize, uint32_t aPoolUnusedSize, TextureForwarder* aAllocator); @@ -97,16 +98,17 @@ public: /** * Calling this will cause the pool to attempt to relinquish any unused * clients. */ void Clear(); LayersBackend GetBackend() const { return mBackend; } + int32_t GetMaxTextureSize() const { return mMaxTextureSize; } gfx::SurfaceFormat GetFormat() { return mFormat; } TextureFlags GetFlags() const { return mFlags; } /** * Clear the pool and put it in a state where it won't recycle any new texture. */ void Destroy(); @@ -117,16 +119,19 @@ private: void AllocateTextureClient(); /// Reset and/or initialise timers for shrinking/clearing the pool. void ResetTimers(); /// Backend passed to the TextureClient for buffer creation. LayersBackend mBackend; + // Max texture size passed to the TextureClient for buffer creation. + int32_t mMaxTextureSize; + /// Format is passed to the TextureClient for buffer creation. gfx::SurfaceFormat mFormat; /// The width and height of the tiles to be used. gfx::IntSize mSize; /// Flags passed to the TextureClient for buffer creation. const TextureFlags mFlags;
--- a/gfx/layers/client/TextureClientRecycleAllocator.cpp +++ b/gfx/layers/client/TextureClientRecycleAllocator.cpp @@ -67,17 +67,17 @@ public: { if (aTextureClient->GetFormat() != mFormat || aTextureClient->GetSize() != mSize) { return false; } return true; } - already_AddRefed<TextureClient> Allocate(TextureForwarder* aAllocator) override + already_AddRefed<TextureClient> Allocate(KnowsCompositor* aAllocator) override { return mAllocator->Allocate(mFormat, mSize, mSelector, mTextureFlags, mAllocationFlags); } @@ -109,25 +109,25 @@ YCbCrTextureClientAllocationHelper::IsCo bufferData->GetStereoMode().isNothing() || bufferData->GetStereoMode().ref() != mData.mStereoMode) { return false; } return true; } already_AddRefed<TextureClient> -YCbCrTextureClientAllocationHelper::Allocate(TextureForwarder* aAllocator) +YCbCrTextureClientAllocationHelper::Allocate(KnowsCompositor* aAllocator) { return TextureClient::CreateForYCbCr(aAllocator, mData.mYSize, mData.mCbCrSize, mData.mStereoMode, mTextureFlags); } -TextureClientRecycleAllocator::TextureClientRecycleAllocator(TextureForwarder* aAllocator) +TextureClientRecycleAllocator::TextureClientRecycleAllocator(KnowsCompositor* aAllocator) : mSurfaceAllocator(aAllocator) , mMaxPooledSize(kMaxPooledSized) , mLock("TextureClientRecycleAllocatorImp.mLock") , mIsDestroyed(false) { } TextureClientRecycleAllocator::~TextureClientRecycleAllocator() @@ -184,17 +184,17 @@ TextureClientRecycleAllocator::CreateOrR textureHolder = mPooledClients.top(); mPooledClients.pop(); // If a pooled TextureClient is not compatible, release it. if (!aHelper.IsCompatible(textureHolder->GetTextureClient())) { // Release TextureClient. RefPtr<Runnable> task = new TextureClientReleaseTask(textureHolder->GetTextureClient()); textureHolder->ClearTextureClient(); textureHolder = nullptr; - mSurfaceAllocator->GetMessageLoop()->PostTask(task.forget()); + mSurfaceAllocator->GetTextureForwarder()->GetMessageLoop()->PostTask(task.forget()); } else { textureHolder->GetTextureClient()->RecycleTexture(aHelper.mTextureFlags); } } } if (!textureHolder) { // Allocate new TextureClient @@ -222,17 +222,16 @@ TextureClientRecycleAllocator::CreateOrR already_AddRefed<TextureClient> TextureClientRecycleAllocator::Allocate(gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags) { return TextureClient::CreateForDrawing(mSurfaceAllocator, aFormat, aSize, - mSurfaceAllocator->GetCompositorBackendType(), aSelector, aTextureFlags, aAllocFlags); } void TextureClientRecycleAllocator::ShrinkToMinimumSize() { MutexAutoLock lock(mLock); while (!mPooledClients.empty()) {
--- a/gfx/layers/client/TextureClientRecycleAllocator.h +++ b/gfx/layers/client/TextureClientRecycleAllocator.h @@ -43,17 +43,17 @@ public: TextureAllocationFlags aAllocationFlags) : mFormat(aFormat) , mSize(aSize) , mSelector(aSelector) , mTextureFlags(aTextureFlags | TextureFlags::RECYCLE) // Set recycle flag , mAllocationFlags(aAllocationFlags) {} - virtual already_AddRefed<TextureClient> Allocate(TextureForwarder* aAllocator) = 0; + virtual already_AddRefed<TextureClient> Allocate(KnowsCompositor* aAllocator) = 0; virtual bool IsCompatible(TextureClient* aTextureClient) = 0; const gfx::SurfaceFormat mFormat; const gfx::IntSize mSize; const BackendSelector mSelector; const TextureFlags mTextureFlags; const TextureAllocationFlags mAllocationFlags; }; @@ -61,17 +61,17 @@ public: class YCbCrTextureClientAllocationHelper : public ITextureClientAllocationHelper { public: YCbCrTextureClientAllocationHelper(const PlanarYCbCrData& aData, TextureFlags aTextureFlags); bool IsCompatible(TextureClient* aTextureClient) override; - already_AddRefed<TextureClient> Allocate(TextureForwarder* aAllocator) override; + already_AddRefed<TextureClient> Allocate(KnowsCompositor* aAllocator) override; protected: const PlanarYCbCrData& mData; }; /** * TextureClientRecycleAllocator provides TextureClients allocation and @@ -83,17 +83,17 @@ protected: * clients. */ class TextureClientRecycleAllocator : public ITextureClientRecycleAllocator { protected: virtual ~TextureClientRecycleAllocator(); public: - explicit TextureClientRecycleAllocator(TextureForwarder* aAllocator); + explicit TextureClientRecycleAllocator(KnowsCompositor* aAllocator); void SetMaxPoolSize(uint32_t aMax); // Creates and allocates a TextureClient. already_AddRefed<TextureClient> CreateOrRecycle(gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, @@ -110,17 +110,17 @@ public: protected: virtual already_AddRefed<TextureClient> Allocate(gfx::SurfaceFormat aFormat, gfx::IntSize aSize, BackendSelector aSelector, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags); - RefPtr<TextureForwarder> mSurfaceAllocator; + RefPtr<KnowsCompositor> mSurfaceAllocator; friend class DefaultTextureClientAllocationHelper; void RecycleTextureClient(TextureClient* aClient) override; static const uint32_t kMaxPooledSized = 2; uint32_t mMaxPooledSize; std::map<TextureClient*, RefPtr<TextureClientHolder> > mInUseClients;
--- a/gfx/layers/client/TextureClientSharedSurface.cpp +++ b/gfx/layers/client/TextureClientSharedSurface.cpp @@ -27,17 +27,17 @@ namespace layers { SharedSurfaceTextureData::SharedSurfaceTextureData(UniquePtr<gl::SharedSurface> surf) : mSurf(Move(surf)) {} SharedSurfaceTextureData::~SharedSurfaceTextureData() {} void -SharedSurfaceTextureData::Deallocate(ClientIPCAllocator*) +SharedSurfaceTextureData::Deallocate(LayersIPCChannel*) {} void SharedSurfaceTextureData::FillInfo(TextureData::Info& aInfo) const { aInfo.size = mSurf->mSize; aInfo.format = gfx::SurfaceFormat::UNKNOWN; aInfo.hasIntermediateBuffer = false; @@ -50,25 +50,25 @@ bool SharedSurfaceTextureData::Serialize(SurfaceDescriptor& aOutDescriptor) { return mSurf->ToSurfaceDescriptor(&aOutDescriptor); } SharedSurfaceTextureClient::SharedSurfaceTextureClient(SharedSurfaceTextureData* aData, TextureFlags aFlags, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) : TextureClient(aData, aFlags, aAllocator) { mWorkaroundAnnoyingSharedSurfaceLifetimeIssues = true; } already_AddRefed<SharedSurfaceTextureClient> SharedSurfaceTextureClient::Create(UniquePtr<gl::SharedSurface> surf, gl::SurfaceFactory* factory, - ClientIPCAllocator* aAllocator, TextureFlags aFlags) + LayersIPCChannel* aAllocator, TextureFlags aFlags) { if (!surf) { return nullptr; } TextureFlags flags = aFlags | TextureFlags::RECYCLE | surf->GetTextureFlags(); SharedSurfaceTextureData* data = new SharedSurfaceTextureData(Move(surf)); return MakeAndAddRef<SharedSurfaceTextureClient>(data, flags, aAllocator); }
--- a/gfx/layers/client/TextureClientSharedSurface.h +++ b/gfx/layers/client/TextureClientSharedSurface.h @@ -43,33 +43,33 @@ public: virtual bool Lock(OpenMode, FenceHandle*) override { return false; } virtual void Unlock() override {} virtual void FillInfo(TextureData::Info& aInfo) const override; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - virtual void Deallocate(ClientIPCAllocator*) override; + virtual void Deallocate(LayersIPCChannel*) override; gl::SharedSurface* Surf() const { return mSurf.get(); } }; class SharedSurfaceTextureClient : public TextureClient { public: SharedSurfaceTextureClient(SharedSurfaceTextureData* aData, TextureFlags aFlags, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); ~SharedSurfaceTextureClient(); static already_AddRefed<SharedSurfaceTextureClient> Create(UniquePtr<gl::SharedSurface> surf, gl::SurfaceFactory* factory, - ClientIPCAllocator* aAllocator, TextureFlags aFlags); + LayersIPCChannel* aAllocator, TextureFlags aFlags); virtual void SetReleaseFenceHandle(const FenceHandle& aReleaseFenceHandle) override; virtual FenceHandle GetAndResetReleaseFenceHandle() override; virtual void SetAcquireFenceHandle(const FenceHandle& aAcquireFenceHandle) override; virtual const FenceHandle& GetAcquireFenceHandle() const override;
--- a/gfx/layers/client/TiledContentClient.cpp +++ b/gfx/layers/client/TiledContentClient.cpp @@ -1052,17 +1052,17 @@ ClientMultiTiledLayerBuffer::ValidateTil } #endif SurfaceMode mode; gfxContentType content = GetContentType(&mode); if (!aTile.mAllocator) { aTile.SetTextureAllocator(mManager->GetCompositorBridgeChild()->GetTexturePool( - mManager->GetCompositorBackendType(), + mManager->AsShadowForwarder(), gfxPlatform::GetPlatform()->Optimal2DFormatForContent(content), TextureFlags::DISALLOW_BIGIMAGE | TextureFlags::IMMEDIATE_UPLOAD)); MOZ_ASSERT(aTile.mAllocator); } nsIntRegion offsetScaledDirtyRegion = aDirtyRegion.MovedBy(-aTileOrigin); offsetScaledDirtyRegion.ScaleRoundOut(mResolution, mResolution);
--- a/gfx/layers/d3d11/TextureD3D11.cpp +++ b/gfx/layers/d3d11/TextureD3D11.cpp @@ -452,52 +452,52 @@ D3D11TextureData::Create(SourceSurface* return nullptr; } return D3D11TextureData::Create(aSurface->GetSize(), aSurface->GetFormat(), aSurface, aFlags, aDevice); } void -D3D11TextureData::Deallocate(ClientIPCAllocator* aAllocator) +D3D11TextureData::Deallocate(LayersIPCChannel* aAllocator) { mDrawTarget = nullptr; mTexture = nullptr; } already_AddRefed<TextureClient> CreateD3D11TextureClientWithDevice(IntSize aSize, SurfaceFormat aFormat, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags, ID3D11Device* aDevice, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { TextureData* data = D3D11TextureData::Create(aSize, aFormat, aAllocFlags, aDevice); if (!data) { return nullptr; } return MakeAndAddRef<TextureClient>(data, aTextureFlags, aAllocator); } TextureData* -D3D11TextureData::CreateSimilar(ClientIPCAllocator* aAllocator, +D3D11TextureData::CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { return D3D11TextureData::Create(mSize, mFormat, aAllocFlags); } void D3D11TextureData::GetDXGIResource(IDXGIResource** aOutResource) { mTexture->QueryInterface(aOutResource); } DXGIYCbCrTextureData* -DXGIYCbCrTextureData::Create(ClientIPCAllocator* aAllocator, - TextureFlags aFlags, +DXGIYCbCrTextureData::Create(TextureFlags aFlags, IUnknown* aTextureY, IUnknown* aTextureCb, IUnknown* aTextureCr, HANDLE aHandleY, HANDLE aHandleCb, HANDLE aHandleCr, const gfx::IntSize& aSize, const gfx::IntSize& aSizeY, @@ -518,18 +518,17 @@ DXGIYCbCrTextureData::Create(ClientIPCAl texture->mSize = aSize; texture->mSizeY = aSizeY; texture->mSizeCbCr = aSizeCbCr; return texture; } DXGIYCbCrTextureData* -DXGIYCbCrTextureData::Create(ClientIPCAllocator* aAllocator, - TextureFlags aFlags, +DXGIYCbCrTextureData::Create(TextureFlags aFlags, ID3D11Texture2D* aTextureY, ID3D11Texture2D* aTextureCb, ID3D11Texture2D* aTextureCr, const gfx::IntSize& aSize, const gfx::IntSize& aSizeY, const gfx::IntSize& aSizeCbCr) { if (!aTextureY || !aTextureCb || !aTextureCr) { @@ -563,17 +562,17 @@ DXGIYCbCrTextureData::Create(ClientIPCAl aTextureCr->QueryInterface((IDXGIResource**)getter_AddRefs(resource)); HANDLE handleCr; hr = resource->GetSharedHandle(&handleCr); if (FAILED(hr)) { return nullptr; } - return DXGIYCbCrTextureData::Create(aAllocator, aFlags, + return DXGIYCbCrTextureData::Create(aFlags, aTextureY, aTextureCb, aTextureCr, handleY, handleCb, handleCr, aSize, aSizeY, aSizeCbCr); } void DXGIYCbCrTextureData::FillInfo(TextureData::Info& aInfo) const { @@ -590,17 +589,17 @@ DXGIYCbCrTextureData::Serialize(SurfaceD aOutDescriptor = SurfaceDescriptorDXGIYCbCr( (WindowsHandle)mHandles[0], (WindowsHandle)mHandles[1], (WindowsHandle)mHandles[2], mSize, mSizeY, mSizeCbCr ); return true; } void -DXGIYCbCrTextureData::Deallocate(ClientIPCAllocator*) +DXGIYCbCrTextureData::Deallocate(LayersIPCChannel*) { mHoldRefs[0] = nullptr; mHoldRefs[1] = nullptr; mHoldRefs[2] = nullptr; } already_AddRefed<TextureHost> CreateTextureHostD3D11(const SurfaceDescriptor& aDesc,
--- a/gfx/layers/d3d11/TextureD3D11.h +++ b/gfx/layers/d3d11/TextureD3D11.h @@ -67,26 +67,27 @@ public: virtual bool Lock(OpenMode aMode, FenceHandle*) override; virtual void Unlock() override; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override; virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const override; // TODO - merge this with the FenceHandle API! virtual void SyncWithObject(SyncObject* aSync) override; ID3D11Texture2D* GetD3D11Texture() { return mTexture; } - virtual void Deallocate(ClientIPCAllocator* aAllocator) override; + virtual void Deallocate(LayersIPCChannel* aAllocator) override; D3D11TextureData* AsD3D11TextureData() override { return this; } ~D3D11TextureData(); protected: D3D11TextureData(ID3D11Texture2D* aTexture, @@ -104,37 +105,35 @@ protected: RefPtr<ID3D11Texture2D> mTexture; }; already_AddRefed<TextureClient> CreateD3D11extureClientWithDevice(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags, ID3D11Device* aDevice, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); class DXGIYCbCrTextureData : public TextureData { public: static DXGIYCbCrTextureData* - Create(ClientIPCAllocator* aAllocator, - TextureFlags aFlags, + Create(TextureFlags aFlags, IUnknown* aTextureY, IUnknown* aTextureCb, IUnknown* aTextureCr, HANDLE aHandleY, HANDLE aHandleCb, HANDLE aHandleCr, const gfx::IntSize& aSize, const gfx::IntSize& aSizeY, const gfx::IntSize& aSizeCbCr); static DXGIYCbCrTextureData* - Create(ClientIPCAllocator* aAllocator, - TextureFlags aFlags, + Create(TextureFlags aFlags, ID3D11Texture2D* aTextureCb, ID3D11Texture2D* aTextureY, ID3D11Texture2D* aTextureCr, const gfx::IntSize& aSize, const gfx::IntSize& aSizeY, const gfx::IntSize& aSizeCbCr); virtual bool Lock(OpenMode, FenceHandle*) override { return true; } @@ -142,23 +141,17 @@ public: virtual void Unlock() override {} virtual void FillInfo(TextureData::Info& aInfo) const override; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override { return nullptr; } - // This TextureData should not be used in a context where we use CreateSimilar - // (ex. component alpha) because the underlying texture is always created by - // an external producer. - virtual DXGIYCbCrTextureData* - CreateSimilar(ClientIPCAllocator*, TextureFlags, TextureAllocationFlags) const override { return nullptr; } - - virtual void Deallocate(ClientIPCAllocator* aAllocator) override; + virtual void Deallocate(LayersIPCChannel* aAllocator) override; virtual bool UpdateFromSurface(gfx::SourceSurface*) override { return false; } virtual TextureFlags GetTextureFlags() const override { return TextureFlags::DEALLOCATE_MAIN_THREAD; } @@ -268,17 +261,17 @@ protected: bool mIterating; }; already_AddRefed<TextureClient> CreateD3D11TextureClientWithDevice(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, TextureFlags aTextureFlags, TextureAllocationFlags aAllocFlags, ID3D11Device* aDevice, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); /** * A TextureHost for shared D3D11 textures. */ class DXGITextureHostD3D11 : public TextureHost { public:
--- a/gfx/layers/d3d9/TextureD3D9.cpp +++ b/gfx/layers/d3d9/TextureD3D9.cpp @@ -588,17 +588,17 @@ D3D9TextureData::Create(gfx::IntSize aSi data->mNeedsClear = aAllocFlags & ALLOC_CLEAR_BUFFER; data->mNeedsClearWhite = aAllocFlags & ALLOC_CLEAR_BUFFER_WHITE; return data; } TextureData* -D3D9TextureData::CreateSimilar(ClientIPCAllocator*, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const +D3D9TextureData::CreateSimilar(LayersIPCChannel*, LayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { return D3D9TextureData::Create(mSize, mFormat, aAllocFlags); } void D3D9TextureData::FillInfo(TextureData::Info& aInfo) const { aInfo.size = mSize;
--- a/gfx/layers/d3d9/TextureD3D9.h +++ b/gfx/layers/d3d9/TextureD3D9.h @@ -184,24 +184,25 @@ public: virtual void FillInfo(TextureData::Info& aInfo) const override; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override; virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) override; virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, + LayersBackend aLayersBackend, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const override; static D3D9TextureData* Create(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, TextureAllocationFlags aFlags); - virtual void Deallocate(ClientIPCAllocator* aAllocator) override {} + virtual void Deallocate(LayersIPCChannel* aAllocator) override {} protected: D3D9TextureData(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, IDirect3DTexture9* aTexture); RefPtr<IDirect3DTexture9> mTexture; RefPtr<IDirect3DSurface9> mD3D9Surface; gfx::IntSize mSize; @@ -227,17 +228,17 @@ public: virtual void FillInfo(TextureData::Info& aInfo) const override; virtual bool Lock(OpenMode, FenceHandle*) override { return true; } virtual void Unlock() override {} virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - virtual void Deallocate(ClientIPCAllocator* aAllocator) override {} + virtual void Deallocate(LayersIPCChannel* aAllocator) override {} IDirect3DDevice9* GetD3D9Device() { return mDevice; } IDirect3DTexture9* GetD3D9Texture() { return mTexture; } HANDLE GetShareHandle() const { return mHandle; } already_AddRefed<IDirect3DSurface9> GetD3D9Surface() const; const D3DSURFACE_DESC& GetDesc() const {
--- a/gfx/layers/ipc/CompositableForwarder.h +++ b/gfx/layers/ipc/CompositableForwarder.h @@ -14,80 +14,47 @@ #include "mozilla/layers/CompositableClient.h" // for CompositableClient #include "mozilla/layers/CompositorTypes.h" #include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator #include "mozilla/layers/LayersTypes.h" // for LayersBackend #include "mozilla/layers/TextureClient.h" // for TextureClient #include "mozilla/layers/TextureForwarder.h" // for TextureForwarder #include "nsRegion.h" // for nsIntRegion #include "mozilla/gfx/Rect.h" -#include "nsExpirationTracker.h" #include "nsHashKeys.h" #include "nsTHashtable.h" namespace mozilla { namespace layers { class CompositableClient; class AsyncTransactionTracker; class ImageContainer; class SurfaceDescriptor; class SurfaceDescriptorTiles; class ThebesBufferData; class PTextureChild; /** - * See ActiveResourceTracker below. - */ -class ActiveResource -{ -public: - virtual void NotifyInactive() = 0; - nsExpirationState* GetExpirationState() { return &mExpirationState; } - bool IsActivityTracked() { return mExpirationState.IsTracked(); } -private: - nsExpirationState mExpirationState; -}; - -/** - * A convenience class on top of nsExpirationTracker - */ -class ActiveResourceTracker : public nsExpirationTracker<ActiveResource, 3> -{ -public: - ActiveResourceTracker(uint32_t aExpirationCycle, const char* aName) - : nsExpirationTracker(aExpirationCycle, aName) - {} - - virtual void NotifyExpired(ActiveResource* aResource) override - { - RemoveObject(aResource); - aResource->NotifyInactive(); - } -}; - -/** * A transaction is a set of changes that happenned on the content side, that * should be sent to the compositor side. * CompositableForwarder is an interface to manage a transaction of * compositable objetcs. * * ShadowLayerForwarder is an example of a CompositableForwarder (that can * additionally forward modifications of the Layer tree). * ImageBridgeChild is another CompositableForwarder. + * + * CompositableForwarder implements KnowsCompositor for simplicity as all + * implementations of CompositableForwarder currently also implement KnowsCompositor. + * This dependency could be split if we add new use cases. */ -class CompositableForwarder : public TextureForwarder +class CompositableForwarder : public KnowsCompositor { public: - - CompositableForwarder() - { - mActiveResourceTracker = MakeUnique<ActiveResourceTracker>(1000, "CompositableForwarder"); - } - /** * Setup the IPDL actor for aCompositable to be part of layers * transactions. */ virtual void Connect(CompositableClient* aCompositable, ImageContainer* aImageContainer = nullptr) = 0; /** @@ -158,30 +125,23 @@ public: const nsTArray<TimedTextureClient>& aTextures) = 0; virtual void UseComponentAlphaTextures(CompositableClient* aCompositable, TextureClient* aClientOnBlack, TextureClient* aClientOnWhite) = 0; virtual void UpdateFwdTransactionId() = 0; virtual uint64_t GetFwdTransactionId() = 0; - virtual CompositableForwarder* AsCompositableForwarder() override { return this; } - virtual bool InForwarderThread() = 0; void AssertInForwarderThread() { MOZ_ASSERT(InForwarderThread()); } - - ActiveResourceTracker& GetActiveResourceTracker() { return *mActiveResourceTracker.get(); } - protected: nsTArray<RefPtr<TextureClient> > mTexturesToRemove; nsTArray<RefPtr<CompositableClient>> mCompositableClientsToRemove; - - UniquePtr<ActiveResourceTracker> mActiveResourceTracker; }; } // namespace layers } // namespace mozilla #endif
--- a/gfx/layers/ipc/CompositorBridgeChild.cpp +++ b/gfx/layers/ipc/CompositorBridgeChild.cpp @@ -47,19 +47,36 @@ using mozilla::layers::LayerTransactionChild; using mozilla::dom::TabChildBase; using mozilla::Unused; using mozilla::gfx::GPUProcessManager; namespace mozilla { namespace layers { +static int sShmemCreationCounter = 0; + +static void ResetShmemCounter() +{ + sShmemCreationCounter = 0; +} + +static void ShmemAllocated(CompositorBridgeChild* aProtocol) +{ + sShmemCreationCounter++; + if (sShmemCreationCounter > 256) { + aProtocol->SendSyncWithCompositor(); + ResetShmemCounter(); + MOZ_PERFORMANCE_WARNING("gfx", "The number of shmem allocations is too damn high!"); + } +} + static StaticRefPtr<CompositorBridgeChild> sCompositorBridge; -Atomic<int32_t> TextureForwarder::sSerialCounter(0); +Atomic<int32_t> KnowsCompositor::sSerialCounter(0); CompositorBridgeChild::CompositorBridgeChild(ClientLayerManager *aLayerManager) : mLayerManager(aLayerManager) , mCanSend(false) , mFwdTransactionId(0) , mMessageLoop(MessageLoop::current()) , mSectionAllocator(nullptr) { @@ -938,30 +955,33 @@ CompositorBridgeChild::CancelWaitForRecy RefPtr<TextureClient> client = mTexturesWaitingRecycled.Get(aTextureId); if (!client) { return; } mTexturesWaitingRecycled.Remove(aTextureId); } TextureClientPool* -CompositorBridgeChild::GetTexturePool(LayersBackend aBackend, +CompositorBridgeChild::GetTexturePool(KnowsCompositor* aAllocator, SurfaceFormat aFormat, TextureFlags aFlags) { for (size_t i = 0; i < mTexturePools.Length(); i++) { - if (mTexturePools[i]->GetBackend() == aBackend && + if (mTexturePools[i]->GetBackend() == aAllocator->GetCompositorBackendType() && + mTexturePools[i]->GetMaxTextureSize() == aAllocator->GetMaxTextureSize() && mTexturePools[i]->GetFormat() == aFormat && mTexturePools[i]->GetFlags() == aFlags) { return mTexturePools[i]; } } mTexturePools.AppendElement( - new TextureClientPool(aBackend, aFormat, + new TextureClientPool(aAllocator->GetCompositorBackendType(), + aAllocator->GetMaxTextureSize(), + aFormat, gfx::gfxVars::TileSize(), aFlags, gfxPrefs::LayersTilePoolShrinkTimeout(), gfxPrefs::LayersTilePoolClearTimeout(), gfxPrefs::LayersTileInitialPoolSize(), gfxPrefs::LayersTilePoolUnusedSize(), this)); @@ -1008,24 +1028,26 @@ CompositorBridgeChild::CreateTexture(con return PCompositorBridgeChild::SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, 0 /* FIXME? */, aSerial); } bool CompositorBridgeChild::AllocUnsafeShmem(size_t aSize, ipc::SharedMemory::SharedMemoryType aType, ipc::Shmem* aShmem) { + ShmemAllocated(this); return PCompositorBridgeChild::AllocUnsafeShmem(aSize, aType, aShmem); } bool CompositorBridgeChild::AllocShmem(size_t aSize, ipc::SharedMemory::SharedMemoryType aType, ipc::Shmem* aShmem) { + ShmemAllocated(this); return PCompositorBridgeChild::AllocShmem(aSize, aType, aShmem); } void CompositorBridgeChild::DeallocShmem(ipc::Shmem& aShmem) { PCompositorBridgeChild::DeallocShmem(aShmem); } @@ -1102,11 +1124,17 @@ CompositorBridgeChild::DeallocPAPZCTreeM void CompositorBridgeChild::ProcessingError(Result aCode, const char* aReason) { if (aCode != MsgDropped) { gfxDevCrash(gfx::LogReason::ProcessingError) << "Processing error in CompositorBridgeChild: " << int(aCode); } } +void +CompositorBridgeChild::WillEndTransaction() +{ + ResetShmemCounter(); +} + } // namespace layers } // namespace mozilla
--- a/gfx/layers/ipc/CompositorBridgeChild.h +++ b/gfx/layers/ipc/CompositorBridgeChild.h @@ -38,22 +38,23 @@ class IAPZCTreeManager; class APZCTreeManagerChild; class ClientLayerManager; class CompositorBridgeParent; class TextureClient; class TextureClientPool; struct FrameMetrics; class CompositorBridgeChild final : public PCompositorBridgeChild, - public TextureForwarder, - public ShmemAllocator + public TextureForwarder { typedef InfallibleTArray<AsyncParentMessageData> AsyncParentMessageArray; public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CompositorBridgeChild, override); + explicit CompositorBridgeChild(ClientLayerManager *aLayerManager); void Destroy(); /** * Lookup the FrameMetrics shared by the compositor process with the * associated FrameMetrics::ViewID. The returned FrameMetrics is used * in progressive paint calculations. @@ -184,17 +185,17 @@ public: * make sure if there is no newer usage. */ void NotifyNotUsed(uint64_t aTextureId, uint64_t aFwdTransactionId); void DeliverFence(uint64_t aTextureId, FenceHandle& aReleaseFenceHandle); virtual void CancelWaitForRecycle(uint64_t aTextureId) override; - TextureClientPool* GetTexturePool(LayersBackend aBackend, + TextureClientPool* GetTexturePool(KnowsCompositor* aAllocator, gfx::SurfaceFormat aFormat, TextureFlags aFlags); void ClearTexturePool(); virtual FixedSizeSmallShmemSectionAllocator* GetTileLockAllocator() override; void HandleMemoryPressure(); @@ -216,19 +217,19 @@ public: RefPtr<IAPZCTreeManager> GetAPZCTreeManager(uint64_t aLayerTreeId); PAPZCTreeManagerChild* AllocPAPZCTreeManagerChild(const uint64_t& aLayersId) override; bool DeallocPAPZCTreeManagerChild(PAPZCTreeManagerChild* aActor) override; PAPZChild* AllocPAPZChild(const uint64_t& aLayersId) override; bool DeallocPAPZChild(PAPZChild* aActor) override; - virtual ShmemAllocator* AsShmemAllocator() override { return this; } + void ProcessingError(Result aCode, const char* aReason) override; - void ProcessingError(Result aCode, const char* aReason) override; + void WillEndTransaction(); private: // Private destructor, to discourage deletion outside of Release(): virtual ~CompositorBridgeChild(); virtual PLayerTransactionChild* AllocPLayerTransactionChild(const nsTArray<LayersBackend>& aBackendHints, const uint64_t& aId,
--- a/gfx/layers/ipc/CompositorBridgeParent.h +++ b/gfx/layers/ipc/CompositorBridgeParent.h @@ -234,16 +234,19 @@ public: // ShmemAllocator virtual bool AllocShmem(size_t aSize, mozilla::ipc::SharedMemory::SharedMemoryType aType, mozilla::ipc::Shmem* aShmem) override; virtual bool AllocUnsafeShmem(size_t aSize, mozilla::ipc::SharedMemory::SharedMemoryType aType, mozilla::ipc::Shmem* aShmem) override; virtual void DeallocShmem(mozilla::ipc::Shmem& aShmem) override; + + virtual bool RecvSyncWithCompositor() override { return true; } + }; class CompositorBridgeParent final : public CompositorBridgeParentBase { friend class CompositorVsyncScheduler; friend class CompositorThreadHolder; friend class InProcessCompositorSession; friend class gfx::GPUProcessManager;
--- a/gfx/layers/ipc/ISurfaceAllocator.cpp +++ b/gfx/layers/ipc/ISurfaceAllocator.cpp @@ -5,16 +5,17 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "ISurfaceAllocator.h" #include "gfxPrefs.h" #include "mozilla/layers/ImageBridgeParent.h" // for ImageBridgeParent #include "mozilla/layers/TextureHost.h" // for TextureHost +#include "mozilla/layers/TextureForwarder.h" namespace mozilla { namespace layers { NS_IMPL_ISUPPORTS(GfxMemoryImageReporter, nsIMemoryReporter) mozilla::Atomic<ptrdiff_t> GfxMemoryImageReporter::sAmount(0); @@ -90,28 +91,34 @@ HostIPCAllocator::SendPendingAsyncMessag // XXX - We should actually figure out the minimum shmem allocation size on // a certain platform and use that. const uint32_t sShmemPageSize = 4096; #ifdef DEBUG const uint32_t sSupportedBlockSize = 4; #endif -FixedSizeSmallShmemSectionAllocator::FixedSizeSmallShmemSectionAllocator(ClientIPCAllocator* aShmProvider) +FixedSizeSmallShmemSectionAllocator::FixedSizeSmallShmemSectionAllocator(LayersIPCChannel* aShmProvider) : mShmProvider(aShmProvider) { - MOZ_ASSERT(mShmProvider && mShmProvider->AsShmemAllocator()); + MOZ_ASSERT(mShmProvider); } FixedSizeSmallShmemSectionAllocator::~FixedSizeSmallShmemSectionAllocator() { ShrinkShmemSectionHeap(); } bool +FixedSizeSmallShmemSectionAllocator::IPCOpen() const +{ + return mShmProvider->IPCOpen(); +} + +bool FixedSizeSmallShmemSectionAllocator::AllocShmemSection(uint32_t aSize, ShmemSection* aShmemSection) { // For now we only support sizes of 4. If we want to support different sizes // some more complicated bookkeeping should be added. MOZ_ASSERT(aSize == sSupportedBlockSize); MOZ_ASSERT(aShmemSection); if (!IPCOpen()) { @@ -127,17 +134,17 @@ FixedSizeSmallShmemSectionAllocator::All aShmemSection->shmem() = mUsedShmems[i]; MOZ_ASSERT(mUsedShmems[i].IsWritable()); break; } } if (!aShmemSection->shmem().IsWritable()) { ipc::Shmem tmp; - if (!GetShmAllocator()->AllocUnsafeShmem(sShmemPageSize, OptimalShmemType(), &tmp)) { + if (!mShmProvider->AllocUnsafeShmem(sShmemPageSize, OptimalShmemType(), &tmp)) { return false; } ShmemSectionHeapHeader* header = tmp.get<ShmemSectionHeapHeader>(); header->mTotalBlocks = 0; header->mAllocatedBlocks = 0; mUsedShmems.push_back(tmp); @@ -228,17 +235,17 @@ FixedSizeSmallShmemSectionAllocator::Shr } // The loop will terminate as we either increase i, or decrease size // every time through. size_t i = 0; while (i < mUsedShmems.size()) { ShmemSectionHeapHeader* header = mUsedShmems[i].get<ShmemSectionHeapHeader>(); if (header->mAllocatedBlocks == 0) { - GetShmAllocator()->DeallocShmem(mUsedShmems[i]); + mShmProvider->DeallocShmem(mUsedShmems[i]); // We don't particularly care about order, move the last one in the array // to this position. if (i < mUsedShmems.size() - 1) { mUsedShmems[i] = mUsedShmems[mUsedShmems.size() - 1]; } mUsedShmems.pop_back(); } else { i++;
--- a/gfx/layers/ipc/ISurfaceAllocator.h +++ b/gfx/layers/ipc/ISurfaceAllocator.h @@ -35,24 +35,24 @@ class Shmem; } // namespace ipc namespace gfx { class DataSourceSurface; } // namespace gfx namespace layers { class CompositableForwarder; -class ShadowLayerForwarder; class TextureForwarder; class ShmemAllocator; class ShmemSectionAllocator; class LegacySurfaceDescriptorAllocator; class ClientIPCAllocator; class HostIPCAllocator; +class LayersIPCChannel; enum BufferCapabilities { DEFAULT_BUFFER_CAPS = 0, /** * The allocated buffer must be efficiently mappable as a DataSourceSurface. */ MAP_AS_IMAGE_SURFACE = 1 << 0, /** @@ -86,19 +86,17 @@ public: // down-casting virtual ShmemAllocator* AsShmemAllocator() { return nullptr; } virtual ShmemSectionAllocator* AsShmemSectionAllocator() { return nullptr; } virtual CompositableForwarder* AsCompositableForwarder() { return nullptr; } - virtual TextureForwarder* AsTextureForwarder() { return nullptr; } - - virtual ShadowLayerForwarder* AsLayerForwarder() { return nullptr; } + virtual TextureForwarder* GetTextureForwarder() { return nullptr; } virtual ClientIPCAllocator* AsClientAllocator() { return nullptr; } virtual HostIPCAllocator* AsHostIPCAllocator() { return nullptr; } virtual LegacySurfaceDescriptorAllocator* AsLegacySurfaceDescriptorAllocator() { return nullptr; } @@ -294,36 +292,34 @@ public: }; struct ShmemSectionHeapAllocation { Atomic<uint32_t> mStatus; uint32_t mSize; }; - explicit FixedSizeSmallShmemSectionAllocator(ClientIPCAllocator* aShmProvider); + explicit FixedSizeSmallShmemSectionAllocator(LayersIPCChannel* aShmProvider); ~FixedSizeSmallShmemSectionAllocator(); virtual bool AllocShmemSection(uint32_t aSize, ShmemSection* aShmemSection) override; virtual void DeallocShmemSection(ShmemSection& aShmemSection) override; virtual void MemoryPressure() override { ShrinkShmemSectionHeap(); } // can be called on the compositor process. static void FreeShmemSection(ShmemSection& aShmemSection); void ShrinkShmemSectionHeap(); - ShmemAllocator* GetShmAllocator() { return mShmProvider->AsShmemAllocator(); } - - bool IPCOpen() const { return mShmProvider->IPCOpen(); } + bool IPCOpen() const; protected: std::vector<mozilla::ipc::Shmem> mUsedShmems; - ClientIPCAllocator* mShmProvider; + LayersIPCChannel* mShmProvider; }; } // namespace layers } // namespace mozilla #endif
--- a/gfx/layers/ipc/ImageBridgeChild.cpp +++ b/gfx/layers/ipc/ImageBridgeChild.cpp @@ -1222,17 +1222,16 @@ ImageBridgeChild::DispatchAllocShmemInte task.Wait(); return params.mSuccess; } void ImageBridgeChild::ProxyDeallocShmemNow(SynchronousTask* aTask, - ISurfaceAllocator* aAllocator, ipc::Shmem* aShmem) { AutoCompleteTask complete(aTask); if (!CanSend()) { return; } DeallocShmem(*aShmem); @@ -1250,17 +1249,16 @@ ImageBridgeChild::DeallocShmem(ipc::Shme } SynchronousTask task("AllocatorProxy Dealloc"); RefPtr<Runnable> runnable = WrapRunnable( RefPtr<ImageBridgeChild>(this), &ImageBridgeChild::ProxyDeallocShmemNow, &task, - this, &aShmem); GetMessageLoop()->PostTask(runnable.forget()); task.Wait(); } PTextureChild* ImageBridgeChild::AllocPTextureChild(const SurfaceDescriptor&,
--- a/gfx/layers/ipc/ImageBridgeChild.h +++ b/gfx/layers/ipc/ImageBridgeChild.h @@ -104,24 +104,26 @@ bool InImageBridgeChildThread(); * until the layer transaction happens. This means this scenario is not harmful. * * Since sending an image through imageBridge triggers compositing, the main thread is * not used at all (except for the very first transaction that provides the * CompositableHost with an AsyncID). */ class ImageBridgeChild final : public PImageBridgeChild , public CompositableForwarder - , public ShmemAllocator + , public TextureForwarder { friend class ImageContainer; typedef InfallibleTArray<AsyncParentMessageData> AsyncParentMessageArray; public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ImageBridgeChild, override); - virtual ShmemAllocator* AsShmemAllocator() override { return this; } + TextureForwarder* GetTextureForwarder() override { return this; } + LayersIPCActor* GetLayersIPCActor() override { return this; } /** * Creates the image bridge with a dedicated thread for ImageBridgeChild. * * We may want to use a specifi thread in the future. In this case, use * CreateWithThread instead. */ static void InitSameProcess(); @@ -167,22 +169,16 @@ public: virtual MessageLoop * GetMessageLoop() const override; virtual base::ProcessId GetParentPid() const override { return OtherPid(); } PCompositableChild* AllocPCompositableChild(const TextureInfo& aInfo, PImageContainerChild* aChild, uint64_t* aID) override; bool DeallocPCompositableChild(PCompositableChild* aActor) override; - /** - * This must be called by the static function DeleteImageBridgeSync defined - * in ImageBridgeChild.cpp ONLY. - */ - ~ImageBridgeChild(); - virtual PTextureChild* AllocPTextureChild(const SurfaceDescriptor& aSharedData, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aSerial) override; virtual bool DeallocPTextureChild(PTextureChild* actor) override; PMediaSystemResourceManagerChild* AllocPMediaSystemResourceManagerChild() override; @@ -220,16 +216,23 @@ public: static void DispatchReleaseTextureClient(TextureClient* aClient); /** * Flush all Images sent to CompositableHost. */ void FlushAllImages(ImageClient* aClient, ImageContainer* aContainer); private: + + /** + * This must be called by the static function DeleteImageBridgeSync defined + * in ImageBridgeChild.cpp ONLY. + */ + ~ImageBridgeChild(); + // Helpers for dispatching. already_AddRefed<CanvasClient> CreateCanvasClientNow( CanvasClient::CanvasClientType aType, TextureFlags aFlags); void CreateCanvasClientSync( SynchronousTask* aTask, CanvasClient::CanvasClientType aType, TextureFlags aFlags, @@ -251,20 +254,17 @@ private: void FlushAllImagesSync( SynchronousTask* aTask, ImageClient* aClient, ImageContainer* aContainer, RefPtr<AsyncTransactionWaiter> aWaiter); void ProxyAllocShmemNow(SynchronousTask* aTask, AllocShmemParams* aParams); - void ProxyDeallocShmemNow( - SynchronousTask* aTask, - ISurfaceAllocator* aAllocator, - Shmem* aShmem); + void ProxyDeallocShmemNow(SynchronousTask* aTask, Shmem* aShmem); public: // CompositableForwarder virtual void Connect(CompositableClient* aCompositable, ImageContainer* aImageContainer) override; virtual bool UsesImageBridge() const override { return true; }
--- a/gfx/layers/ipc/LayerTransactionParent.h +++ b/gfx/layers/ipc/LayerTransactionParent.h @@ -103,18 +103,16 @@ public: mPendingCompositorUpdates = aCount; } void AcknowledgeCompositorUpdate() { MOZ_ASSERT(mPendingCompositorUpdates > 0); mPendingCompositorUpdates--; } protected: - virtual bool RecvSyncWithCompositor() override { return true; } - virtual bool RecvShutdown() override; virtual bool RecvPaintTime(const uint64_t& aTransactionId, const TimeDuration& aPaintTime) override; virtual bool RecvUpdate(EditArray&& cset, OpDestroyArray&& aToDestroy, const uint64_t& aFwdTransactionId,
--- a/gfx/layers/ipc/PCompositorBridge.ipdl +++ b/gfx/layers/ipc/PCompositorBridge.ipdl @@ -215,16 +215,18 @@ parent: /** * Sent when the child has finished CaptureAllPlugins. */ async AllPluginsCaptured(); async PTexture(SurfaceDescriptor aSharedData, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t id, uint64_t aSerial); + sync SyncWithCompositor(); + child: // Send back Compositor Frame Metrics from APZCs so tiled layers can // update progressively. async SharedCompositorFrameMetrics(Handle metrics, CrossProcessMutexHandle mutex, uint64_t aLayersId, uint32_t aAPZCId); async ReleaseSharedCompositorFrameMetrics(ViewID aId, uint32_t aAPZCId); }; } // layers
--- a/gfx/layers/ipc/PLayerTransaction.ipdl +++ b/gfx/layers/ipc/PLayerTransaction.ipdl @@ -120,16 +120,14 @@ parent: // Query a named property from the last frame sync RequestProperty(nsString property) returns (float value); // Tell the compositor to notify APZ that a layer has been confirmed for an // input event. async SetConfirmedTargetAPZC(uint64_t aInputBlockId, ScrollableLayerGuid[] aTargets); async Shutdown(); - - sync SyncWithCompositor(); child: async __delete__(); }; } // namespace layers } // namespace mozilla
--- a/gfx/layers/ipc/ShadowLayers.cpp +++ b/gfx/layers/ipc/ShadowLayers.cpp @@ -41,33 +41,16 @@ namespace mozilla { namespace ipc { class Shmem; } // namespace ipc namespace layers { -static int sShmemCreationCounter = 0; - -static void ResetShmemCounter() -{ - sShmemCreationCounter = 0; -} - -static void ShmemAllocated(LayerTransactionChild* aProtocol) -{ - sShmemCreationCounter++; - if (sShmemCreationCounter > 256) { - aProtocol->SendSyncWithCompositor(); - ResetShmemCounter(); - MOZ_PERFORMANCE_WARNING("gfx", "The number of shmem allocations is too damn high!"); - } -} - using namespace mozilla::gfx; using namespace mozilla::gl; using namespace mozilla::ipc; class ClientTiledLayerBuffer; typedef nsTArray<SurfaceDescriptor> BufferArray; typedef std::vector<Edit> EditVector; @@ -179,17 +162,17 @@ private: }; struct AutoTxnEnd { explicit AutoTxnEnd(Transaction* aTxn) : mTxn(aTxn) {} ~AutoTxnEnd() { mTxn->End(); } Transaction* mTxn; }; void -TextureForwarder::IdentifyTextureHost(const TextureFactoryIdentifier& aIdentifier) +KnowsCompositor::IdentifyTextureHost(const TextureFactoryIdentifier& aIdentifier) { mTextureFactoryIdentifier = aIdentifier; mSyncObject = SyncObject::CreateSyncObject(aIdentifier.mSyncHandle); } ShadowLayerForwarder::ShadowLayerForwarder(ClientLayerManager* aClientLayerManager) : mClientLayerManager(aClientLayerManager) @@ -542,17 +525,17 @@ ShadowLayerForwarder::RemoveTextureFromC TextureClient* aTexture) { NS_RUNTIMEABORT("not reached"); } bool ShadowLayerForwarder::InWorkerThread() { - return MessageLoop::current() && (GetMessageLoop()->id() == MessageLoop::current()->id()); + return MessageLoop::current() && (GetTextureForwarder()->GetMessageLoop()->id() == MessageLoop::current()->id()); } void ShadowLayerForwarder::StorePluginWidgetConfigurations(const nsTArray<nsIWidget::Configuration>& aConfigurations) { // Cache new plugin widget configs here until we call update, at which // point this data will get shipped over to chrome. @@ -582,17 +565,17 @@ ShadowLayerForwarder::EndTransaction(Inf bool aScheduleComposite, uint32_t aPaintSequenceNumber, bool aIsRepeatTransaction, const mozilla::TimeStamp& aTransactionStart, bool* aSent) { *aSent = false; - ResetShmemCounter(); + GetCompositorBridgeChild()->WillEndTransaction(); MOZ_ASSERT(aId); PROFILER_LABEL("ShadowLayerForwarder", "EndTransaction", js::ProfileEntry::Category::GRAPHICS); RenderTraceScope rendertrace("Foward Transaction", "000091"); MOZ_ASSERT(HasShadowManager(), "no manager to forward to"); @@ -722,17 +705,17 @@ ShadowLayerForwarder::EndTransaction(Inf mWindowOverlayChanged = false; TargetConfig targetConfig(mTxn->mTargetBounds, mTxn->mTargetRotation, mTxn->mTargetOrientation, aRegionToClear); - if (!IsSameProcess()) { + if (!GetTextureForwarder()->IsSameProcess()) { MOZ_LAYERS_LOG(("[LayersForwarder] syncing before send...")); PlatformSyncBeforeUpdate(); } profiler_tracing("Paint", "Rasterize", TRACING_INTERVAL_END); if (mTxn->mSwapRequired) { MOZ_LAYERS_LOG(("[LayersForwarder] sending transaction...")); RenderTraceScope rendertrace3("Forward Transaction", "000093"); @@ -777,77 +760,21 @@ ShadowLayerForwarder::SetLayerObserverEp { if (!HasShadowManager() || !mShadowManager->IPCOpen()) { return; } Unused << mShadowManager->SendSetLayerObserverEpoch(aLayerObserverEpoch); } bool -ShadowLayerForwarder::AllocUnsafeShmem(size_t aSize, - ipc::SharedMemory::SharedMemoryType aShmType, - ipc::Shmem* aShmem) -{ - MOZ_ASSERT(HasShadowManager(), "no shadow manager"); - if (!IPCOpen()) { - return false; - } - - ShmemAllocated(mShadowManager); - return GetCompositorBridgeChild()->AllocUnsafeShmem(aSize, aShmType, aShmem); -} - -bool -ShadowLayerForwarder::AllocShmem(size_t aSize, - ipc::SharedMemory::SharedMemoryType aShmType, - ipc::Shmem* aShmem) -{ - MOZ_ASSERT(HasShadowManager(), "no shadow manager"); - if (!IPCOpen()) { - return false; - } - - ShmemAllocated(mShadowManager); - return GetCompositorBridgeChild()->AllocShmem(aSize, aShmType, aShmem); -} - -void -ShadowLayerForwarder::DeallocShmem(ipc::Shmem& aShmem) -{ - MOZ_ASSERT(HasShadowManager(), "no shadow manager"); - if (HasShadowManager() && mShadowManager->IPCOpen()) { - GetCompositorBridgeChild()->DeallocShmem(aShmem); - } -} - -bool ShadowLayerForwarder::IPCOpen() const { return HasShadowManager() && mShadowManager->IPCOpen(); } -bool -ShadowLayerForwarder::IsSameProcess() const -{ - if (!HasShadowManager() || !mShadowManager->IPCOpen()) { - return false; - } - return mShadowManager->OtherPid() == base::GetCurrentProcId(); -} - -base::ProcessId -ShadowLayerForwarder::GetParentPid() const -{ - if (!HasShadowManager() || !mShadowManager->IPCOpen()) { - return base::ProcessId(); - } - - return mShadowManager->OtherPid(); -} - /** * We bail out when we have no shadow manager. That can happen when the * layer manager is created by the preallocated process. * See bug 914843 for details. */ PLayerChild* ShadowLayerForwarder::ConstructShadowFor(ShadowableLayer* aLayer) { @@ -900,32 +827,16 @@ void ShadowLayerForwarder::AttachAsyncCo ShadowableLayer* aLayer) { MOZ_ASSERT(aLayer); MOZ_ASSERT(aCompositableID != 0); // zero is always an invalid compositable id. mTxn->AddEdit(OpAttachAsyncCompositable(nullptr, Shadow(aLayer), aCompositableID)); } -PTextureChild* -ShadowLayerForwarder::CreateTexture(const SurfaceDescriptor& aSharedData, - LayersBackend aLayersBackend, - TextureFlags aFlags, - uint64_t aSerial) -{ - if (!HasShadowManager() || - !mShadowManager->IPCOpen() || - !mShadowManager->Manager()) { - gfxCriticalNote << "ShadowLayerForwarder::CreateTexture fails with HSM:" << HasShadowManager() << ", IPCOpen:" << mShadowManager->IPCOpen() << ", Destroyed:" << mShadowManager->IsDestroyed() << ", M:" << !!mShadowManager->Manager(); - return nullptr; - } - return mShadowManager->Manager()->SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, mShadowManager->GetId(), aSerial); -} - - void ShadowLayerForwarder::SetShadowManager(PLayerTransactionChild* aShadowManager) { mShadowManager = static_cast<LayerTransactionChild*>(aShadowManager); mShadowManager->SetForwarder(this); } void ShadowLayerForwarder::StopReceiveAsyncParentMessge() { @@ -1019,28 +930,28 @@ ShadowLayerForwarder::AllocSurfaceDescri gfx::SurfaceFormat format = gfxPlatform::GetPlatform()->Optimal2DFormatForContent(aContent); size_t size = ImageDataSerializer::ComputeRGBBufferSize(aSize, format); if (!size) { return false; } MemoryOrShmem bufferDesc; - if (IsSameProcess()) { + if (GetTextureForwarder()->IsSameProcess()) { uint8_t* data = new (std::nothrow) uint8_t[size]; if (!data) { return false; } GfxMemoryImageReporter::DidAlloc(data); memset(data, 0, size); bufferDesc = reinterpret_cast<uintptr_t>(data); } else { mozilla::ipc::Shmem shmem; - if (!AllocUnsafeShmem(size, OptimalShmemType(), &shmem)) { + if (!GetTextureForwarder()->AllocUnsafeShmem(size, OptimalShmemType(), &shmem)) { return false; } bufferDesc = shmem; } // Use an intermediate buffer by default. Skipping the intermediate buffer is // only possible in certain configurations so let's keep it simple here for now. @@ -1065,17 +976,17 @@ ShadowLayerForwarder::DestroySurfaceDesc MOZ_ASSERT(IPCOpen()); if (!IPCOpen() || !aSurface) { return; } SurfaceDescriptorBuffer& desc = aSurface->get_SurfaceDescriptorBuffer(); switch (desc.data().type()) { case MemoryOrShmem::TShmem: { - DeallocShmem(desc.data().get_Shmem()); + GetTextureForwarder()->DeallocShmem(desc.data().get_Shmem()); break; } case MemoryOrShmem::Tuintptr_t: { uint8_t* ptr = (uint8_t*)desc.data().get_uintptr_t(); GfxMemoryImageReporter::WillFree(ptr); delete [] ptr; break; } @@ -1097,38 +1008,23 @@ ShadowLayerForwarder::UpdateFwdTransacti uint64_t ShadowLayerForwarder::GetFwdTransactionId() { auto compositorBridge = GetCompositorBridgeChild(); MOZ_DIAGNOSTIC_ASSERT(compositorBridge); return compositorBridge ? compositorBridge->GetFwdTransactionId() : 0; } -void -ShadowLayerForwarder::CancelWaitForRecycle(uint64_t aTextureId) -{ - auto compositorBridge = GetCompositorBridgeChild(); - if (compositorBridge) { - compositorBridge->CancelWaitForRecycle(aTextureId); - } -} - CompositorBridgeChild* ShadowLayerForwarder::GetCompositorBridgeChild() { if (mCompositorBridgeChild) { return mCompositorBridgeChild; } if (!mShadowManager) { return nullptr; } mCompositorBridgeChild = static_cast<CompositorBridgeChild*>(mShadowManager->Manager()); return mCompositorBridgeChild; } -TextureForwarder* -ShadowLayerForwarder::AsTextureForwarder() -{ - return GetCompositorBridgeChild(); -} - } // namespace layers } // namespace mozilla
--- a/gfx/layers/ipc/ShadowLayers.h +++ b/gfx/layers/ipc/ShadowLayers.h @@ -12,17 +12,19 @@ #include <stdint.h> // for uint64_t #include "gfxTypes.h" #include "mozilla/Attributes.h" // for override #include "mozilla/gfx/Rect.h" #include "mozilla/WidgetUtils.h" // for ScreenRotation #include "mozilla/dom/ScreenOrientation.h" // for ScreenOrientation #include "mozilla/ipc/SharedMemory.h" // for SharedMemory, etc #include "mozilla/layers/CompositableForwarder.h" +#include "mozilla/layers/TextureForwarder.h" #include "mozilla/layers/CompositorTypes.h" // for OpenMode, etc +#include "mozilla/layers/CompositorBridgeChild.h" #include "nsCOMPtr.h" // for already_AddRefed #include "nsRegion.h" // for nsIntRegion #include "nsTArrayForwardDeclare.h" // for InfallibleTArray #include "nsIWidget.h" #include <vector> namespace mozilla { namespace layers { @@ -111,49 +113,31 @@ class Transaction; * Layer transactions maintain the shape of the shadow layer tree, and * synchronize the texture data held by compositables. Layer transactions * are always between the content thread and the compositor thread. * Compositable transactions are subset of a layer transaction with which only * compositables and textures can be manipulated, and does not always originate * from the content thread. (See CompositableForwarder.h and ImageBridgeChild.h) */ -class ShadowLayerForwarder final : public CompositableForwarder - , public ShmemAllocator +class ShadowLayerForwarder final : public LayersIPCActor + , public CompositableForwarder , public LegacySurfaceDescriptorAllocator { friend class ClientLayerManager; public: - virtual ~ShadowLayerForwarder(); - - virtual ShmemAllocator* AsShmemAllocator() override { return this; } - - virtual ShadowLayerForwarder* AsLayerForwarder() override { return this; } - - // TODO: confusingly, this returns a pointer to the CompositorBridgeChild. - // Right now ShadowLayerForwarder inherits TextureForwarder but it would - // probably be best if it didn't, since it forwards all of the relevent - // methods to CompositorBridgeChild. - virtual TextureForwarder* AsTextureForwarder() override; - - virtual LegacySurfaceDescriptorAllocator* - AsLegacySurfaceDescriptorAllocator() override { return this; } + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(ShadowLayerForwarder, override); /** * Setup the IPDL actor for aCompositable to be part of layers * transactions. */ - virtual void Connect(CompositableClient* aCompositable, - ImageContainer* aImageContainer) override; - - virtual PTextureChild* CreateTexture(const SurfaceDescriptor& aSharedData, - LayersBackend aLayersBackend, - TextureFlags aFlags, - uint64_t aSerial) override; + void Connect(CompositableClient* aCompositable, + ImageContainer* aImageContainer) override; /** * Adds an edit in the layers transaction in order to attach * the corresponding compositable and layer on the compositor side. * Connect must have been called on aCompositable beforehand. */ void Attach(CompositableClient* aCompositable, ShadowableLayer* aLayer); @@ -225,21 +209,21 @@ public: * of mask layer. */ void SetMask(ShadowableLayer* aLayer, ShadowableLayer* aMaskLayer); /** * See CompositableForwarder::UseTiledLayerBuffer */ - virtual void UseTiledLayerBuffer(CompositableClient* aCompositable, + void UseTiledLayerBuffer(CompositableClient* aCompositable, const SurfaceDescriptorTiles& aTileLayerDescriptor) override; - virtual bool DestroyInTransaction(PTextureChild* aTexture, bool synchronously) override; - virtual bool DestroyInTransaction(PCompositableChild* aCompositable, bool synchronously) override; + bool DestroyInTransaction(PTextureChild* aTexture, bool synchronously) override; + bool DestroyInTransaction(PCompositableChild* aCompositable, bool synchronously) override; virtual void RemoveTextureFromCompositable(CompositableClient* aCompositable, TextureClient* aTexture) override; virtual void RemoveTextureFromCompositableAsync(AsyncTransactionTracker* aAsyncTransactionTracker, CompositableClient* aCompositable, TextureClient* aTexture) override; @@ -339,35 +323,18 @@ public: * calls Destroyed*Buffer(), which gives up control of the back * buffer descriptor. The actual back buffer surface is then * destroyed using DestroySharedSurface() just before notifying * the parent process. When the parent process is notified, the * LayerComposite also calls DestroySharedSurface() on its front * buffer, and the double-buffer pair is gone. */ - - virtual bool AllocUnsafeShmem(size_t aSize, - mozilla::ipc::SharedMemory::SharedMemoryType aType, - mozilla::ipc::Shmem* aShmem) override; - virtual bool AllocShmem(size_t aSize, - mozilla::ipc::SharedMemory::SharedMemoryType aType, - mozilla::ipc::Shmem* aShmem) override; - virtual void DeallocShmem(mozilla::ipc::Shmem& aShmem) override; - virtual bool IPCOpen() const override; - virtual bool IsSameProcess() const override; - - virtual MessageLoop* GetMessageLoop() const override { return mMessageLoop; } - - virtual void CancelWaitForRecycle(uint64_t aTextureId) override; - - virtual base::ProcessId GetParentPid() const override; - /** * Construct a shadow of |aLayer| on the "other side", at the * LayerManagerComposite. */ PLayerChild* ConstructShadowFor(ShadowableLayer* aLayer); /** * Flag the next paint as the first for a document. @@ -396,17 +363,22 @@ public: bool InForwarderThread() override { return NS_IsMainThread(); } // Returns true if aSurface wraps a Shmem. static bool IsShmem(SurfaceDescriptor* aSurface); + TextureForwarder* GetTextureForwarder() override { return GetCompositorBridgeChild(); } + LayersIPCActor* GetLayersIPCActor() override { return this; } + protected: + virtual ~ShadowLayerForwarder(); + explicit ShadowLayerForwarder(ClientLayerManager* aClientLayerManager); #ifdef DEBUG void CheckSurfaceDescriptor(const SurfaceDescriptor* aDescriptor) const; #else void CheckSurfaceDescriptor(const SurfaceDescriptor* aDescriptor) const {} #endif
--- a/gfx/layers/ipc/SharedPlanarYCbCrImage.cpp +++ b/gfx/layers/ipc/SharedPlanarYCbCrImage.cpp @@ -52,17 +52,17 @@ SharedPlanarYCbCrImage::SizeOfExcludingT // NB: Explicitly skipping mTextureClient, the memory is already reported // at time of allocation in GfxMemoryImageReporter. // Not owned: // - mCompositable return 0; } TextureClient* -SharedPlanarYCbCrImage::GetTextureClient(TextureForwarder* aForwarder) +SharedPlanarYCbCrImage::GetTextureClient(KnowsCompositor* aForwarder) { return mTextureClient.get(); } uint8_t* SharedPlanarYCbCrImage::GetBuffer() { // This should never be used @@ -152,20 +152,19 @@ SharedPlanarYCbCrImage::AdoptData(const mSize = aData.mPicSize; mOrigin = gfx::IntPoint(aData.mPicX, aData.mPicY); uint8_t *base = GetBuffer(); uint32_t yOffset = aData.mYChannel - base; uint32_t cbOffset = aData.mCbChannel - base; uint32_t crOffset = aData.mCrChannel - base; - auto fwd = mCompositable->GetForwarder()->AsCompositableForwarder(); - bool hasIntermediateBuffer = fwd ? ComputeHasIntermediateBuffer(gfx::SurfaceFormat::YUV, - fwd->GetCompositorBackendType()) - : true; + auto fwd = mCompositable->GetForwarder(); + bool hasIntermediateBuffer = ComputeHasIntermediateBuffer(gfx::SurfaceFormat::YUV, + fwd->GetCompositorBackendType()); static_cast<BufferTextureData*>(mTextureClient->GetInternalData())->SetDesciptor( YCbCrDescriptor(aData.mYSize, aData.mCbCrSize, yOffset, cbOffset, crOffset, aData.mStereoMode, hasIntermediateBuffer) ); return true; }
--- a/gfx/layers/ipc/SharedPlanarYCbCrImage.h +++ b/gfx/layers/ipc/SharedPlanarYCbCrImage.h @@ -25,17 +25,17 @@ class SharedPlanarYCbCrImage : public Pl { public: explicit SharedPlanarYCbCrImage(ImageClient* aCompositable); protected: ~SharedPlanarYCbCrImage(); public: - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; virtual uint8_t* GetBuffer() override; virtual already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override; virtual bool CopyData(const PlanarYCbCrData& aData) override; virtual bool AdoptData(const Data &aData) override; virtual bool Allocate(PlanarYCbCrData& aData); virtual uint8_t* AllocateAndGetNewBuffer(uint32_t aSize) override;
--- a/gfx/layers/ipc/SharedRGBImage.cpp +++ b/gfx/layers/ipc/SharedRGBImage.cpp @@ -93,17 +93,17 @@ SharedRGBImage::GetBuffer() gfx::IntSize SharedRGBImage::GetSize() { return mSize; } TextureClient* -SharedRGBImage::GetTextureClient(TextureForwarder* aForwarder) +SharedRGBImage::GetTextureClient(KnowsCompositor* aForwarder) { return mTextureClient.get(); } already_AddRefed<gfx::SourceSurface> SharedRGBImage::GetAsSourceSurface() { return nullptr;
--- a/gfx/layers/ipc/SharedRGBImage.h +++ b/gfx/layers/ipc/SharedRGBImage.h @@ -33,17 +33,17 @@ class SharedRGBImage : public Image { public: explicit SharedRGBImage(ImageClient* aCompositable); protected: ~SharedRGBImage(); public: - virtual TextureClient* GetTextureClient(TextureForwarder* aForwarder) override; + virtual TextureClient* GetTextureClient(KnowsCompositor* aForwarder) override; virtual uint8_t* GetBuffer() override; gfx::IntSize GetSize() override; already_AddRefed<gfx::SourceSurface> GetAsSourceSurface() override; bool Allocate(gfx::IntSize aSize, gfx::SurfaceFormat aFormat);
--- a/gfx/layers/ipc/TextureForwarder.h +++ b/gfx/layers/ipc/TextureForwarder.h @@ -10,45 +10,125 @@ #include <stdint.h> // for int32_t, uint64_t #include "gfxTypes.h" #include "mozilla/Attributes.h" // for override #include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator #include "mozilla/layers/LayersTypes.h" // for LayersBackend #include "mozilla/layers/TextureClient.h" // for TextureClient #include "nsRegion.h" // for nsIntRegion #include "mozilla/gfx/Rect.h" +#include "nsExpirationTracker.h" namespace mozilla { namespace layers { -class TextureForwarder : public ClientIPCAllocator + +/** + * See ActiveResourceTracker below. + */ +class ActiveResource +{ +public: + virtual void NotifyInactive() = 0; + nsExpirationState* GetExpirationState() { return &mExpirationState; } + bool IsActivityTracked() { return mExpirationState.IsTracked(); } +private: + nsExpirationState mExpirationState; +}; + +/** + * A convenience class on top of nsExpirationTracker + */ +class ActiveResourceTracker : public nsExpirationTracker<ActiveResource, 3> { public: - TextureForwarder() - : mSerial(++sSerialCounter) + ActiveResourceTracker(uint32_t aExpirationCycle, const char* aName) + : nsExpirationTracker(aExpirationCycle, aName) {} + virtual void NotifyExpired(ActiveResource* aResource) override + { + RemoveObject(aResource); + aResource->NotifyInactive(); + } +}; + +/** + * An abstract interface for classes that implement the autogenerated + * IPDL actor class. Lets us check if they are still valid for IPC. + */ +class LayersIPCActor { +public: + virtual bool IPCOpen() const { return true; } +}; + +/** + * An abstract interface for LayersIPCActors that implement a top-level + * IPDL protocol so also have their own channel. + * Has their own MessageLoop for message dispatch, and can allocate + * shmem. + */ +class LayersIPCChannel : public LayersIPCActor + , public ShmemAllocator { +public: + NS_IMETHOD_(MozExternalRefCountType) AddRef(void) = 0; + NS_IMETHOD_(MozExternalRefCountType) Release(void) = 0; + + virtual bool IsSameProcess() const = 0; + + virtual bool UsesImageBridge() const { return false; } + + virtual base::ProcessId GetParentPid() const = 0; + + virtual MessageLoop* GetMessageLoop() const = 0; + + virtual FixedSizeSmallShmemSectionAllocator* GetTileLockAllocator() { return nullptr; } + + virtual void CancelWaitForRecycle(uint64_t aTextureId) = 0; +protected: + virtual ~LayersIPCChannel() {} +}; + +/** + * An abstract interface for classes that can allocate PTexture objects + * across IPDL. Currently a sub-class of LayersIPCChannel for simplicity + * since all our implementations use both, but could be independant if needed. + */ +class TextureForwarder : public LayersIPCChannel { +public: /** * Create a TextureChild/Parent pair as as well as the TextureHost on the parent side. */ virtual PTextureChild* CreateTexture( const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, uint64_t aSerial) = 0; - - virtual TextureForwarder* AsTextureForwarder() override { return this; } +}; - virtual FixedSizeSmallShmemSectionAllocator* GetTileLockAllocator() { return nullptr; } +/** + * An abstract interface for classes that are tied to a specific Compositor across + * IPDL and uses TextureFactoryIdentifier to describe this Compositor. + */ +class KnowsCompositor { +public: + NS_IMETHOD_(MozExternalRefCountType) AddRef(void) = 0; + NS_IMETHOD_(MozExternalRefCountType) Release(void) = 0; - int32_t GetSerial() { return mSerial; } + KnowsCompositor() + : mSerial(++sSerialCounter) + { + mActiveResourceTracker = MakeUnique<ActiveResourceTracker>(1000, "CompositableForwarder"); + } void IdentifyTextureHost(const TextureFactoryIdentifier& aIdentifier); - virtual int32_t GetMaxTextureSize() const override + SyncObject* GetSyncObject() { return mSyncObject; } + + int32_t GetMaxTextureSize() const { return mTextureFactoryIdentifier.mMaxTextureSize; } /** * Returns the type of backend that is used off the main thread. * We only don't allow changing the backend type at runtime so this value can * be queried once and will not change until Gecko is restarted. @@ -68,22 +148,33 @@ public: return mTextureFactoryIdentifier.mSupportsPartialUploads; } const TextureFactoryIdentifier& GetTextureFactoryIdentifier() const { return mTextureFactoryIdentifier; } - SyncObject* GetSyncObject() { return mSyncObject; } + int32_t GetSerial() { return mSerial; } + + ActiveResourceTracker& GetActiveResourceTracker() { return *mActiveResourceTracker.get(); } + + /** + * Helpers for finding other related interface. These are infallible. + */ + virtual TextureForwarder* GetTextureForwarder() = 0; + virtual LayersIPCActor* GetLayersIPCActor() = 0; protected: TextureFactoryIdentifier mTextureFactoryIdentifier; + RefPtr<SyncObject> mSyncObject; + UniquePtr<ActiveResourceTracker> mActiveResourceTracker; + const int32_t mSerial; static mozilla::Atomic<int32_t> sSerialCounter; }; } // namespace layers } // namespace mozilla #endif
--- a/gfx/layers/ipc/VideoBridgeChild.h +++ b/gfx/layers/ipc/VideoBridgeChild.h @@ -10,20 +10,23 @@ #include "ISurfaceAllocator.h" #include "TextureForwarder.h" namespace mozilla { namespace layers { class VideoBridgeChild final : public PVideoBridgeChild , public TextureForwarder - , public ShmemAllocator + , public KnowsCompositor { public: - ~VideoBridgeChild(); + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoBridgeChild, override); + + TextureForwarder* GetTextureForwarder() override { return this; } + LayersIPCActor* GetLayersIPCActor() override { return this; } static void Startup(); static void Shutdown(); static VideoBridgeChild* GetSingleton(); // PVideoBridgeChild PTextureChild* AllocPTextureChild(const SurfaceDescriptor& aSharedData, @@ -48,23 +51,23 @@ public: uint64_t aSerial) override; // ClientIPCAllocator base::ProcessId GetParentPid() const override { return OtherPid(); } MessageLoop * GetMessageLoop() const override { return mMessageLoop; } void CancelWaitForRecycle(uint64_t aTextureId) override { MOZ_ASSERT(false, "NO RECYCLING HERE"); } // ISurfaceAllocator - ShmemAllocator* AsShmemAllocator() override { return this; } bool IsSameProcess() const override; bool CanSend() { return true; } private: VideoBridgeChild(); + ~VideoBridgeChild(); MessageLoop* mMessageLoop; }; } // namespace layers } // namespace mozilla #endif
--- a/gfx/layers/opengl/GrallocTextureClient.cpp +++ b/gfx/layers/opengl/GrallocTextureClient.cpp @@ -105,29 +105,29 @@ GrallocTextureData::GrallocTextureData(M } GrallocTextureData::~GrallocTextureData() { MOZ_COUNT_DTOR(GrallocTextureData); } void -GrallocTextureData::Deallocate(ClientIPCAllocator* aAllocator) +GrallocTextureData::Deallocate(LayersIPCChannel* aAllocator) { MOZ_ASSERT(aAllocator); if (aAllocator && aAllocator->IPCOpen()) { SharedBufferManagerChild::GetSingleton()->DeallocGrallocBuffer(mGrallocHandle); } mGrallocHandle = null_t(); mGraphicBuffer = nullptr; } void -GrallocTextureData::Forget(ClientIPCAllocator* aAllocator) +GrallocTextureData::Forget(LayersIPCChannel* aAllocator) { MOZ_ASSERT(aAllocator); if (aAllocator && aAllocator->IPCOpen()) { SharedBufferManagerChild::GetSingleton()->DropGrallocBuffer(mGrallocHandle); } mGrallocHandle = null_t(); mGraphicBuffer = nullptr; @@ -285,17 +285,17 @@ GrallocTextureData::UpdateFromSurface(gf return true; } // static GrallocTextureData* GrallocTextureData::Create(gfx::IntSize aSize, AndroidFormat aAndroidFormat, gfx::BackendType aMoz2dBackend, uint32_t aUsage, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { if (!aAllocator || !aAllocator->IPCOpen()) { return nullptr; } int32_t maxSize = aAllocator->AsClientAllocator()->GetMaxTextureSize(); if (aSize.width > maxSize || aSize.height > maxSize) { return nullptr; } @@ -340,17 +340,17 @@ GrallocTextureData::Create(gfx::IntSize return new GrallocTextureData(handle, aSize, format, aMoz2dBackend); } // static GrallocTextureData* GrallocTextureData::CreateForDrawing(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2dBackend, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { if (DisableGralloc(aFormat, aSize)) { return nullptr; } #if ANDROID_VERSION <= 15 // Adreno 200 has a problem of drawing gralloc buffer width less than 64 and // drawing gralloc buffer with a height 9px-16px. @@ -392,30 +392,30 @@ GrallocTextureData::GetTextureFlags() co } return TextureFlags::NO_FLAGS; } // static GrallocTextureData* GrallocTextureData::CreateForYCbCr(gfx::IntSize aYSize, gfx::IntSize aCbCrSize, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { MOZ_ASSERT(aYSize.width == aCbCrSize.width * 2); MOZ_ASSERT(aYSize.height == aCbCrSize.height * 2); return GrallocTextureData::Create(aYSize, HAL_PIXEL_FORMAT_YV12, gfx::BackendType::NONE, android::GraphicBuffer::USAGE_SW_READ_OFTEN, aAllocator); } // static GrallocTextureData* GrallocTextureData::CreateForGLRendering(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - ClientIPCAllocator* aAllocator) + LayersIPCChannel* aAllocator) { if (aFormat == gfx::SurfaceFormat::YUV) { return nullptr; } uint32_t usage = android::GraphicBuffer::USAGE_HW_RENDER | android::GraphicBuffer::USAGE_HW_TEXTURE; return GrallocTextureData::Create(aSize, GetAndroidFormat(aFormat), gfx::BackendType::NONE, usage, aAllocator); @@ -441,17 +441,17 @@ GrallocTextureData::TextureClientFromSha (uint32_t)present, (uint32_t)required); MOZ_CRASH("Flag requirement mismatch."); } return ret.forget(); } TextureData* -GrallocTextureData::CreateSimilar(ClientIPCAllocator* aAllocator, +GrallocTextureData::CreateSimilar(LayersIPCChannel* aAllocator, TextureFlags aFlags, TextureAllocationFlags aAllocFlags) const { if (mFormat == gfx::SurfaceFormat::YUV) { return GrallocTextureData::CreateForYCbCr(mSize, mSize*2, aAllocator); } else { return GrallocTextureData::CreateForDrawing(mSize, mFormat, mMoz2DBackend, aAllocator); }
--- a/gfx/layers/opengl/GrallocTextureClient.h +++ b/gfx/layers/opengl/GrallocTextureClient.h @@ -46,40 +46,40 @@ public: virtual void Unlock() override; virtual void FillInfo(TextureData::Info& aInfo) const override; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override; virtual bool BorrowMappedData(MappedTextureData& aMap) override; - virtual void Deallocate(ClientIPCAllocator*) override; + virtual void Deallocate(LayersIPCChannel*) override; - virtual void Forget(ClientIPCAllocator*) override; + virtual void Forget(LayersIPCChannel*) override; static GrallocTextureData* CreateForDrawing(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, gfx::BackendType aMoz2dBackend, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); static GrallocTextureData* CreateForYCbCr(gfx::IntSize aYSize, gfx::IntSize aCbCrSize, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); static GrallocTextureData* CreateForGLRendering(gfx::IntSize aSize, gfx::SurfaceFormat aFormat, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); static GrallocTextureData* Create(gfx::IntSize aSize, AndroidFormat aFormat, gfx::BackendType aMoz2DBackend, uint32_t aUsage, - ClientIPCAllocator* aAllocator); + LayersIPCChannel* aAllocator); static already_AddRefed<TextureClient> TextureClientFromSharedSurface(gl::SharedSurface* abstractSurf, TextureFlags flags); virtual TextureData* - CreateSimilar(ClientIPCAllocator* aAllocator, + CreateSimilar(LayersIPCChannel* aAllocator, TextureFlags aFlags = TextureFlags::DEFAULT, TextureAllocationFlags aAllocFlags = ALLOC_DEFAULT) const override; // use TextureClient's default implementation virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) override; /// Hold android::MediaBuffer. /// MediaBuffer needs to be add refed to keep MediaBuffer alive while the texture
--- a/gfx/layers/opengl/MacIOSurfaceTextureClientOGL.cpp +++ b/gfx/layers/opengl/MacIOSurfaceTextureClientOGL.cpp @@ -108,23 +108,23 @@ MacIOSurfaceTextureData::BorrowDrawTarge (unsigned char*)mSurface->GetBaseAddress(), IntSize(mSurface->GetWidth(), mSurface->GetHeight()), mSurface->GetBytesPerRow(), mSurface->HasAlpha() ? SurfaceFormat::B8G8R8A8 : SurfaceFormat::B8G8R8X8, true); } void -MacIOSurfaceTextureData::Deallocate(ClientIPCAllocator*) +MacIOSurfaceTextureData::Deallocate(LayersIPCChannel*) { mSurface = nullptr; } void -MacIOSurfaceTextureData::Forget(ClientIPCAllocator*) +MacIOSurfaceTextureData::Forget(LayersIPCChannel*) { mSurface = nullptr; } bool MacIOSurfaceTextureData::UpdateFromSurface(gfx::SourceSurface* aSurface) { RefPtr<DrawTarget> dt = BorrowDrawTarget();
--- a/gfx/layers/opengl/MacIOSurfaceTextureClientOGL.h +++ b/gfx/layers/opengl/MacIOSurfaceTextureClientOGL.h @@ -30,19 +30,19 @@ public: virtual bool Lock(OpenMode, FenceHandle*) override; virtual void Unlock() override; virtual already_AddRefed<gfx::DrawTarget> BorrowDrawTarget() override; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - virtual void Deallocate(ClientIPCAllocator*) override; + virtual void Deallocate(LayersIPCChannel*) override; - virtual void Forget(ClientIPCAllocator*) override; + virtual void Forget(LayersIPCChannel*) override; virtual bool UpdateFromSurface(gfx::SourceSurface* aSurface) override; // For debugging purposes only. already_AddRefed<gfx::DataSourceSurface> GetAsSurface(); protected: MacIOSurfaceTextureData(MacIOSurface* aSurface,
--- a/gfx/layers/opengl/TextureClientOGL.cpp +++ b/gfx/layers/opengl/TextureClientOGL.cpp @@ -24,17 +24,17 @@ EGLImageTextureData::EGLImageTextureData : mImage(aImage) , mSize(aSize) { MOZ_ASSERT(aImage); } already_AddRefed<TextureClient> EGLImageTextureData::CreateTextureClient(EGLImageImage* aImage, gfx::IntSize aSize, - ClientIPCAllocator* aAllocator, TextureFlags aFlags) + LayersIPCChannel* aAllocator, TextureFlags aFlags) { MOZ_ASSERT(XRE_IsParentProcess(), "Can't pass an `EGLImage` between processes."); if (!aImage || !XRE_IsParentProcess()) { return nullptr; } @@ -77,17 +77,17 @@ EGLImageTextureData::Serialize(SurfaceDe // AndroidSurface #ifdef MOZ_WIDGET_ANDROID already_AddRefed<TextureClient> AndroidSurfaceTextureData::CreateTextureClient(AndroidSurfaceTexture* aSurfTex, gfx::IntSize aSize, gl::OriginPos aOriginPos, - ClientIPCAllocator* aAllocator, + LayersIPCChannel* aAllocator, TextureFlags aFlags) { MOZ_ASSERT(XRE_IsParentProcess(), "Can't pass an android surfaces between processes."); if (!aSurfTex || !XRE_IsParentProcess()) { return nullptr; }
--- a/gfx/layers/opengl/TextureClientOGL.h +++ b/gfx/layers/opengl/TextureClientOGL.h @@ -21,25 +21,25 @@ namespace mozilla { namespace layers { class EGLImageTextureData : public TextureData { public: static already_AddRefed<TextureClient> CreateTextureClient(EGLImageImage* aImage, gfx::IntSize aSize, - ClientIPCAllocator* aAllocator, TextureFlags aFlags); + LayersIPCChannel* aAllocator, TextureFlags aFlags); virtual void FillInfo(TextureData::Info& aInfo) const override; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; - virtual void Deallocate(ClientIPCAllocator*) override { mImage = nullptr; } + virtual void Deallocate(LayersIPCChannel*) override { mImage = nullptr; } - virtual void Forget(ClientIPCAllocator*) override { mImage = nullptr; } + virtual void Forget(LayersIPCChannel*) override { mImage = nullptr; } // Unused functions. virtual bool Lock(OpenMode, FenceHandle*) override { return true; } virtual void Unlock() override {} protected: EGLImageTextureData(EGLImageImage* aImage, gfx::IntSize aSize); @@ -52,32 +52,32 @@ protected: class AndroidSurfaceTextureData : public TextureData { public: static already_AddRefed<TextureClient> CreateTextureClient(gl::AndroidSurfaceTexture* aSurfTex, gfx::IntSize aSize, gl::OriginPos aOriginPos, - ClientIPCAllocator* aAllocator, + LayersIPCChannel* aAllocator, TextureFlags aFlags); ~AndroidSurfaceTextureData(); virtual void FillInfo(TextureData::Info& aInfo) const override; virtual bool Serialize(SurfaceDescriptor& aOutDescriptor) override; // Useless functions. virtual bool Lock(OpenMode, FenceHandle*) override { return true; } virtual void Unlock() override {} // Our data is always owned externally. - virtual void Deallocate(ClientIPCAllocator*) override {} + virtual void Deallocate(LayersIPCChannel*) override {} protected: AndroidSurfaceTextureData(gl::AndroidSurfaceTexture* aSurfTex, gfx::IntSize aSize); const RefPtr<gl::AndroidSurfaceTexture> mSurfTex; const gfx::IntSize mSize; };
--- a/gfx/vr/ipc/VRManagerChild.h +++ b/gfx/vr/ipc/VRManagerChild.h @@ -26,19 +26,24 @@ class PCompositableChild; class TextureClient; } namespace gfx { class VRLayerChild; class VRDisplayClient; class VRManagerChild : public PVRManagerChild , public layers::TextureForwarder - , public layers::ShmemAllocator + , public layers::KnowsCompositor { public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VRManagerChild, override); + + TextureForwarder* GetTextureForwarder() override { return this; } + LayersIPCActor* GetLayersIPCActor() override { return this; } + static VRManagerChild* Get(); // Indicate that an observer wants to receive VR events. void AddListener(dom::VREventObserver* aObserver); // Indicate that an observer should no longer receive VR events. void RemoveListener(dom::VREventObserver* aObserver); int GetInputFrameID(); @@ -106,18 +111,16 @@ protected: virtual bool RecvParentAsyncMessages(InfallibleTArray<AsyncParentMessageData>&& aMessages) override; virtual bool RecvNotifyVSync() override; virtual bool RecvNotifyVRVSync(const uint32_t& aDisplayID) override; // ShmemAllocator - virtual ShmemAllocator* AsShmemAllocator() override { return this; } - virtual bool AllocShmem(size_t aSize, ipc::SharedMemory::SharedMemoryType aType, ipc::Shmem* aShmem) override; virtual bool AllocUnsafeShmem(size_t aSize, ipc::SharedMemory::SharedMemoryType aType, ipc::Shmem* aShmem) override;
--- a/widget/nsBaseWidget.cpp +++ b/widget/nsBaseWidget.cpp @@ -1351,17 +1351,17 @@ void nsBaseWidget::CreateCompositor(int if (!success || !lf) { NS_WARNING("Failed to create an OMT compositor."); DestroyCompositor(); mLayerManager = nullptr; return; } lf->SetShadowManager(shadowManager); - lf->IdentifyTextureHost(textureFactoryIdentifier); + lm->UpdateTextureFactoryIdentifier(textureFactoryIdentifier); ImageBridgeChild::IdentifyCompositorTextureHost(textureFactoryIdentifier); gfx::VRManagerChild::IdentifyTextureHost(textureFactoryIdentifier); WindowUsesOMTC(); mLayerManager = lm.forget(); if (mWindowType == eWindowType_toplevel) { // Only track compositors for top-level windows, since other window types