Bug 1379920 - Add aAsync param to AddPipelineIdForAsyncCompositable and rename it to AddPipelineIdForCompositable. r=sotaro
When empty transaction in layers free mode, we don't rebuild whole
display list. But the canvas content will be updated and send the
content to parent by CanvasClient. We need some mechanism just like
async video which can update the content without rebuild the dl. But
CanvasClient doesn't use ImageBridge at all. So I slightly modify
AddPipelineIdForAsyncCompositable to let it support the Compostiable
either store in ImageBridge or WebRenderBridgeParent.
MozReview-Commit-ID: 3mKv13Pgc2k
--- a/gfx/layers/ipc/PWebRenderBridge.ipdl
+++ b/gfx/layers/ipc/PWebRenderBridge.ipdl
@@ -57,18 +57,18 @@ parent:
async DPEnd(IntSize aSize, WebRenderParentCommand[] commands, OpDestroy[] toDestroy, uint64_t fwdTransactionId, uint64_t transactionId,
LayoutSize aContentSize, ByteBuffer aDL, BuiltDisplayListDescriptor aDLDesc,
WebRenderScrollData aScrollData, uint32_t idNameSpace);
sync DPSyncEnd(IntSize aSize, WebRenderParentCommand[] commands, OpDestroy[] toDestroy, uint64_t fwdTransactionId, uint64_t transactionId,
LayoutSize aContentSize, ByteBuffer aDL, BuiltDisplayListDescriptor aDLDesc,
WebRenderScrollData aScrollData, uint32_t idNameSpace);
async ParentCommands(WebRenderParentCommand[] commands);
sync DPGetSnapshot(PTexture texture);
- async AddPipelineIdForAsyncCompositable(PipelineId aImageId, CompositableHandle aHandle);
- async RemovePipelineIdForAsyncCompositable(PipelineId aPipelineId);
+ async AddPipelineIdForCompositable(PipelineId aImageId, CompositableHandle aHandle, bool aAsync);
+ async RemovePipelineIdForCompositable(PipelineId aPipelineId);
async AddExternalImageIdForCompositable(ExternalImageId aImageId, CompositableHandle aHandle);
async RemoveExternalImageId(ExternalImageId aImageId);
async SetLayerObserverEpoch(uint64_t layerObserverEpoch);
async ClearCachedResources();
// Schedule a composite if one isn't already scheduled.
async ForceComposite();
// These correspond exactly to the equivalent APIs in PLayerTransaction -
--- a/gfx/layers/wr/WebRenderBridgeChild.cpp
+++ b/gfx/layers/wr/WebRenderBridgeChild.cpp
@@ -134,23 +134,30 @@ WebRenderBridgeChild::ProcessWebRenderPa
this->SendParentCommands(mParentCommands);
mParentCommands.Clear();
}
void
WebRenderBridgeChild::AddPipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineId,
const CompositableHandle& aHandle)
{
- SendAddPipelineIdForAsyncCompositable(aPipelineId, aHandle);
+ SendAddPipelineIdForCompositable(aPipelineId, aHandle, true);
}
void
-WebRenderBridgeChild::RemovePipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineId)
+WebRenderBridgeChild::AddPipelineIdForCompositable(const wr::PipelineId& aPipelineId,
+ const CompositableHandle& aHandle)
{
- SendRemovePipelineIdForAsyncCompositable(aPipelineId);
+ SendAddPipelineIdForCompositable(aPipelineId, aHandle, false);
+}
+
+void
+WebRenderBridgeChild::RemovePipelineIdForCompositable(const wr::PipelineId& aPipelineId)
+{
+ SendRemovePipelineIdForCompositable(aPipelineId);
}
wr::ExternalImageId
WebRenderBridgeChild::GetNextExternalImageId()
{
wr::MaybeExternalImageId id = GetCompositorBridgeChild()->GetNextExternalImageId();
MOZ_RELEASE_ASSERT(id.isSome());
return id.value();
--- a/gfx/layers/wr/WebRenderBridgeChild.h
+++ b/gfx/layers/wr/WebRenderBridgeChild.h
@@ -71,17 +71,19 @@ public:
wr::PipelineId GetPipeline() { return mPipelineId; }
// KnowsCompositor
TextureForwarder* GetTextureForwarder() override;
LayersIPCActor* GetLayersIPCActor() override;
void AddPipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineId,
const CompositableHandle& aHandlee);
- void RemovePipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineId);
+ void AddPipelineIdForCompositable(const wr::PipelineId& aPipelineId,
+ const CompositableHandle& aHandlee);
+ void RemovePipelineIdForCompositable(const wr::PipelineId& aPipelineId);
wr::ExternalImageId AllocExternalImageIdForCompositable(CompositableClient* aCompositable);
void DeallocExternalImageId(wr::ExternalImageId& aImageId);
/**
* Clean this up, finishing with SendShutDown() which will cause __delete__
* to be sent from the parent side.
*/
--- a/gfx/layers/wr/WebRenderBridgeParent.cpp
+++ b/gfx/layers/wr/WebRenderBridgeParent.cpp
@@ -736,30 +736,36 @@ WebRenderBridgeParent::RecvDPGetSnapshot
mApi->Readback(size, buffer, buffer_size);
mForceRendering = false;
return IPC_OK();
}
mozilla::ipc::IPCResult
-WebRenderBridgeParent::RecvAddPipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineId,
- const CompositableHandle& aHandle)
+WebRenderBridgeParent::RecvAddPipelineIdForCompositable(const wr::PipelineId& aPipelineId,
+ const CompositableHandle& aHandle,
+ const bool& aAsync)
{
if (mDestroyed) {
return IPC_OK();
}
MOZ_ASSERT(!mAsyncCompositables.Get(wr::AsUint64(aPipelineId)).get());
- RefPtr<ImageBridgeParent> imageBridge = ImageBridgeParent::GetInstance(OtherPid());
- if (!imageBridge) {
- return IPC_FAIL_NO_REASON(this);
+ RefPtr<CompositableHost> host;
+ if (aAsync) {
+ RefPtr<ImageBridgeParent> imageBridge = ImageBridgeParent::GetInstance(OtherPid());
+ if (!imageBridge) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ host = imageBridge->FindCompositable(aHandle);
+ } else {
+ host = FindCompositable(aHandle);
}
- RefPtr<CompositableHost> host = imageBridge->FindCompositable(aHandle);
if (!host) {
return IPC_FAIL_NO_REASON(this);
}
MOZ_ASSERT(host->AsWebRenderImageHost());
WebRenderImageHost* wrHost = host->AsWebRenderImageHost();
if (!wrHost) {
return IPC_OK();
}
@@ -767,17 +773,17 @@ WebRenderBridgeParent::RecvAddPipelineId
wrHost->SetWrBridge(this);
mAsyncCompositables.Put(wr::AsUint64(aPipelineId), wrHost);
mCompositableHolder->AddAsyncImagePipeline(aPipelineId, wrHost);
return IPC_OK();
}
mozilla::ipc::IPCResult
-WebRenderBridgeParent::RecvRemovePipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineId)
+WebRenderBridgeParent::RecvRemovePipelineIdForCompositable(const wr::PipelineId& aPipelineId)
{
if (mDestroyed) {
return IPC_OK();
}
WebRenderImageHost* wrHost = mAsyncCompositables.Get(wr::AsUint64(aPipelineId)).get();
if (!wrHost) {
return IPC_OK();
@@ -1277,17 +1283,16 @@ WebRenderBridgeParent::ClearResources()
DeleteOldImages();
for (auto iter = mExternalImageIds.Iter(); !iter.Done(); iter.Next()) {
iter.Data()->ClearWrBridge();
}
mExternalImageIds.Clear();
for (auto iter = mAsyncCompositables.Iter(); !iter.Done(); iter.Next()) {
wr::PipelineId pipelineId = wr::AsPipelineId(iter.Key());
RefPtr<WebRenderImageHost> host = iter.Data();
- MOZ_ASSERT(host->GetAsyncRef());
host->ClearWrBridge();
mCompositableHolder->RemoveAsyncImagePipeline(mApi, pipelineId);
}
mAsyncCompositables.Clear();
mCompositableHolder->RemovePipeline(mPipelineId, wr::NewEpoch(mWrEpoch));
for (std::unordered_set<uint64_t>::iterator iter = mActiveAnimations.begin(); iter != mActiveAnimations.end(); iter++) {
--- a/gfx/layers/wr/WebRenderBridgeParent.h
+++ b/gfx/layers/wr/WebRenderBridgeParent.h
@@ -111,19 +111,20 @@ public:
const wr::LayoutSize& aContentSize,
const wr::ByteBuffer& dl,
const wr::BuiltDisplayListDescriptor& dlDesc,
const WebRenderScrollData& aScrollData,
const uint32_t& aIdNameSpace) override;
mozilla::ipc::IPCResult RecvParentCommands(nsTArray<WebRenderParentCommand>&& commands) override;
mozilla::ipc::IPCResult RecvDPGetSnapshot(PTextureParent* aTexture) override;
- mozilla::ipc::IPCResult RecvAddPipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineIds,
- const CompositableHandle& aHandle) override;
- mozilla::ipc::IPCResult RecvRemovePipelineIdForAsyncCompositable(const wr::PipelineId& aPipelineId) override;
+ mozilla::ipc::IPCResult RecvAddPipelineIdForCompositable(const wr::PipelineId& aPipelineIds,
+ const CompositableHandle& aHandle,
+ const bool& aAsync) override;
+ mozilla::ipc::IPCResult RecvRemovePipelineIdForCompositable(const wr::PipelineId& aPipelineId) override;
mozilla::ipc::IPCResult RecvAddExternalImageIdForCompositable(const ExternalImageId& aImageId,
const CompositableHandle& aHandle) override;
mozilla::ipc::IPCResult RecvRemoveExternalImageId(const ExternalImageId& aImageId) override;
mozilla::ipc::IPCResult RecvSetLayerObserverEpoch(const uint64_t& aLayerObserverEpoch) override;
mozilla::ipc::IPCResult RecvClearCachedResources() override;
mozilla::ipc::IPCResult RecvForceComposite() override;
--- a/gfx/layers/wr/WebRenderImageLayer.cpp
+++ b/gfx/layers/wr/WebRenderImageLayer.cpp
@@ -42,17 +42,17 @@ WebRenderImageLayer::ClearWrResources()
WrManager()->AddImageKeyForDiscard(mKey.value());
mKey = Nothing();
}
if (mExternalImageId.isSome()) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
mExternalImageId = Nothing();
}
if (mPipelineId.isSome()) {
- WrBridge()->RemovePipelineIdForAsyncCompositable(mPipelineId.ref());
+ WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
mPipelineId = Nothing();
}
}
CompositableType
WebRenderImageLayer::GetImageClientType()
{
if (mImageClientContainerType != CompositableType::UNKNOWN) {
--- a/gfx/layers/wr/WebRenderUserData.cpp
+++ b/gfx/layers/wr/WebRenderUserData.cpp
@@ -31,17 +31,17 @@ WebRenderImageData::~WebRenderImageData(
mWRManager->AddImageKeyForDiscard(mKey.value());
}
if (mExternalImageId) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
}
if (mPipelineId) {
- WrBridge()->RemovePipelineIdForAsyncCompositable(mPipelineId.ref());
+ WrBridge()->RemovePipelineIdForCompositable(mPipelineId.ref());
}
}
Maybe<wr::ImageKey>
WebRenderImageData::UpdateImageKey(ImageContainer* aContainer, bool aForceUpdate)
{
CreateImageClientIfNeeded();
CreateExternalImageIfNeeded();