Bug 1343754 - Add a function for replacing event target for actor and label PTexture; r=bevistseng,billm,nical

MozReview-Commit-ID: KGVBWsexkqC

--HG--
extra : rebase_source : 5ac2edced51462fd013f0efba0e434d6a2fc7863
This commit is contained in:
Kevin Chen 2017-03-21 03:57:56 +00:00
Родитель ade3807eea
Коммит bdb02a828a
15 изменённых файлов: 114 добавлений и 22 удалений

Просмотреть файл

@ -881,6 +881,13 @@ TextureClient::InitIPDLActor(CompositableForwarder* aForwarder)
gfxCriticalError() << "Attempt to move a texture to different compositor backend.";
return false;
}
if (ShadowLayerForwarder* forwarder = aForwarder->AsLayerForwarder()) {
// Do the DOM labeling.
if (nsIEventTarget* target = forwarder->GetEventTarget()) {
forwarder->GetCompositorBridgeChild()->ReplaceEventTargetForActor(
mActor, target);
}
}
mActor->mCompositableForwarder = aForwarder;
}
return true;
@ -895,12 +902,20 @@ TextureClient::InitIPDLActor(CompositableForwarder* aForwarder)
// Try external image id allocation.
mExternalImageId = aForwarder->GetTextureForwarder()->GetNextExternalImageId();
nsIEventTarget* target = nullptr;
// Get the layers id if the forwarder is a ShadowLayerForwarder.
if (ShadowLayerForwarder* forwarder = aForwarder->AsLayerForwarder()) {
target = forwarder->GetEventTarget();
}
PTextureChild* actor = aForwarder->GetTextureForwarder()->CreateTexture(
desc,
aForwarder->GetCompositorBackendType(),
GetFlags(),
mSerial,
mExternalImageId);
mExternalImageId,
target);
if (!actor) {
gfxCriticalNote << static_cast<int32_t>(desc.type()) << ", "
<< static_cast<int32_t>(aForwarder->GetCompositorBackendType()) << ", "

Просмотреть файл

@ -116,6 +116,8 @@ public:
static uint32_t GetMaxFileDescriptorsPerMessage();
virtual ShadowLayerForwarder* AsLayerForwarder() { return nullptr; }
protected:
nsTArray<RefPtr<TextureClient> > mTexturesToRemove;
nsTArray<RefPtr<CompositableClient>> mCompositableClientsToRemove;

Просмотреть файл

@ -19,6 +19,7 @@
#include "mozilla/layers/APZCTreeManagerChild.h"
#include "mozilla/layers/LayerTransactionChild.h"
#include "mozilla/layers/PLayerTransactionChild.h"
#include "mozilla/layers/PTextureChild.h"
#include "mozilla/layers/TextureClient.h"// for TextureClient
#include "mozilla/layers/TextureClientPool.h"// for TextureClientPool
#include "mozilla/layers/WebRenderBridgeChild.h"
@ -1051,15 +1052,24 @@ CompositorBridgeChild::GetTileLockAllocator()
return mSectionAllocator;
}
PTextureChild*
CompositorBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData,
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId)
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget)
{
return PCompositorBridgeChild::SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, 0 /* FIXME? */, aSerial, aExternalImageId);
PTextureChild* textureChild = AllocPTextureChild(
aSharedData, aLayersBackend, aFlags, 0 /* FIXME */, aSerial, aExternalImageId);
// Do the DOM labeling.
if (aTarget) {
SetEventTargetForActor(textureChild, aTarget);
}
return SendPTextureConstructor(
textureChild, aSharedData, aLayersBackend, aFlags, 0 /* FIXME? */, aSerial, aExternalImageId);
}
bool

Просмотреть файл

@ -134,7 +134,8 @@ public:
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId) override;
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget) override;
virtual void HandleFatalError(const char* aName, const char* aMsg) const override;

Просмотреть файл

@ -1046,7 +1046,8 @@ ImageBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData,
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId)
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget)
{
MOZ_ASSERT(CanSend());
return SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, aSerial, aExternalImageId);

Просмотреть файл

@ -328,11 +328,13 @@ public:
*/
virtual bool DeallocShmem(mozilla::ipc::Shmem& aShmem) override;
virtual PTextureChild* CreateTexture(const SurfaceDescriptor& aSharedData,
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId) override;
virtual PTextureChild* CreateTexture(
const SurfaceDescriptor& aSharedData,
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget = nullptr) override;
virtual bool IsSameProcess() const override;

Просмотреть файл

@ -395,6 +395,8 @@ public:
return mPaintTiming;
}
ShadowLayerForwarder* AsLayerForwarder() override { return this; }
// Returns true if aSurface wraps a Shmem.
static bool IsShmem(SurfaceDescriptor* aSurface);
@ -412,6 +414,11 @@ public:
LayersIPCActor* GetLayersIPCActor() override { return this; }
ActiveResourceTracker& GetActiveResourceTracker() { return *mActiveResourceTracker.get(); }
CompositorBridgeChild* GetCompositorBridgeChild();
nsIEventTarget* GetEventTarget() { return mEventTarget; };
protected:
virtual ~ShadowLayerForwarder();
@ -427,8 +434,6 @@ protected:
bool InWorkerThread();
CompositorBridgeChild* GetCompositorBridgeChild();
RefPtr<LayerTransactionChild> mShadowManager;
RefPtr<CompositorBridgeChild> mCompositorBridgeChild;

