diff --git a/gfx/layers/composite/GPUVideoTextureHost.cpp b/gfx/layers/composite/GPUVideoTextureHost.cpp index d8a052573072..98bfae190bb7 100644 --- a/gfx/layers/composite/GPUVideoTextureHost.cpp +++ b/gfx/layers/composite/GPUVideoTextureHost.cpp @@ -71,8 +71,8 @@ TextureHost* GPUVideoTextureHost::EnsureWrappedTextureHost() { RefPtr texture = new wr::RenderTextureHostWrapper(wrappedId); - wr::RenderThread::Get()->RegisterExternalImage( - wr::AsUint64(mExternalImageId.ref()), texture.forget()); + wr::RenderThread::Get()->RegisterExternalImage(mExternalImageId.ref(), + texture.forget()); } if (mPendingSourceProvider) { @@ -220,8 +220,8 @@ void GPUVideoTextureHost::CreateRenderTexture( RefPtr texture = new wr::RenderTextureHostWrapper(wrappedId); - wr::RenderThread::Get()->RegisterExternalImage( - wr::AsUint64(mExternalImageId.ref()), texture.forget()); + wr::RenderThread::Get()->RegisterExternalImage(mExternalImageId.ref(), + texture.forget()); return; } diff --git a/gfx/layers/composite/TextureHost.cpp b/gfx/layers/composite/TextureHost.cpp index 261815c36d39..633016f26f3d 100644 --- a/gfx/layers/composite/TextureHost.cpp +++ b/gfx/layers/composite/TextureHost.cpp @@ -433,8 +433,7 @@ void TextureHost::MaybeDestroyRenderTexture() { void TextureHost::DestroyRenderTexture( const wr::ExternalImageId& aExternalImageId) { - wr::RenderThread::Get()->UnregisterExternalImage( - wr::AsUint64(aExternalImageId)); + wr::RenderThread::Get()->UnregisterExternalImage(aExternalImageId); } void TextureHost::EnsureRenderTexture( @@ -598,7 +597,7 @@ void BufferTextureHost::CreateRenderTexture( new wr::RenderBufferTextureHost(GetBuffer(), GetBufferDescriptor()); } - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } diff --git a/gfx/layers/d3d11/TextureD3D11.cpp b/gfx/layers/d3d11/TextureD3D11.cpp index 229b7fc084c4..861091f75d63 100644 --- a/gfx/layers/d3d11/TextureD3D11.cpp +++ b/gfx/layers/d3d11/TextureD3D11.cpp @@ -998,7 +998,7 @@ void DXGITextureHostD3D11::CreateRenderTexture( RefPtr texture = new wr::RenderDXGITextureHost( mHandle, mFormat, mYUVColorSpace, mColorRange, mSize); - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } @@ -1299,7 +1299,7 @@ void DXGIYCbCrTextureHostD3D11::CreateRenderTexture( RefPtr texture = new wr::RenderDXGIYCbCrTextureHost( mHandles, mYUVColorSpace, mColorDepth, mColorRange, mSizeY, mSizeCbCr); - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } diff --git a/gfx/layers/ipc/SharedSurfacesParent.cpp b/gfx/layers/ipc/SharedSurfacesParent.cpp index f05b7d587009..89ff962ee528 100644 --- a/gfx/layers/ipc/SharedSurfacesParent.cpp +++ b/gfx/layers/ipc/SharedSurfacesParent.cpp @@ -74,7 +74,8 @@ void SharedSurfacesParent::ShutdownRenderThread() { // There may be lingering consumers of the surfaces that didn't get shutdown // yet but since we are here, we know the render thread is finished and we // can unregister everything. - wr::RenderThread::Get()->UnregisterExternalImageDuringShutdown(key); + wr::RenderThread::Get()->UnregisterExternalImageDuringShutdown( + wr::ToExternalImageId(key)); } } @@ -138,7 +139,7 @@ bool SharedSurfacesParent::Release(const wr::ExternalImageId& aId, if (surface->RemoveConsumer(aForCreator)) { RemoveTrackingLocked(surface, lock); - wr::RenderThread::Get()->UnregisterExternalImage(id); + wr::RenderThread::Get()->UnregisterExternalImage(wr::ToExternalImageId(id)); sInstance->mSurfaces.Remove(id); } @@ -169,7 +170,7 @@ void SharedSurfacesParent::AddSameProcess(const wr::ExternalImageId& aId, MOZ_ASSERT(!sInstance->mSurfaces.Contains(id)); auto texture = MakeRefPtr(surface); - wr::RenderThread::Get()->RegisterExternalImage(id, texture.forget()); + wr::RenderThread::Get()->RegisterExternalImage(aId, texture.forget()); surface->AddConsumer(); sInstance->mSurfaces.InsertOrUpdate(id, std::move(surface)); @@ -189,7 +190,8 @@ void SharedSurfacesParent::DestroyProcess(base::ProcessId aPid) { if (surface->GetCreatorPid() == aPid && surface->HasCreatorRef() && surface->RemoveConsumer(/* aForCreator */ true)) { RemoveTrackingLocked(surface, lock); - wr::RenderThread::Get()->UnregisterExternalImage(i.Key()); + wr::RenderThread::Get()->UnregisterExternalImage( + wr::ToExternalImageId(i.Key())); i.Remove(); } } @@ -225,7 +227,7 @@ void SharedSurfacesParent::Add(const wr::ExternalImageId& aId, MOZ_ASSERT(!sInstance->mSurfaces.Contains(id)); auto texture = MakeRefPtr(surface); - wr::RenderThread::Get()->RegisterExternalImage(id, texture.forget()); + wr::RenderThread::Get()->RegisterExternalImage(aId, texture.forget()); surface->AddConsumer(); sInstance->mSurfaces.InsertOrUpdate(id, std::move(surface)); diff --git a/gfx/layers/opengl/DMABUFTextureHostOGL.cpp b/gfx/layers/opengl/DMABUFTextureHostOGL.cpp index 2b86911233b5..e89b364a7a31 100644 --- a/gfx/layers/opengl/DMABUFTextureHostOGL.cpp +++ b/gfx/layers/opengl/DMABUFTextureHostOGL.cpp @@ -129,7 +129,7 @@ void DMABUFTextureHostOGL::CreateRenderTexture( } RefPtr texture = new wr::RenderDMABUFTextureHost(mSurface); - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } diff --git a/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp b/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp index 65c43c135172..4bc21984dea8 100644 --- a/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp +++ b/gfx/layers/opengl/MacIOSurfaceTextureHostOGL.cpp @@ -137,7 +137,7 @@ void MacIOSurfaceTextureHostOGL::CreateRenderTexture( RefPtr texture = new wr::RenderMacIOSurfaceTextureHost(GetMacIOSurface()); - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } diff --git a/gfx/layers/opengl/TextureHostOGL.cpp b/gfx/layers/opengl/TextureHostOGL.cpp index 94eeeced5b35..6a57d049ff1a 100644 --- a/gfx/layers/opengl/TextureHostOGL.cpp +++ b/gfx/layers/opengl/TextureHostOGL.cpp @@ -665,7 +665,7 @@ void SurfaceTextureHost::CreateRenderTexture( RefPtr texture = new wr::RenderAndroidSurfaceTextureHost(mSurfTex, mSize, mFormat, mContinuousUpdate); - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } @@ -978,7 +978,7 @@ void AndroidHardwareBufferTextureHost::CreateRenderTexture( const wr::ExternalImageId& aExternalImageId) { RefPtr texture = new wr::RenderAndroidHardwareBufferTextureHost(mAndroidHardwareBuffer); - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } @@ -1194,7 +1194,7 @@ void EGLImageTextureHost::CreateRenderTexture( const wr::ExternalImageId& aExternalImageId) { RefPtr texture = new wr::RenderEGLImageTextureHost(mImage, mSync, mSize); - wr::RenderThread::Get()->RegisterExternalImage(wr::AsUint64(aExternalImageId), + wr::RenderThread::Get()->RegisterExternalImage(aExternalImageId, texture.forget()); } diff --git a/gfx/layers/wr/WebRenderTextureHost.cpp b/gfx/layers/wr/WebRenderTextureHost.cpp index 3d72c123fc62..3ca385338e60 100644 --- a/gfx/layers/wr/WebRenderTextureHost.cpp +++ b/gfx/layers/wr/WebRenderTextureHost.cpp @@ -145,7 +145,7 @@ gfx::SurfaceFormat WebRenderTextureHost::GetFormat() const { void WebRenderTextureHost::NotifyNotUsed() { #ifdef MOZ_WIDGET_ANDROID if (mWrappedTextureHost->AsSurfaceTextureHost()) { - wr::RenderThread::Get()->NotifyNotUsed(wr::AsUint64(GetExternalImageKey())); + wr::RenderThread::Get()->NotifyNotUsed(GetExternalImageKey()); } #endif TextureHost::NotifyNotUsed(); @@ -154,7 +154,7 @@ void WebRenderTextureHost::NotifyNotUsed() { void WebRenderTextureHost::MaybeNotifyForUse(wr::TransactionBuilder& aTxn) { #if defined(MOZ_WIDGET_ANDROID) if (mWrappedTextureHost->AsSurfaceTextureHost()) { - wr::RenderThread::Get()->NotifyForUse(wr::AsUint64(GetExternalImageKey())); + wr::RenderThread::Get()->NotifyForUse(GetExternalImageKey()); aTxn.Notify(wr::Checkpoint::FrameTexturesUpdated, MakeUnique()); } @@ -166,7 +166,7 @@ void WebRenderTextureHost::PrepareForUse() { mWrappedTextureHost->AsBufferTextureHost()) { // Call PrepareForUse on render thread. // See RenderAndroidSurfaceTextureHostOGL::PrepareForUse. - wr::RenderThread::Get()->PrepareForUse(wr::AsUint64(GetExternalImageKey())); + wr::RenderThread::Get()->PrepareForUse(GetExternalImageKey()); } } diff --git a/gfx/webrender_bindings/RenderThread.cpp b/gfx/webrender_bindings/RenderThread.cpp index 72c30b729da6..03f665525c30 100644 --- a/gfx/webrender_bindings/RenderThread.cpp +++ b/gfx/webrender_bindings/RenderThread.cpp @@ -654,7 +654,8 @@ void RenderThread::DecPendingFrameBuildCount(wr::WindowId aWindowId) { } void RenderThread::RegisterExternalImage( - uint64_t aExternalImageId, already_AddRefed aTexture) { + const wr::ExternalImageId& aExternalImageId, + already_AddRefed aTexture) { MutexAutoLock lock(mRenderTextureMapLock); if (mHasShutdown) { @@ -668,7 +669,8 @@ void RenderThread::RegisterExternalImage( mRenderTextures.emplace(aExternalImageId, texture); } -void RenderThread::UnregisterExternalImage(uint64_t aExternalImageId) { +void RenderThread::UnregisterExternalImage( + const wr::ExternalImageId& aExternalImageId) { MutexAutoLock lock(mRenderTextureMapLock); if (mHasShutdown) { return; @@ -703,20 +705,20 @@ void RenderThread::UnregisterExternalImage(uint64_t aExternalImageId) { } } -void RenderThread::PrepareForUse(uint64_t aExternalImageId) { +void RenderThread::PrepareForUse(const wr::ExternalImageId& aExternalImageId) { AddRenderTextureOp(RenderTextureOp::PrepareForUse, aExternalImageId); } -void RenderThread::NotifyNotUsed(uint64_t aExternalImageId) { +void RenderThread::NotifyNotUsed(const wr::ExternalImageId& aExternalImageId) { AddRenderTextureOp(RenderTextureOp::NotifyNotUsed, aExternalImageId); } -void RenderThread::NotifyForUse(uint64_t aExternalImageId) { +void RenderThread::NotifyForUse(const wr::ExternalImageId& aExternalImageId) { AddRenderTextureOp(RenderTextureOp::NotifyForUse, aExternalImageId); } -void RenderThread::AddRenderTextureOp(RenderTextureOp aOp, - uint64_t aExternalImageId) { +void RenderThread::AddRenderTextureOp( + RenderTextureOp aOp, const wr::ExternalImageId& aExternalImageId) { MOZ_ASSERT(!IsInRenderThread()); MutexAutoLock lock(mRenderTextureMapLock); @@ -759,7 +761,7 @@ void RenderThread::HandleRenderTextureOps() { } void RenderThread::UnregisterExternalImageDuringShutdown( - uint64_t aExternalImageId) { + const wr::ExternalImageId& aExternalImageId) { MOZ_ASSERT(IsInRenderThread()); MutexAutoLock lock(mRenderTextureMapLock); MOZ_ASSERT(mHasShutdown); @@ -779,11 +781,11 @@ void RenderThread::DeferredRenderTextureHostDestroy() { } RenderTextureHost* RenderThread::GetRenderTexture( - wr::ExternalImageId aExternalImageId) { + const wr::ExternalImageId& aExternalImageId) { MOZ_ASSERT(IsInRenderThread()); MutexAutoLock lock(mRenderTextureMapLock); - auto it = mRenderTextures.find(AsUint64(aExternalImageId)); + auto it = mRenderTextures.find(aExternalImageId); MOZ_ASSERT(it != mRenderTextures.end()); if (it == mRenderTextures.end()) { return nullptr; diff --git a/gfx/webrender_bindings/RenderThread.h b/gfx/webrender_bindings/RenderThread.h index d56462a2be3a..0b95ce86e8a3 100644 --- a/gfx/webrender_bindings/RenderThread.h +++ b/gfx/webrender_bindings/RenderThread.h @@ -196,28 +196,30 @@ class RenderThread final { bool Resume(wr::WindowId aWindowId); /// Can be called from any thread. - void RegisterExternalImage(uint64_t aExternalImageId, + void RegisterExternalImage(const wr::ExternalImageId& aExternalImageId, already_AddRefed aTexture); /// Can be called from any thread. - void UnregisterExternalImage(uint64_t aExternalImageId); + void UnregisterExternalImage(const wr::ExternalImageId& aExternalImageId); /// Can be called from any thread. - void PrepareForUse(uint64_t aExternalImageId); + void PrepareForUse(const wr::ExternalImageId& aExternalImageId); /// Can be called from any thread. - void NotifyNotUsed(uint64_t aExternalImageId); + void NotifyNotUsed(const wr::ExternalImageId& aExternalImageId); /// Can be called from any thread. - void NotifyForUse(uint64_t aExternalImageId); + void NotifyForUse(const wr::ExternalImageId& aExternalImageId); void HandleRenderTextureOps(); /// Can only be called from the render thread. - void UnregisterExternalImageDuringShutdown(uint64_t aExternalImageId); + void UnregisterExternalImageDuringShutdown( + const wr::ExternalImageId& aExternalImageId); /// Can only be called from the render thread. - RenderTextureHost* GetRenderTexture(ExternalImageId aExternalImageId); + RenderTextureHost* GetRenderTexture( + const wr::ExternalImageId& aExternalImageId); /// Can be called from any thread. bool IsDestroyed(wr::WindowId aWindowId); @@ -310,7 +312,8 @@ class RenderThread final { void DoAccumulateMemoryReport(MemoryReport, const RefPtr&); - void AddRenderTextureOp(RenderTextureOp aOp, uint64_t aExternalImageId); + void AddRenderTextureOp(RenderTextureOp aOp, + const wr::ExternalImageId& aExternalImageId); void CreateSingletonGL(nsACString& aError); @@ -351,9 +354,18 @@ class RenderThread final { DataMutex> mWindowInfos; + struct ExternalImageIdHashFn { + std::size_t operator()(const wr::ExternalImageId& aId) const { + return HashGeneric(wr::AsUint64(aId)); + } + }; + Mutex mRenderTextureMapLock; - std::unordered_map> mRenderTextures; - std::unordered_map> + std::unordered_map, + ExternalImageIdHashFn> + mRenderTextures; + std::unordered_map, + ExternalImageIdHashFn> mSyncObjectNeededRenderTextures; std::list>> mRenderTextureOps;