mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-02 14:30:43 +00:00
Bug 1356088 - Fix ImageKey removals of ExternalImages r=jrmuizel
This commit is contained in:
parent
ea26418751
commit
79b1971bae
@ -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();
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
@ -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]),
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user