Просмотреть файл

@ -72,7 +72,8 @@ public:
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId) = 0;
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget = nullptr) = 0;
};
} // namespace layers

Просмотреть файл

@ -108,7 +108,8 @@ VideoBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData,
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId)
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget)
{
MOZ_ASSERT(CanSend());
return SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, aSerial);

Просмотреть файл

@ -49,7 +49,8 @@ public:
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId) override;
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget = nullptr) override;
// ClientIPCAllocator
base::ProcessId GetParentPid() const override { return OtherPid(); }

Просмотреть файл

@ -353,7 +353,8 @@ VRManagerChild::CreateTexture(const SurfaceDescriptor& aSharedData,
LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId)
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget)
{
return SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, aSerial);
}

Просмотреть файл

@ -64,11 +64,13 @@ public:
static bool IsCreated();
virtual PTextureChild* CreateTexture(const SurfaceDescriptor& aSharedData,
layers::LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId) override;
virtual PTextureChild* CreateTexture(
const SurfaceDescriptor& aSharedData,
layers::LayersBackend aLayersBackend,
TextureFlags aFlags,
uint64_t aSerial,
wr::MaybeExternalImageId& aExternalImageId,
nsIEventTarget* aTarget = nullptr) override;
virtual void CancelWaitForRecycle(uint64_t aTextureId) override;
PVRLayerChild* CreateVRLayer(uint32_t aDisplayID,

Просмотреть файл

@ -77,6 +77,11 @@ class IDMap {
}
}
void ReplaceWithID(const T& data, int32_t id) {
DCHECK(data_.find(id) != data_.end()) << "item doesn't exist";
data_[id] = data;
}
bool IsEmpty() const {
return data_.empty();
}

Просмотреть файл

@ -546,6 +546,16 @@ IProtocol::SetEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarge
SetEventTargetForActorInternal(aActor, aEventTarget);
}
void
IProtocol::ReplaceEventTargetForActor(IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
// Ensure the actor has been registered.
MOZ_ASSERT(aActor->Manager());
Manager()->ReplaceEventTargetForActorInternal(aActor, aEventTarget);
}
void
IProtocol::SetEventTargetForActorInternal(IProtocol* aActor,
nsIEventTarget* aEventTarget)
@ -553,6 +563,13 @@ IProtocol::SetEventTargetForActorInternal(IProtocol* aActor,
Manager()->SetEventTargetForActorInternal(aActor, aEventTarget);
}
void
IProtocol::ReplaceEventTargetForActorInternal(IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
Manager()->ReplaceEventTargetForActorInternal(aActor, aEventTarget);
}
nsIEventTarget*
IProtocol::GetActorEventTarget()
{
@ -876,5 +893,21 @@ IToplevelProtocol::SetEventTargetForActorInternal(IProtocol* aActor,
mEventTargetMap.AddWithID(aEventTarget, id);
}
void
IToplevelProtocol::ReplaceEventTargetForActorInternal(
IProtocol* aActor,
nsIEventTarget* aEventTarget)
{
// The EventTarget of a ToplevelProtocol shall never be set.
MOZ_RELEASE_ASSERT(aActor != this);
int32_t id = aActor->Id();
// The ID of the actor should have existed.
MOZ_RELEASE_ASSERT(id!= kNullActorId && id!= kFreedActorId);
MutexAutoLock lock(mEventTargetMutex);
mEventTargetMap.ReplaceWithID(aEventTarget, id);
}
} // namespace ipc
} // namespace mozilla

Просмотреть файл

@ -191,6 +191,12 @@ public:
// aActor.
void SetEventTargetForActor(IProtocol* aActor, nsIEventTarget* aEventTarget);
// Replace the event target for the messages of aActor. There must not be
// any messages of aActor in the task queue, or we might run into some
// unexpected behavior.
void ReplaceEventTargetForActor(IProtocol* aActor,
nsIEventTarget* aEventTarget);
// Returns the event target set by SetEventTargetForActor() if available.
virtual nsIEventTarget* GetActorEventTarget();
@ -202,6 +208,9 @@ protected:
void SetIPCChannel(MessageChannel* aChannel) { mChannel = aChannel; }
virtual void SetEventTargetForActorInternal(IProtocol* aActor, nsIEventTarget* aEventTarget);
virtual void ReplaceEventTargetForActorInternal(
IProtocol* aActor,
nsIEventTarget* aEventTarget);
virtual already_AddRefed<nsIEventTarget>
GetActorEventTargetInternal(IProtocol* aActor);
@ -388,6 +397,9 @@ protected:
GetSpecificMessageEventTarget(const Message& aMsg) { return nullptr; }
virtual void SetEventTargetForActorInternal(IProtocol* aActor, nsIEventTarget* aEventTarget);
virtual void ReplaceEventTargetForActorInternal(
IProtocol* aActor,
nsIEventTarget* aEventTarget);
virtual already_AddRefed<nsIEventTarget>
GetActorEventTargetInternal(IProtocol* aActor);