зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
ade3807eea
Коммит
bdb02a828a
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче