From 8305f0b97eb959bc870005bf81a6846a012cf302 Mon Sep 17 00:00:00 2001 From: sotaro Date: Thu, 20 Apr 2017 10:24:13 +0900 Subject: [PATCH] Bug 1356944 - Fix external image id allocation of WebRenderTextureHost r=nical --- gfx/layers/client/TextureClient.cpp | 12 +++++++++-- gfx/layers/client/TextureClient.h | 8 ++++++++ gfx/layers/composite/TextureHost.cpp | 20 ++++++++++++------- gfx/layers/composite/TextureHost.h | 7 +++++-- gfx/layers/ipc/CompositorBridgeChild.cpp | 12 ++++++----- gfx/layers/ipc/CompositorBridgeChild.h | 8 +++++--- gfx/layers/ipc/CompositorBridgeParent.cpp | 5 +++-- gfx/layers/ipc/CompositorBridgeParent.h | 3 ++- .../CrossProcessCompositorBridgeParent.cpp | 5 +++-- .../ipc/CrossProcessCompositorBridgeParent.h | 3 ++- gfx/layers/ipc/ImageBridgeChild.cpp | 12 ++++++----- gfx/layers/ipc/ImageBridgeChild.h | 11 +++++++--- gfx/layers/ipc/ImageBridgeParent.cpp | 5 +++-- gfx/layers/ipc/ImageBridgeParent.h | 3 ++- gfx/layers/ipc/PCompositorBridge.ipdl | 4 +++- gfx/layers/ipc/PImageBridge.ipdl | 4 +++- gfx/layers/ipc/TextureForwarder.h | 5 ++++- gfx/layers/ipc/VideoBridgeChild.cpp | 3 ++- gfx/layers/ipc/VideoBridgeChild.h | 3 ++- gfx/layers/ipc/VideoBridgeParent.cpp | 2 +- gfx/layers/wr/WebRenderBridgeChild.cpp | 4 +++- gfx/layers/wr/WebRenderCanvasLayer.h | 2 +- gfx/layers/wr/WebRenderDisplayItemLayer.h | 2 +- gfx/layers/wr/WebRenderImageLayer.h | 2 +- gfx/layers/wr/WebRenderPaintedLayer.h | 2 +- gfx/layers/wr/WebRenderTextureHost.cpp | 7 +++---- gfx/layers/wr/WebRenderTextureHost.h | 5 ++--- gfx/tests/gtest/TextureHelper.h | 3 ++- gfx/vr/ipc/VRManagerChild.cpp | 3 ++- gfx/vr/ipc/VRManagerChild.h | 3 ++- gfx/vr/ipc/VRManagerParent.cpp | 2 +- gfx/webrender_bindings/WebRenderTypes.h | 2 ++ 32 files changed, 114 insertions(+), 58 deletions(-) diff --git a/gfx/layers/client/TextureClient.cpp b/gfx/layers/client/TextureClient.cpp index 59ddbf990bba..321753e15156 100644 --- a/gfx/layers/client/TextureClient.cpp +++ b/gfx/layers/client/TextureClient.cpp @@ -891,11 +891,15 @@ TextureClient::InitIPDLActor(CompositableForwarder* aForwarder) return false; } + // Try external image id allocation. + mExternalImageId = aForwarder->GetTextureForwarder()->GetNextExternalImageId(); + PTextureChild* actor = aForwarder->GetTextureForwarder()->CreateTexture( desc, aForwarder->GetCompositorBackendType(), GetFlags(), - mSerial); + mSerial, + mExternalImageId); if (!actor) { gfxCriticalNote << static_cast(desc.type()) << ", " << static_cast(aForwarder->GetCompositorBackendType()) << ", " @@ -947,11 +951,15 @@ TextureClient::InitIPDLActor(KnowsCompositor* aForwarder) return false; } + // Try external image id allocation. + mExternalImageId = aForwarder->GetTextureForwarder()->GetNextExternalImageId(); + PTextureChild* actor = fwd->CreateTexture( desc, aForwarder->GetCompositorBackendType(), GetFlags(), - mSerial); + mSerial, + mExternalImageId); if (!actor) { gfxCriticalNote << static_cast(desc.type()) << ", " << static_cast(aForwarder->GetCompositorBackendType()) << ", " diff --git a/gfx/layers/client/TextureClient.h b/gfx/layers/client/TextureClient.h index 656772e45379..edea3e076204 100644 --- a/gfx/layers/client/TextureClient.h +++ b/gfx/layers/client/TextureClient.h @@ -25,6 +25,7 @@ #include "mozilla/layers/LayersSurfaces.h" // for SurfaceDescriptor #include "mozilla/mozalloc.h" // for operator delete #include "mozilla/gfx/CriticalSection.h" +#include "mozilla/webrender/WebRenderTypes.h" #include "nsCOMPtr.h" // for already_AddRefed #include "nsISupportsImpl.h" // for TextureImage::AddRef, etc #include "GfxTexturesReporter.h" @@ -746,6 +747,13 @@ protected: // Serial id of TextureClient. It is unique in current process. const uint64_t mSerial; + + // External image id. It is unique if it is allocated. + // The id is allocated in TextureClient::InitIPDLActor(). + // Its allocation is supported by + // CompositorBridgeChild and ImageBridgeChild for now. + wr::MaybeExternalImageId mExternalImageId; + // Used to assign serial ids of TextureClient. static mozilla::Atomic sSerialCounter; diff --git a/gfx/layers/composite/TextureHost.cpp b/gfx/layers/composite/TextureHost.cpp index 7c59c5c2fa21..50a43caf8a58 100644 --- a/gfx/layers/composite/TextureHost.cpp +++ b/gfx/layers/composite/TextureHost.cpp @@ -65,7 +65,7 @@ namespace layers { class TextureParent : public ParentActor { public: - explicit TextureParent(HostIPCAllocator* aAllocator, uint64_t aSerial); + explicit TextureParent(HostIPCAllocator* aAllocator, uint64_t aSerial, const wr::MaybeExternalImageId& aExternalImageId); ~TextureParent(); @@ -87,6 +87,7 @@ public: RefPtr mTextureHost; // mSerial is unique in TextureClient's process. const uint64_t mSerial; + wr::MaybeExternalImageId mExternalImageId; }; static bool @@ -109,7 +110,8 @@ TextureHost::CreateIPDLActor(HostIPCAllocator* aAllocator, const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) + uint64_t aSerial, + const wr::MaybeExternalImageId& aExternalImageId) { if (aSharedData.type() == SurfaceDescriptor::TSurfaceDescriptorBuffer && aSharedData.get_SurfaceDescriptorBuffer().data().type() == MemoryOrShmem::Tuintptr_t && @@ -118,7 +120,7 @@ TextureHost::CreateIPDLActor(HostIPCAllocator* aAllocator, NS_ERROR("A client process is trying to peek at our address space using a MemoryTexture!"); return nullptr; } - TextureParent* actor = new TextureParent(aAllocator, aSerial); + TextureParent* actor = new TextureParent(aAllocator, aSerial, aExternalImageId); if (!actor->Init(aSharedData, aLayersBackend, aFlags)) { delete actor; return nullptr; @@ -196,7 +198,8 @@ already_AddRefed TextureHost::Create(const SurfaceDescriptor& aDesc, ISurfaceAllocator* aDeallocator, LayersBackend aBackend, - TextureFlags aFlags) + TextureFlags aFlags, + wr::MaybeExternalImageId& aExternalImageId) { RefPtr result; @@ -243,7 +246,8 @@ TextureHost::Create(const SurfaceDescriptor& aDesc, } if (WrapWithWebRenderTextureHost(aDeallocator, aBackend, aFlags)) { - result = new WebRenderTextureHost(aDesc, aFlags, result); + MOZ_ASSERT(aExternalImageId.isSome()); + result = new WebRenderTextureHost(aDesc, aFlags, result, aExternalImageId.ref()); } return result.forget(); @@ -1080,9 +1084,10 @@ size_t MemoryTextureHost::GetBufferSize() return std::numeric_limits::max(); } -TextureParent::TextureParent(HostIPCAllocator* aSurfaceAllocator, uint64_t aSerial) +TextureParent::TextureParent(HostIPCAllocator* aSurfaceAllocator, uint64_t aSerial, const wr::MaybeExternalImageId& aExternalImageId) : mSurfaceAllocator(aSurfaceAllocator) , mSerial(aSerial) +, mExternalImageId(aExternalImageId) { MOZ_COUNT_CTOR(TextureParent); } @@ -1109,7 +1114,8 @@ TextureParent::Init(const SurfaceDescriptor& aSharedData, mTextureHost = TextureHost::Create(aSharedData, mSurfaceAllocator, aBackend, - aFlags); + aFlags, + mExternalImageId); if (mTextureHost) { mTextureHost->mActor = this; } diff --git a/gfx/layers/composite/TextureHost.h b/gfx/layers/composite/TextureHost.h index b58a42b86dc0..85a140898352 100644 --- a/gfx/layers/composite/TextureHost.h +++ b/gfx/layers/composite/TextureHost.h @@ -21,6 +21,7 @@ #include "mozilla/layers/LayersSurfaces.h" #include "mozilla/mozalloc.h" // for operator delete #include "mozilla/UniquePtr.h" // for UniquePtr +#include "mozilla/webrender/WebRenderTypes.h" #include "nsCOMPtr.h" // for already_AddRefed #include "nsDebug.h" // for NS_RUNTIMEABORT #include "nsISupportsImpl.h" // for MOZ_COUNT_CTOR, etc @@ -386,7 +387,8 @@ public: const SurfaceDescriptor& aDesc, ISurfaceAllocator* aDeallocator, LayersBackend aBackend, - TextureFlags aFlags); + TextureFlags aFlags, + wr::MaybeExternalImageId& aExternalImageId); /** * Lock the texture host for compositing. @@ -519,7 +521,8 @@ public: const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial); + uint64_t aSerial, + const wr::MaybeExternalImageId& aExternalImageId); static bool DestroyIPDLActor(PTextureParent* actor); /** diff --git a/gfx/layers/ipc/CompositorBridgeChild.cpp b/gfx/layers/ipc/CompositorBridgeChild.cpp index aaca704211e2..aeb581fdd5e3 100644 --- a/gfx/layers/ipc/CompositorBridgeChild.cpp +++ b/gfx/layers/ipc/CompositorBridgeChild.cpp @@ -885,7 +885,8 @@ CompositorBridgeChild::AllocPTextureChild(const SurfaceDescriptor&, const LayersBackend&, const TextureFlags&, const uint64_t&, - const uint64_t& aSerial) + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) { return TextureClient::CreateIPDLActor(); } @@ -1055,9 +1056,10 @@ PTextureChild* CompositorBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) { - return PCompositorBridgeChild::SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, 0 /* FIXME? */, aSerial); + return PCompositorBridgeChild::SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, 0 /* FIXME? */, aSerial, aExternalImageId); } bool @@ -1185,7 +1187,7 @@ CompositorBridgeChild::DeallocPWebRenderBridgeChild(PWebRenderBridgeChild* aActo return true; } -wr::ExternalImageId +wr::MaybeExternalImageId CompositorBridgeChild::GetNextExternalImageId() { static uint32_t sNextID = 1; @@ -1194,7 +1196,7 @@ CompositorBridgeChild::GetNextExternalImageId() uint64_t imageId = mNamespace; imageId = imageId << 32 | sNextID; - return wr::ToExternalImageId(imageId); + return Some(wr::ToExternalImageId(imageId)); } } // namespace layers diff --git a/gfx/layers/ipc/CompositorBridgeChild.h b/gfx/layers/ipc/CompositorBridgeChild.h index 8a78727d6443..fccd14a3e2a1 100644 --- a/gfx/layers/ipc/CompositorBridgeChild.h +++ b/gfx/layers/ipc/CompositorBridgeChild.h @@ -123,7 +123,8 @@ public: const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aId, - const uint64_t& aSerial) override; + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) override; virtual bool DeallocPTextureChild(PTextureChild* actor) override; @@ -132,7 +133,8 @@ public: virtual PTextureChild* CreateTexture(const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) override; + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) override; virtual void HandleFatalError(const char* aName, const char* aMsg) const override; @@ -235,7 +237,7 @@ public: return mDeviceResetSequenceNumber; } - wr::ExternalImageId GetNextExternalImageId(); + wr::MaybeExternalImageId GetNextExternalImageId() override; private: // Private destructor, to discourage deletion outside of Release(): diff --git a/gfx/layers/ipc/CompositorBridgeParent.cpp b/gfx/layers/ipc/CompositorBridgeParent.cpp index d6a60f4f0c8d..25d0999f1bed 100644 --- a/gfx/layers/ipc/CompositorBridgeParent.cpp +++ b/gfx/layers/ipc/CompositorBridgeParent.cpp @@ -2111,9 +2111,10 @@ CompositorBridgeParent::AllocPTextureParent(const SurfaceDescriptor& aSharedData const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aId, - const uint64_t& aSerial) + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) { - return TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial); + return TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial, aExternalImageId); } bool diff --git a/gfx/layers/ipc/CompositorBridgeParent.h b/gfx/layers/ipc/CompositorBridgeParent.h index 32179a8856c4..02d93ea1ca68 100644 --- a/gfx/layers/ipc/CompositorBridgeParent.h +++ b/gfx/layers/ipc/CompositorBridgeParent.h @@ -249,7 +249,8 @@ public: const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aId, - const uint64_t& aSerial) override; + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) override; virtual bool DeallocPTextureParent(PTextureParent* actor) override; virtual bool IsSameProcess() const override; diff --git a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp index 40114e99606c..c7d87e51d05b 100644 --- a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp +++ b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.cpp @@ -509,7 +509,8 @@ CrossProcessCompositorBridgeParent::AllocPTextureParent(const SurfaceDescriptor& const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aId, - const uint64_t& aSerial) + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) { CompositorBridgeParent::LayerTreeState* state = nullptr; @@ -532,7 +533,7 @@ CrossProcessCompositorBridgeParent::AllocPTextureParent(const SurfaceDescriptor& gfxDevCrash(gfx::LogReason::PAllocTextureBackendMismatch) << "Texture backend is wrong"; } - return TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial); + return TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial, aExternalImageId); } bool diff --git a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.h b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.h index c18b60bbddd5..03a3a5437307 100644 --- a/gfx/layers/ipc/CrossProcessCompositorBridgeParent.h +++ b/gfx/layers/ipc/CrossProcessCompositorBridgeParent.h @@ -130,7 +130,8 @@ public: const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aId, - const uint64_t& aSerial) override; + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) override; virtual bool DeallocPTextureParent(PTextureParent* actor) override; diff --git a/gfx/layers/ipc/ImageBridgeChild.cpp b/gfx/layers/ipc/ImageBridgeChild.cpp index ce2735f5add0..365793b88db6 100644 --- a/gfx/layers/ipc/ImageBridgeChild.cpp +++ b/gfx/layers/ipc/ImageBridgeChild.cpp @@ -973,7 +973,8 @@ PTextureChild* ImageBridgeChild::AllocPTextureChild(const SurfaceDescriptor&, const LayersBackend&, const TextureFlags&, - const uint64_t& aSerial) + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) { MOZ_ASSERT(CanSend()); return TextureClient::CreateIPDLActor(); @@ -1044,10 +1045,11 @@ PTextureChild* ImageBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) { MOZ_ASSERT(CanSend()); - return SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, aSerial); + return SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, aSerial, aExternalImageId); } static bool @@ -1156,7 +1158,7 @@ ImageBridgeChild::HandleFatalError(const char* aName, const char* aMsg) const dom::ContentChild::FatalErrorIfNotUsingGPUProcess(aName, aMsg, OtherPid()); } -wr::ExternalImageId +wr::MaybeExternalImageId ImageBridgeChild::GetNextExternalImageId() { static uint32_t sNextID = 1; @@ -1165,7 +1167,7 @@ ImageBridgeChild::GetNextExternalImageId() uint64_t imageId = mNamespace; imageId = imageId << 32 | sNextID; - return wr::ToExternalImageId(imageId); + return Some(wr::ToExternalImageId(imageId)); } } // namespace layers diff --git a/gfx/layers/ipc/ImageBridgeChild.h b/gfx/layers/ipc/ImageBridgeChild.h index d5e86b28ec63..124d6be2c3da 100644 --- a/gfx/layers/ipc/ImageBridgeChild.h +++ b/gfx/layers/ipc/ImageBridgeChild.h @@ -170,7 +170,11 @@ public: virtual base::ProcessId GetParentPid() const override { return OtherPid(); } virtual PTextureChild* - AllocPTextureChild(const SurfaceDescriptor& aSharedData, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, const uint64_t& aSerial) override; + AllocPTextureChild(const SurfaceDescriptor& aSharedData, + const LayersBackend& aLayersBackend, + const TextureFlags& aFlags, + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) override; virtual bool DeallocPTextureChild(PTextureChild* actor) override; @@ -327,7 +331,8 @@ public: virtual PTextureChild* CreateTexture(const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) override; + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) override; virtual bool IsSameProcess() const override; @@ -340,7 +345,7 @@ public: virtual void HandleFatalError(const char* aName, const char* aMsg) const override; - wr::ExternalImageId GetNextExternalImageId(); + virtual wr::MaybeExternalImageId GetNextExternalImageId() override; protected: explicit ImageBridgeChild(uint32_t aNamespace); diff --git a/gfx/layers/ipc/ImageBridgeParent.cpp b/gfx/layers/ipc/ImageBridgeParent.cpp index a419cdfb4db8..7138a17237c7 100644 --- a/gfx/layers/ipc/ImageBridgeParent.cpp +++ b/gfx/layers/ipc/ImageBridgeParent.cpp @@ -245,9 +245,10 @@ PTextureParent* ImageBridgeParent::AllocPTextureParent(const SurfaceDescriptor& aSharedData, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const uint64_t& aSerial) + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) { - return TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial); + return TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial, aExternalImageId); } bool diff --git a/gfx/layers/ipc/ImageBridgeParent.h b/gfx/layers/ipc/ImageBridgeParent.h index 1067a9d1285c..640b9ecb9e4a 100644 --- a/gfx/layers/ipc/ImageBridgeParent.h +++ b/gfx/layers/ipc/ImageBridgeParent.h @@ -77,7 +77,8 @@ public: virtual PTextureParent* AllocPTextureParent(const SurfaceDescriptor& aSharedData, const LayersBackend& aLayersBackend, const TextureFlags& aFlags, - const uint64_t& aSerial) override; + const uint64_t& aSerial, + const wr::MaybeExternalImageId& aExternalImageId) override; virtual bool DeallocPTextureParent(PTextureParent* actor) override; virtual mozilla::ipc::IPCResult RecvNewCompositable(const CompositableHandle& aHandle, diff --git a/gfx/layers/ipc/PCompositorBridge.ipdl b/gfx/layers/ipc/PCompositorBridge.ipdl index b32a3c99b215..19c62aa7bf8c 100644 --- a/gfx/layers/ipc/PCompositorBridge.ipdl +++ b/gfx/layers/ipc/PCompositorBridge.ipdl @@ -16,6 +16,7 @@ include protocol PLayerTransaction; include protocol PTexture; include protocol PWebRenderBridge; include "mozilla/GfxMessageUtils.h"; +include "mozilla/layers/WebRenderMessageUtils.h"; using struct mozilla::null_t from "ipc/IPCMessageUtils.h"; using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h"; @@ -37,6 +38,7 @@ using mozilla::layers::TextureFlags from "mozilla/layers/CompositorTypes.h"; using mozilla::layers::CompositorOptions from "mozilla/layers/CompositorOptions.h"; using mozilla::wr::PipelineId from "mozilla/webrender/WebRenderTypes.h"; using base::ProcessId from "base/process.h"; +using mozilla::wr::MaybeExternalImageId from "mozilla/webrender/WebRenderTypes.h"; namespace mozilla { namespace layers { @@ -245,7 +247,7 @@ parent: */ async AllPluginsCaptured(); - async PTexture(SurfaceDescriptor aSharedData, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t id, uint64_t aSerial); + async PTexture(SurfaceDescriptor aSharedData, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t id, uint64_t aSerial, MaybeExternalImageId aExternalImageId); sync SyncWithCompositor(); diff --git a/gfx/layers/ipc/PImageBridge.ipdl b/gfx/layers/ipc/PImageBridge.ipdl index a66713425218..819439675100 100644 --- a/gfx/layers/ipc/PImageBridge.ipdl +++ b/gfx/layers/ipc/PImageBridge.ipdl @@ -10,10 +10,12 @@ include ProtocolTypes; include protocol PMediaSystemResourceManager; include "mozilla/GfxMessageUtils.h"; +include "mozilla/layers/WebRenderMessageUtils.h"; using struct mozilla::layers::TextureInfo from "mozilla/layers/CompositorTypes.h"; using mozilla::layers::TextureFlags from "mozilla/layers/CompositorTypes.h"; using mozilla::layers::CompositableHandle from "mozilla/layers/LayersTypes.h"; +using mozilla::wr::MaybeExternalImageId from "mozilla/webrender/WebRenderTypes.h"; using PlatformThreadId from "base/platform_thread.h"; @@ -54,7 +56,7 @@ parent: // before sending closing the channel. sync WillClose(); - async PTexture(SurfaceDescriptor aSharedData, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t aSerial); + async PTexture(SurfaceDescriptor aSharedData, LayersBackend aBackend, TextureFlags aTextureFlags, uint64_t aSerial, MaybeExternalImageId aExternalImageId); async PMediaSystemResourceManager(); sync NewCompositable(CompositableHandle aHandle, TextureInfo aInfo); diff --git a/gfx/layers/ipc/TextureForwarder.h b/gfx/layers/ipc/TextureForwarder.h index b9036937c913..6ae4c5969b50 100644 --- a/gfx/layers/ipc/TextureForwarder.h +++ b/gfx/layers/ipc/TextureForwarder.h @@ -51,6 +51,8 @@ public: virtual void CancelWaitForRecycle(uint64_t aTextureId) = 0; + virtual wr::MaybeExternalImageId GetNextExternalImageId() { return Nothing(); } + protected: virtual ~LayersIPCChannel() {} }; @@ -69,7 +71,8 @@ public: const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) = 0; + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) = 0; }; } // namespace layers diff --git a/gfx/layers/ipc/VideoBridgeChild.cpp b/gfx/layers/ipc/VideoBridgeChild.cpp index 9651c563e091..1818a168bc18 100644 --- a/gfx/layers/ipc/VideoBridgeChild.cpp +++ b/gfx/layers/ipc/VideoBridgeChild.cpp @@ -107,7 +107,8 @@ PTextureChild* VideoBridgeChild::CreateTexture(const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) { MOZ_ASSERT(CanSend()); return SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, aSerial); diff --git a/gfx/layers/ipc/VideoBridgeChild.h b/gfx/layers/ipc/VideoBridgeChild.h index f5677008e486..19f8bdbca580 100644 --- a/gfx/layers/ipc/VideoBridgeChild.h +++ b/gfx/layers/ipc/VideoBridgeChild.h @@ -48,7 +48,8 @@ public: PTextureChild* CreateTexture(const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) override; + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) override; // ClientIPCAllocator base::ProcessId GetParentPid() const override { return OtherPid(); } diff --git a/gfx/layers/ipc/VideoBridgeParent.cpp b/gfx/layers/ipc/VideoBridgeParent.cpp index f8e3c5314c3a..94c67c6e2ea8 100644 --- a/gfx/layers/ipc/VideoBridgeParent.cpp +++ b/gfx/layers/ipc/VideoBridgeParent.cpp @@ -60,7 +60,7 @@ VideoBridgeParent::AllocPTextureParent(const SurfaceDescriptor& aSharedData, const uint64_t& aSerial) { PTextureParent* parent = - TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial); + TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial, Nothing()); mTextureMap[aSerial] = parent; return parent; } diff --git a/gfx/layers/wr/WebRenderBridgeChild.cpp b/gfx/layers/wr/WebRenderBridgeChild.cpp index 4d31ac2ee3f1..5069fdf6f5d4 100644 --- a/gfx/layers/wr/WebRenderBridgeChild.cpp +++ b/gfx/layers/wr/WebRenderBridgeChild.cpp @@ -115,7 +115,9 @@ WebRenderBridgeChild::DPEnd(wr::DisplayListBuilder &aBuilder, const gfx::IntSize wr::ExternalImageId WebRenderBridgeChild::GetNextExternalImageId() { - return GetCompositorBridgeChild()->GetNextExternalImageId(); + wr::MaybeExternalImageId id = GetCompositorBridgeChild()->GetNextExternalImageId(); + MOZ_RELEASE_ASSERT(id.isSome()); + return id.value(); } wr::ExternalImageId diff --git a/gfx/layers/wr/WebRenderCanvasLayer.h b/gfx/layers/wr/WebRenderCanvasLayer.h index 330ee3a0a6a9..caceae68f7fb 100644 --- a/gfx/layers/wr/WebRenderCanvasLayer.h +++ b/gfx/layers/wr/WebRenderCanvasLayer.h @@ -44,7 +44,7 @@ public: void RenderLayer(wr::DisplayListBuilder& aBuilder) override; protected: - Maybe mExternalImageId; + wr::MaybeExternalImageId mExternalImageId; }; } // namespace layers diff --git a/gfx/layers/wr/WebRenderDisplayItemLayer.h b/gfx/layers/wr/WebRenderDisplayItemLayer.h index a30d607ffa6b..06e762562a23 100644 --- a/gfx/layers/wr/WebRenderDisplayItemLayer.h +++ b/gfx/layers/wr/WebRenderDisplayItemLayer.h @@ -42,7 +42,7 @@ private: nsTArray mParentCommands; RefPtr mImageClient; RefPtr mImageContainer; - Maybe mExternalImageId; + wr::MaybeExternalImageId mExternalImageId; Maybe mKey; }; diff --git a/gfx/layers/wr/WebRenderImageLayer.h b/gfx/layers/wr/WebRenderImageLayer.h index bd78284c5b82..13fc04f9522b 100644 --- a/gfx/layers/wr/WebRenderImageLayer.h +++ b/gfx/layers/wr/WebRenderImageLayer.h @@ -38,7 +38,7 @@ public: protected: CompositableType GetImageClientType(); - Maybe mExternalImageId; + wr::MaybeExternalImageId mExternalImageId; Maybe mKey; RefPtr mImageClient; CompositableType mImageClientTypeContainer; diff --git a/gfx/layers/wr/WebRenderPaintedLayer.h b/gfx/layers/wr/WebRenderPaintedLayer.h index 5bfd63d0f992..f2420f3e711f 100644 --- a/gfx/layers/wr/WebRenderPaintedLayer.h +++ b/gfx/layers/wr/WebRenderPaintedLayer.h @@ -40,7 +40,7 @@ protected: return static_cast(mManager); } - Maybe mExternalImageId; + wr::MaybeExternalImageId mExternalImageId; public: virtual void InvalidateRegion(const nsIntRegion& aRegion) override diff --git a/gfx/layers/wr/WebRenderTextureHost.cpp b/gfx/layers/wr/WebRenderTextureHost.cpp index 7ee422649be5..d6971e37892e 100644 --- a/gfx/layers/wr/WebRenderTextureHost.cpp +++ b/gfx/layers/wr/WebRenderTextureHost.cpp @@ -19,13 +19,12 @@ namespace mozilla { namespace layers { -uint64_t WebRenderTextureHost::sSerialCounter(0); - WebRenderTextureHost::WebRenderTextureHost(const SurfaceDescriptor& aDesc, TextureFlags aFlags, - TextureHost* aTexture) + TextureHost* aTexture, + wr::ExternalImageId& aExternalImageId) : TextureHost(aFlags) - , mExternalImageId(wr::ToExternalImageId(++sSerialCounter)) + , mExternalImageId(aExternalImageId) , mIsWrappingNativeHandle(false) { MOZ_COUNT_CTOR(WebRenderTextureHost); diff --git a/gfx/layers/wr/WebRenderTextureHost.h b/gfx/layers/wr/WebRenderTextureHost.h index 4eaa5a4867ac..5e676deb388d 100644 --- a/gfx/layers/wr/WebRenderTextureHost.h +++ b/gfx/layers/wr/WebRenderTextureHost.h @@ -25,7 +25,8 @@ class WebRenderTextureHost : public TextureHost public: WebRenderTextureHost(const SurfaceDescriptor& aDesc, TextureFlags aFlags, - TextureHost* aTexture); + TextureHost* aTexture, + wr::ExternalImageId& aExternalImageId); virtual ~WebRenderTextureHost(); virtual void DeallocateDeviceData() override {} @@ -71,8 +72,6 @@ protected: wr::ExternalImageId mExternalImageId; bool mIsWrappingNativeHandle; - - static uint64_t sSerialCounter; }; } // namespace layers diff --git a/gfx/tests/gtest/TextureHelper.h b/gfx/tests/gtest/TextureHelper.h index f2d1d9840103..eea7ac66132b 100644 --- a/gfx/tests/gtest/TextureHelper.h +++ b/gfx/tests/gtest/TextureHelper.h @@ -147,8 +147,9 @@ CreateTextureHostWithBackend(TextureClient* aClient, aClient->ToSurfaceDescriptor(descriptor); + wr::MaybeExternalImageId id = Nothing(); return TextureHost::Create(descriptor, nullptr, aLayersBackend, - aClient->GetFlags()); + aClient->GetFlags(), id); } } // namespace layers diff --git a/gfx/vr/ipc/VRManagerChild.cpp b/gfx/vr/ipc/VRManagerChild.cpp index 5bf54546f5b0..9c4396786b81 100644 --- a/gfx/vr/ipc/VRManagerChild.cpp +++ b/gfx/vr/ipc/VRManagerChild.cpp @@ -352,7 +352,8 @@ PTextureChild* VRManagerChild::CreateTexture(const SurfaceDescriptor& aSharedData, LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) { return SendPTextureConstructor(aSharedData, aLayersBackend, aFlags, aSerial); } diff --git a/gfx/vr/ipc/VRManagerChild.h b/gfx/vr/ipc/VRManagerChild.h index 5042b0f93ed2..c1feaff2fc86 100644 --- a/gfx/vr/ipc/VRManagerChild.h +++ b/gfx/vr/ipc/VRManagerChild.h @@ -67,7 +67,8 @@ public: virtual PTextureChild* CreateTexture(const SurfaceDescriptor& aSharedData, layers::LayersBackend aLayersBackend, TextureFlags aFlags, - uint64_t aSerial) override; + uint64_t aSerial, + wr::MaybeExternalImageId& aExternalImageId) override; virtual void CancelWaitForRecycle(uint64_t aTextureId) override; PVRLayerChild* CreateVRLayer(uint32_t aDisplayID, diff --git a/gfx/vr/ipc/VRManagerParent.cpp b/gfx/vr/ipc/VRManagerParent.cpp index 1a6bf7bcb65f..f40b25471706 100644 --- a/gfx/vr/ipc/VRManagerParent.cpp +++ b/gfx/vr/ipc/VRManagerParent.cpp @@ -47,7 +47,7 @@ VRManagerParent::AllocPTextureParent(const SurfaceDescriptor& aSharedData, const TextureFlags& aFlags, const uint64_t& aSerial) { - return layers::TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial); + return layers::TextureHost::CreateIPDLActor(this, aSharedData, aLayersBackend, aFlags, aSerial, Nothing()); } bool diff --git a/gfx/webrender_bindings/WebRenderTypes.h b/gfx/webrender_bindings/WebRenderTypes.h index 989644c70971..7e69d4daaca0 100644 --- a/gfx/webrender_bindings/WebRenderTypes.h +++ b/gfx/webrender_bindings/WebRenderTypes.h @@ -31,6 +31,8 @@ typedef WrFontKey FontKey; typedef WrEpoch Epoch; typedef WrExternalImageId ExternalImageId; +typedef Maybe MaybeExternalImageId; + inline WindowId NewWindowId(uint64_t aId) { WindowId id; id.mHandle = aId;