Bug 1356088 - Fix ImageKey removals of ExternalImages r=jrmuizel

This commit is contained in:
sotaro 2017-04-13 20:53:21 +09:00
parent ea26418751
commit 79b1971bae
8 changed files with 22 additions and 1 deletions

View File

@ -260,6 +260,9 @@ WebRenderBridgeParent::RecvDeleteImage(const wr::ImageKey& aImageKey)
return IPC_OK();
}
MOZ_ASSERT(mApi);
if (mActiveKeys.Get(wr::AsUint64(aImageKey), nullptr)) {
mActiveKeys.Remove(wr::AsUint64(aImageKey));
}
mKeysToDelete.push_back(aImageKey);
return IPC_OK();
}
@ -351,6 +354,8 @@ WebRenderBridgeParent::ProcessWebRenderCommands(const gfx::IntSize &aSize,
const OpAddExternalImage& op = cmd.get_OpAddExternalImage();
wr::ImageKey key = op.key();
MOZ_ASSERT(mExternalImageIds.Get(op.externalImageId()).get());
MOZ_ASSERT(!mActiveKeys.Get(wr::AsUint64(key), nullptr));
mActiveKeys.Put(wr::AsUint64(key), key);
RefPtr<CompositableHost> host = mExternalImageIds.Get(op.externalImageId());
if (!host) {
@ -691,6 +696,10 @@ WebRenderBridgeParent::ClearResources()
if (mApi) {
++mWrEpoch; // Update webrender epoch
mApi->ClearRootDisplayList(wr::NewEpoch(mWrEpoch), mPipelineId);
for (auto iter = mActiveKeys.Iter(); !iter.Done(); iter.Next()) {
mKeysToDelete.push_back(iter.Data());
iter.Remove();
}
if (!mKeysToDelete.empty()) {
// XXX Sync wait.
mApi->WaitFlushed();

View File

@ -198,6 +198,8 @@ private:
RefPtr<WebRenderCompositableHolder> mCompositableHolder;
RefPtr<CompositorVsyncScheduler> mCompositorScheduler;
std::vector<wr::ImageKey> mKeysToDelete;
// XXX How to handle active keys of non-ExternalImages?
nsDataHashtable<nsUint64HashKey, wr::ImageKey> mActiveKeys;
nsDataHashtable<nsUint64HashKey, RefPtr<CompositableHost>> mExternalImageIds;
nsTArray<ImageCompositeNotificationInfo> mImageCompositeNotifications;

View File

@ -156,6 +156,7 @@ WebRenderImageLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
key.mNamespace = WrBridge()->GetNamespace();
key.mHandle = WrBridge()->GetNextResourceId();
WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId, key));
Manager()->AddImageKeyForDiscard(key);
aBuilder.PushStackingContext(wr::ToWrRect(relBounds),
1.0f,

View File

@ -200,6 +200,7 @@ WebRenderPaintedLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
key.mNamespace = WrBridge()->GetNamespace();
key.mHandle = WrBridge()->GetNextResourceId();
WrBridge()->AddWebRenderParentCommand(OpAddExternalImage(mExternalImageId, key));
Manager()->AddImageKeyForDiscard(key);
aBuilder.PushStackingContext(wr::ToWrRect(relBounds),
1.0f,
@ -208,7 +209,6 @@ WebRenderPaintedLayer::RenderLayer(wr::DisplayListBuilder& aBuilder)
mixBlendMode);
aBuilder.PushImage(wr::ToWrRect(rect), clip, wr::ImageRendering::Auto, key);
aBuilder.PopStackingContext();
Manager()->AddImageKeyForDiscard(key);
}
} // namespace layers

View File

@ -98,6 +98,12 @@ struct ImageDescriptor: public WrImageDescriptor {
}
};
// Whenever possible, use wr::ImageKey instead of manipulating uint64_t.
inline uint64_t AsUint64(const ImageKey& aId) {
return (static_cast<uint64_t>(aId.mNamespace) << 32)
+ static_cast<uint64_t>(aId.mHandle);
}
// Whenever possible, use wr::PipelineId instead of manipulating uint64_t.
inline uint64_t AsUint64(const PipelineId& aId) {
return (static_cast<uint64_t>(aId.mNamespace) << 32)

View File

@ -472,6 +472,7 @@ BulletRenderer::CreateWebRenderCommandsForImage(nsDisplayItem* aItem,
aParentCommands.AppendElement(layers::OpAddExternalImage(
externalImageId,
key));
layer->WrManager()->AddImageKeyForDiscard(key);
aBuilder.PushImage(wr::ToWrRect(dest),
clipRegion,
WrImageRendering::Auto,

View File

@ -4789,6 +4789,7 @@ nsDisplayBorder::CreateBorderImageWebRenderCommands(mozilla::wr::DisplayListBuil
key.mNamespace = aLayer->WrBridge()->GetNamespace();
key.mHandle = aLayer->WrBridge()->GetNextResourceId();
aParentCommands.AppendElement(OpAddExternalImage(externalImageId, key));
aLayer->WrManager()->AddImageKeyForDiscard(key);
aBuilder.PushBorderImage(wr::ToWrRect(dest),
aBuilder.BuildClipRegion(wr::ToWrRect(clip)),
wr::ToWrBorderWidths(widths[0], widths[1], widths[2], widths[3]),

View File

@ -635,6 +635,7 @@ nsImageRenderer::BuildWebRenderDisplayItems(nsPresContext* aPresContext,
key.mNamespace = aLayer->WrBridge()->GetNamespace();
key.mHandle = aLayer->WrBridge()->GetNextResourceId();
aParentCommands.AppendElement(OpAddExternalImage(externalImageId, key));
aLayer->WrManager()->AddImageKeyForDiscard(key);
aBuilder.PushImage(wr::ToWrRect(fill), aBuilder.BuildClipRegion(wr::ToWrRect(clip)),
wr::ToWrSize(dest.Size()), wr::ToWrSize(gapSize),
wr::ImageRendering::Auto, key);