author | Nicolas Silva <nical@mozilla.com> |
Fri, 25 Apr 2014 17:15:58 +0200 | |
changeset 198667 | 241760451193a9e81d443362b5991809c518c91f |
parent 198666 | 16a37bafa5c816272557a9b2764a8b3137e81808 |
child 198668 | f5a100decfb37ac517fe7f6abb84121818e267eb |
push id | 3624 |
push user | asasaki@mozilla.com |
push date | Mon, 09 Jun 2014 21:49:01 +0000 |
treeherder | mozilla-beta@b1a5da15899a [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | bjacob |
bugs | 997699 |
milestone | 31.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/layers/composite/CompositableHost.cpp +++ b/gfx/layers/composite/CompositableHost.cpp @@ -17,18 +17,59 @@ #include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc #include "gfxPlatform.h" // for gfxPlatform namespace mozilla { namespace layers { class Compositor; +/** + * IPDL actor used by CompositableHost to match with its corresponding + * CompositableClient on the content side. + * + * CompositableParent is owned by the IPDL system. It's deletion is triggered + * by either the CompositableChild's deletion, or by the IPDL communication + * goind down. + */ +class CompositableParent : public PCompositableParent +{ +public: + CompositableParent(CompositableParentManager* aMgr, + const TextureInfo& aTextureInfo, + uint64_t aID = 0) + { + MOZ_COUNT_CTOR(CompositableParent); + mHost = CompositableHost::Create(aTextureInfo); + mHost->SetAsyncID(aID); + if (aID) { + CompositableMap::Set(aID, this); + } + } + + ~CompositableParent() + { + MOZ_COUNT_DTOR(CompositableParent); + CompositableMap::Erase(mHost->GetAsyncID()); + } + + virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE + { + if (mHost) { + mHost->Detach(nullptr, CompositableHost::FORCE_DETACH); + } + } + + RefPtr<CompositableHost> mHost; +}; + CompositableHost::CompositableHost(const TextureInfo& aTextureInfo) : mTextureInfo(aTextureInfo) + , mAsyncID(0) + , mCompositorID(0) , mCompositor(nullptr) , mLayer(nullptr) , mFlashCounter(0) , mAttached(false) , mKeepAttached(false) { MOZ_COUNT_CTOR(CompositableHost); } @@ -36,16 +77,38 @@ CompositableHost::CompositableHost(const CompositableHost::~CompositableHost() { MOZ_COUNT_DTOR(CompositableHost); if (mBackendData) { mBackendData->ClearData(); } } +PCompositableParent* +CompositableHost::CreateIPDLActor(CompositableParentManager* aMgr, + const TextureInfo& aTextureInfo, + uint64_t aID) +{ + return new CompositableParent(aMgr, aTextureInfo, aID); +} + +bool +CompositableHost::DestroyIPDLActor(PCompositableParent* aActor) +{ + delete aActor; + return true; +} + +CompositableHost* +CompositableHost::FromIPDLActor(PCompositableParent* aActor) +{ + MOZ_ASSERT(aActor); + return static_cast<CompositableParent*>(aActor)->mHost; +} + void CompositableHost::UseTextureHost(TextureHost* aTexture) { if (!aTexture) { return; } aTexture->SetCompositor(GetCompositor()); aTexture->SetCompositableBackendSpecificData(GetCompositableBackendSpecificData()); @@ -166,64 +229,35 @@ CompositableHost::DumpTextureHost(FILE* nsRefPtr<gfxASurface> surf = platform->GetThebesSurfaceForDrawTarget(dt); if (!surf) { return; } surf->DumpAsDataURL(aFile ? aFile : stderr); } #endif -void -CompositableParent::ActorDestroy(ActorDestroyReason why) -{ - if (mHost) { - mHost->Detach(nullptr, CompositableHost::FORCE_DETACH); - } -} - -CompositableParent::CompositableParent(CompositableParentManager* aMgr, - const TextureInfo& aTextureInfo, - uint64_t aID) -: mManager(aMgr) -, mType(aTextureInfo.mCompositableType) -, mID(aID) -, mCompositorID(0) -{ - MOZ_COUNT_CTOR(CompositableParent); - mHost = CompositableHost::Create(aTextureInfo); - if (aID) { - CompositableMap::Set(aID, this); - } -} - -CompositableParent::~CompositableParent() -{ - MOZ_COUNT_DTOR(CompositableParent); - CompositableMap::Erase(mID); -} - namespace CompositableMap { -typedef std::map<uint64_t, CompositableParent*> CompositableMap_t; +typedef std::map<uint64_t, PCompositableParent*> CompositableMap_t; static CompositableMap_t* sCompositableMap = nullptr; bool IsCreated() { return sCompositableMap != nullptr; } -CompositableParent* Get(uint64_t aID) +PCompositableParent* Get(uint64_t aID) { if (!IsCreated() || aID == 0) { return nullptr; } CompositableMap_t::iterator it = sCompositableMap->find(aID); if (it == sCompositableMap->end()) { return nullptr; } return it->second; } -void Set(uint64_t aID, CompositableParent* aParent) +void Set(uint64_t aID, PCompositableParent* aParent) { if (!IsCreated() || aID == 0) { return; } (*sCompositableMap)[aID] = aParent; } void Erase(uint64_t aID) {
--- a/gfx/layers/composite/CompositableHost.h +++ b/gfx/layers/composite/CompositableHost.h @@ -46,16 +46,17 @@ struct TiledLayerProperties }; class Layer; class SurfaceDescriptor; class Compositor; class ISurfaceAllocator; class ThebesBufferData; class TiledLayerComposer; +class CompositableParentManager; struct EffectChain; /** * A base class for doing CompositableHost and platform dependent task on TextureHost. */ class CompositableBackendSpecificData { protected: @@ -302,85 +303,46 @@ public: virtual void RemoveTextureHost(TextureHost* aTexture); // Called every time this is composited void BumpFlashCounter() { mFlashCounter = mFlashCounter >= DIAGNOSTIC_FLASH_COUNTER_MAX ? DIAGNOSTIC_FLASH_COUNTER_MAX : mFlashCounter + 1; } + + static PCompositableParent* + CreateIPDLActor(CompositableParentManager* mgr, + const TextureInfo& textureInfo, + uint64_t asyncID); + + static bool DestroyIPDLActor(PCompositableParent* actor); + + static CompositableHost* FromIPDLActor(PCompositableParent* actor); + + uint64_t GetCompositorID() const { return mCompositorID; } + + uint64_t GetAsyncID() const { return mAsyncID; } + + void SetCompositorID(uint64_t aID) { mCompositorID = aID; } + + void SetAsyncID(uint64_t aID) { mAsyncID = aID; } + protected: TextureInfo mTextureInfo; + uint64_t mAsyncID; + uint64_t mCompositorID; Compositor* mCompositor; Layer* mLayer; RefPtr<CompositableBackendSpecificData> mBackendData; uint32_t mFlashCounter; // used when the pref "layers.flash-borders" is true. bool mAttached; bool mKeepAttached; }; -class CompositableParentManager; - -/** - * IPDL actor used by CompositableHost to match with its corresponding - * CompositableClient on the content side. - * - * CompositableParent is owned by the IPDL system. It's deletion is triggered - * by either the CompositableChild's deletion, or by the IPDL communication - * goind down. - */ -class CompositableParent : public PCompositableParent -{ -public: - CompositableParent(CompositableParentManager* aMgr, - const TextureInfo& aTextureInfo, - uint64_t aID = 0); - ~CompositableParent(); - - virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE; - - CompositableHost* GetCompositableHost() const - { - return mHost; - } - - void SetCompositableHost(CompositableHost* aHost) - { - mHost = aHost; - } - - CompositableType GetType() const - { - return mType; - } - - CompositableParentManager* GetCompositableManager() const - { - return mManager; - } - - void SetCompositorID(uint64_t aCompositorID) - { - mCompositorID = aCompositorID; - } - - uint64_t GetCompositorID() const - { - return mCompositorID; - } - -private: - RefPtr<CompositableHost> mHost; - CompositableParentManager* mManager; - CompositableType mType; - uint64_t mID; - uint64_t mCompositorID; -}; - - /** * Global CompositableMap, to use in the compositor thread only. * * PCompositable and PLayer can, in the case of async textures, be managed by * different top level protocols. In this case they don't share the same * communication channel and we can't send an OpAttachCompositable (PCompositable, * PLayer) message. * @@ -401,18 +363,18 @@ private: * ImageBridge is used by all the existing compositors that have a video, so * there isn't an instance or "something" that lives outside the boudaries of a * given layer manager on the compositor thread except the image bridge and the * thread itself. */ namespace CompositableMap { void Create(); void Destroy(); - CompositableParent* Get(uint64_t aID); - void Set(uint64_t aID, CompositableParent* aParent); + PCompositableParent* Get(uint64_t aID); + void Set(uint64_t aID, PCompositableParent* aParent); void Erase(uint64_t aID); void Clear(); } // CompositableMap } // namespace } // namespace
--- a/gfx/layers/ipc/CompositableTransactionParent.cpp +++ b/gfx/layers/ipc/CompositableTransactionParent.cpp @@ -27,78 +27,73 @@ #include "nsRegion.h" // for nsIntRegion namespace mozilla { namespace layers { class ClientTiledLayerBuffer; class Compositor; -template<typename T> -CompositableHost* AsCompositable(const T& op) +template<typename Op> +CompositableHost* AsCompositable(const Op& op) { - return static_cast<CompositableParent*>(op.compositableParent())->GetCompositableHost(); + return CompositableHost::FromIPDLActor(op.compositableParent()); } // This function can in some cases fail and return false without it being a bug. // This can theoretically happen if the ImageBridge sends frames before // we created the layer tree. Since we can't enforce that the layer // tree is already created before ImageBridge operates, there isn't much // we can do about it, but in practice it is very rare. // Typically when a tab with a video is dragged from a window to another, // there can be a short time when the video is still sending frames // asynchonously while the layer tree is not reconstructed. It's not a // big deal. // Note that Layers transactions do not need to call this because they always // schedule the composition, in LayerManagerComposite::EndTransaction. template<typename T> bool ScheduleComposition(const T& op) { - CompositableParent* comp = static_cast<CompositableParent*>(op.compositableParent()); - if (!comp || !comp->GetCompositorID()) { + CompositableHost* comp = AsCompositable(op); + uint64_t id = comp->GetCompositorID(); + if (!comp || !id) { return false; } - CompositorParent* cp - = CompositorParent::GetCompositor(comp->GetCompositorID()); + CompositorParent* cp = CompositorParent::GetCompositor(id); if (!cp) { return false; } cp->ScheduleComposition(); return true; } bool CompositableParentManager::ReceiveCompositableUpdate(const CompositableOperation& aEdit, EditReplyVector& replyv) { switch (aEdit.type()) { case CompositableOperation::TOpCreatedIncrementalTexture: { MOZ_LAYERS_LOG(("[ParentSide] Created texture")); const OpCreatedIncrementalTexture& op = aEdit.get_OpCreatedIncrementalTexture(); - - CompositableParent* compositableParent = - static_cast<CompositableParent*>(op.compositableParent()); - CompositableHost* compositable = compositableParent->GetCompositableHost(); + CompositableHost* compositable = AsCompositable(op); bool success = - compositable->CreatedIncrementalTexture(compositableParent->GetCompositableManager(), + compositable->CreatedIncrementalTexture(this, op.textureInfo(), op.bufferRect()); if (!success) { return false; } break; } case CompositableOperation::TOpPaintTextureRegion: { MOZ_LAYERS_LOG(("[ParentSide] Paint ThebesLayer")); const OpPaintTextureRegion& op = aEdit.get_OpPaintTextureRegion(); - CompositableParent* compositableParent = static_cast<CompositableParent*>(op.compositableParent()); - CompositableHost* compositable = - compositableParent->GetCompositableHost(); + CompositableHost* compositable = AsCompositable(op); Layer* layer = compositable->GetLayer(); if (!layer || layer->GetType() != Layer::TYPE_THEBES) { return false; } ThebesLayerComposite* thebes = static_cast<ThebesLayerComposite*>(layer); const ThebesBufferData& bufferData = op.bufferData(); @@ -108,55 +103,50 @@ CompositableParentManager::ReceiveCompos if (!compositable->UpdateThebes(bufferData, op.updatedRegion(), thebes->GetValidRegion(), &frontUpdatedRegion)) { return false; } replyv.push_back( - OpContentBufferSwap(compositableParent, nullptr, frontUpdatedRegion)); + OpContentBufferSwap(op.compositableParent(), nullptr, frontUpdatedRegion)); RenderTraceInvalidateEnd(thebes, "FF00FF"); // return texure data to client if necessary ReturnTextureDataIfNecessary(compositable, replyv, op.compositableParent()); break; } case CompositableOperation::TOpPaintTextureIncremental: { MOZ_LAYERS_LOG(("[ParentSide] Paint ThebesLayer")); const OpPaintTextureIncremental& op = aEdit.get_OpPaintTextureIncremental(); - CompositableParent* compositableParent = static_cast<CompositableParent*>(op.compositableParent()); - CompositableHost* compositable = - compositableParent->GetCompositableHost(); + CompositableHost* compositable = AsCompositable(op); SurfaceDescriptor desc = op.image(); compositable->UpdateIncremental(op.textureId(), desc, op.updatedRegion(), op.bufferRect(), op.bufferRotation()); break; } case CompositableOperation::TOpUpdatePictureRect: { const OpUpdatePictureRect& op = aEdit.get_OpUpdatePictureRect(); - CompositableHost* compositable - = static_cast<CompositableParent*>(op.compositableParent())->GetCompositableHost(); + CompositableHost* compositable = AsCompositable(op); MOZ_ASSERT(compositable); compositable->SetPictureRect(op.picture()); break; } case CompositableOperation::TOpUseTiledLayerBuffer: { MOZ_LAYERS_LOG(("[ParentSide] Paint TiledLayerBuffer")); const OpUseTiledLayerBuffer& op = aEdit.get_OpUseTiledLayerBuffer(); - CompositableParent* compositableParent = static_cast<CompositableParent*>(op.compositableParent()); - CompositableHost* compositable = - compositableParent->GetCompositableHost(); + CompositableHost* compositable = AsCompositable(op); TiledLayerComposer* tileComposer = compositable->AsTiledLayerComposer(); NS_ASSERTION(tileComposer, "compositable is not a tile composer"); const SurfaceDescriptorTiles& tileDesc = op.tileLayerDescriptor(); tileComposer->UseTiledLayerBuffer(this, tileDesc); break; }
--- a/gfx/layers/ipc/ImageBridgeParent.cpp +++ b/gfx/layers/ipc/ImageBridgeParent.cpp @@ -188,23 +188,22 @@ ImageBridgeParent::DeallocPGrallocBuffer } PCompositableParent* ImageBridgeParent::AllocPCompositableParent(const TextureInfo& aInfo, uint64_t* aID) { uint64_t id = GenImageContainerID(); *aID = id; - return new CompositableParent(this, aInfo, id); + return CompositableHost::CreateIPDLActor(this, aInfo, id); } bool ImageBridgeParent::DeallocPCompositableParent(PCompositableParent* aActor) { - delete aActor; - return true; + return CompositableHost::DestroyIPDLActor(aActor); } PTextureParent* ImageBridgeParent::AllocPTextureParent(const SurfaceDescriptor& aSharedData, const TextureFlags& aFlags) { return TextureHost::CreateIPDLActor(this, aSharedData, aFlags); }
--- a/gfx/layers/ipc/LayerTransactionParent.cpp +++ b/gfx/layers/ipc/LayerTransactionParent.cpp @@ -55,23 +55,16 @@ class PGrallocBufferParent; // Convenience accessors static ShadowLayerParent* cast(const PLayerParent* in) { return const_cast<ShadowLayerParent*>( static_cast<const ShadowLayerParent*>(in)); } -static CompositableParent* -cast(const PCompositableParent* in) -{ - return const_cast<CompositableParent*>( - static_cast<const CompositableParent*>(in)); -} - template<class OpCreateT> static ShadowLayerParent* AsLayerComposite(const OpCreateT& op) { return cast(op.layerParent()); } static ShadowLayerParent* @@ -503,34 +496,36 @@ LayerTransactionParent::RecvUpdate(const if (!ReceiveCompositableUpdate(edit.get_CompositableOperation(), replyv)) { return false; } break; } case Edit::TOpAttachCompositable: { const OpAttachCompositable& op = edit.get_OpAttachCompositable(); - if (!Attach(cast(op.layerParent()), cast(op.compositableParent()), false)) { + CompositableHost* host = CompositableHost::FromIPDLActor(op.compositableParent()); + if (!Attach(cast(op.layerParent()), host, false)) { return false; } - cast(op.compositableParent())->SetCompositorID( - mLayerManager->GetCompositor()->GetCompositorID()); + host->SetCompositorID(mLayerManager->GetCompositor()->GetCompositorID()); break; } case Edit::TOpAttachAsyncCompositable: { const OpAttachAsyncCompositable& op = edit.get_OpAttachAsyncCompositable(); - CompositableParent* compositableParent = CompositableMap::Get(op.containerID()); + PCompositableParent* compositableParent = CompositableMap::Get(op.containerID()); if (!compositableParent) { NS_ERROR("CompositableParent not found in the map"); return false; } - if (!Attach(cast(op.layerParent()), compositableParent, true)) { + CompositableHost* host = CompositableHost::FromIPDLActor(compositableParent); + if (!Attach(cast(op.layerParent()), host, true)) { return false; } - compositableParent->SetCompositorID(mLayerManager->GetCompositor()->GetCompositorID()); + + host->SetCompositorID(mLayerManager->GetCompositor()->GetCompositorID()); break; } default: NS_RUNTIMEABORT("not reached"); } } { @@ -689,46 +684,45 @@ LayerTransactionParent::RecvSetAsyncScro return false; } controller->SetTestAsyncScrollOffset(CSSPoint(aX, aY)); return true; } bool LayerTransactionParent::Attach(ShadowLayerParent* aLayerParent, - CompositableParent* aCompositable, - bool aIsAsyncVideo) + CompositableHost* aCompositable, + bool aIsAsync) { + if (!aCompositable) { + return false; + } + Layer* baselayer = aLayerParent->AsLayer(); if (!baselayer) { return false; } LayerComposite* layer = baselayer->AsLayerComposite(); if (!layer) { return false; } Compositor* compositor = static_cast<LayerManagerComposite*>(aLayerParent->AsLayer()->Manager())->GetCompositor(); - CompositableHost* compositable = aCompositable->GetCompositableHost(); - if (!compositable) { - return false; - } - if (!layer->SetCompositableHost(compositable)) { + if (!layer->SetCompositableHost(aCompositable)) { // not all layer types accept a compositable, see bug 967824 return false; } - compositable->Attach(aLayerParent->AsLayer(), - compositor, - aIsAsyncVideo - ? CompositableHost::ALLOW_REATTACH - | CompositableHost::KEEP_ATTACHED - : CompositableHost::NO_FLAGS); - + aCompositable->Attach(aLayerParent->AsLayer(), + compositor, + aIsAsync + ? CompositableHost::ALLOW_REATTACH + | CompositableHost::KEEP_ATTACHED + : CompositableHost::NO_FLAGS); return true; } bool LayerTransactionParent::RecvClearCachedResources() { if (mRoot) { // NB: |mRoot| here is the *child* context's root. In this parent @@ -784,24 +778,23 @@ LayerTransactionParent::DeallocPLayerPar { delete actor; return true; } PCompositableParent* LayerTransactionParent::AllocPCompositableParent(const TextureInfo& aInfo) { - return new CompositableParent(this, aInfo); + return CompositableHost::CreateIPDLActor(this, aInfo, 0); } bool -LayerTransactionParent::DeallocPCompositableParent(PCompositableParent* actor) +LayerTransactionParent::DeallocPCompositableParent(PCompositableParent* aActor) { - delete actor; - return true; + return CompositableHost::DestroyIPDLActor(aActor); } PTextureParent* LayerTransactionParent::AllocPTextureParent(const SurfaceDescriptor& aSharedData, const TextureFlags& aFlags) { return TextureHost::CreateIPDLActor(this, aSharedData, aFlags); }
--- a/gfx/layers/ipc/LayerTransactionParent.h +++ b/gfx/layers/ipc/LayerTransactionParent.h @@ -116,17 +116,17 @@ protected: virtual PCompositableParent* AllocPCompositableParent(const TextureInfo& aInfo) MOZ_OVERRIDE; virtual bool DeallocPCompositableParent(PCompositableParent* actor) MOZ_OVERRIDE; virtual PTextureParent* AllocPTextureParent(const SurfaceDescriptor& aSharedData, const TextureFlags& aFlags) MOZ_OVERRIDE; virtual bool DeallocPTextureParent(PTextureParent* actor) MOZ_OVERRIDE; bool Attach(ShadowLayerParent* aLayerParent, - CompositableParent* aCompositable, + CompositableHost* aCompositable, bool aIsAsyncVideo); void AddIPDLReference() { MOZ_ASSERT(mIPCOpen == false); mIPCOpen = true; AddRef(); } void ReleaseIPDLReference() {