Loading gfx/layers/wr/WebRenderLayerManager.cpp +13 −3 Original line number Diff line number Diff line Loading @@ -102,6 +102,7 @@ WebRenderLayerManager::DoDestroy(bool aIsSync) if (WrBridge()) { // Just clear ImageKeys, they are deleted during WebRenderAPI destruction. mImageKeysToDeleteLater.Clear(); mImageKeysToDelete.Clear(); // CompositorAnimations are cleared by WebRenderBridgeParent. mDiscardedCompositorAnimationsIds.Clear(); Loading Loading @@ -376,7 +377,6 @@ WebRenderLayerManager::EndTransactionWithoutLayer(nsDisplayList* aDisplayList, { MOZ_ASSERT(aDisplayList && aDisplayListBuilder); mEndTransactionWithoutLayers = true; DiscardImages(); WrBridge()->RemoveExpiredFontKeys(); EndTransactionInternal(nullptr, nullptr, Loading Loading @@ -686,7 +686,6 @@ WebRenderLayerManager::EndTransaction(DrawPaintedLayerCallback aCallback, EndTransactionFlags aFlags) { mEndTransactionWithoutLayers = false; DiscardImages(); WrBridge()->RemoveExpiredFontKeys(); EndTransactionInternal(aCallback, aCallbackData, aFlags); } Loading Loading @@ -817,6 +816,12 @@ WebRenderLayerManager::EndTransactionInternal(DrawPaintedLayerCallback aCallback mLatestTransactionId = mTransactionIdAllocator->GetTransactionId(/*aThrottle*/ true); TimeStamp transactionStart = mTransactionIdAllocator->GetTransactionStart(); for (const auto& key : mImageKeysToDelete) { resourceUpdates.DeleteImage(key); } mImageKeysToDelete.Clear(); mImageKeysToDelete.SwapElements(mImageKeysToDeleteLater); // Skip the synchronization for buffer since we also skip the painting during // device-reset status. if (!gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) { Loading Loading @@ -922,16 +927,20 @@ WebRenderLayerManager::MakeSnapshotIfRequired(LayoutDeviceIntSize aSize) void WebRenderLayerManager::AddImageKeyForDiscard(wr::ImageKey key) { mImageKeysToDelete.AppendElement(key); mImageKeysToDeleteLater.AppendElement(key); } void WebRenderLayerManager::DiscardImages() { wr::IpcResourceUpdateQueue resources(WrBridge()->GetShmemAllocator()); for (const auto& key : mImageKeysToDeleteLater) { resources.DeleteImage(key); } for (const auto& key : mImageKeysToDelete) { resources.DeleteImage(key); } mImageKeysToDeleteLater.Clear(); mImageKeysToDelete.Clear(); WrBridge()->UpdateResources(resources); } Loading @@ -958,6 +967,7 @@ WebRenderLayerManager::DiscardLocalImages() // Removes images but doesn't tell the parent side about them // This is useful in empty / failed transactions where we created // image keys but didn't tell the parent about them yet. mImageKeysToDeleteLater.Clear(); mImageKeysToDelete.Clear(); } Loading gfx/layers/wr/WebRenderLayerManager.h +5 −0 Original line number Diff line number Diff line Loading @@ -250,6 +250,11 @@ private: private: nsIWidget* MOZ_NON_OWNING_REF mWidget; nsTArray<wr::ImageKey> mImageKeysToDelete; // TODO - This is needed because we have some code that creates image keys // and enqueues them for deletion right away which is bad not only because // of poor texture cache usage, but also because images end up deleted before // they are used. This should hopfully be temporary. nsTArray<wr::ImageKey> mImageKeysToDeleteLater; nsTArray<uint64_t> mDiscardedCompositorAnimationsIds; /* PaintedLayer callbacks; valid at the end of a transaciton, Loading Loading
gfx/layers/wr/WebRenderLayerManager.cpp +13 −3 Original line number Diff line number Diff line Loading @@ -102,6 +102,7 @@ WebRenderLayerManager::DoDestroy(bool aIsSync) if (WrBridge()) { // Just clear ImageKeys, they are deleted during WebRenderAPI destruction. mImageKeysToDeleteLater.Clear(); mImageKeysToDelete.Clear(); // CompositorAnimations are cleared by WebRenderBridgeParent. mDiscardedCompositorAnimationsIds.Clear(); Loading Loading @@ -376,7 +377,6 @@ WebRenderLayerManager::EndTransactionWithoutLayer(nsDisplayList* aDisplayList, { MOZ_ASSERT(aDisplayList && aDisplayListBuilder); mEndTransactionWithoutLayers = true; DiscardImages(); WrBridge()->RemoveExpiredFontKeys(); EndTransactionInternal(nullptr, nullptr, Loading Loading @@ -686,7 +686,6 @@ WebRenderLayerManager::EndTransaction(DrawPaintedLayerCallback aCallback, EndTransactionFlags aFlags) { mEndTransactionWithoutLayers = false; DiscardImages(); WrBridge()->RemoveExpiredFontKeys(); EndTransactionInternal(aCallback, aCallbackData, aFlags); } Loading Loading @@ -817,6 +816,12 @@ WebRenderLayerManager::EndTransactionInternal(DrawPaintedLayerCallback aCallback mLatestTransactionId = mTransactionIdAllocator->GetTransactionId(/*aThrottle*/ true); TimeStamp transactionStart = mTransactionIdAllocator->GetTransactionStart(); for (const auto& key : mImageKeysToDelete) { resourceUpdates.DeleteImage(key); } mImageKeysToDelete.Clear(); mImageKeysToDelete.SwapElements(mImageKeysToDeleteLater); // Skip the synchronization for buffer since we also skip the painting during // device-reset status. if (!gfxPlatform::GetPlatform()->DidRenderingDeviceReset()) { Loading Loading @@ -922,16 +927,20 @@ WebRenderLayerManager::MakeSnapshotIfRequired(LayoutDeviceIntSize aSize) void WebRenderLayerManager::AddImageKeyForDiscard(wr::ImageKey key) { mImageKeysToDelete.AppendElement(key); mImageKeysToDeleteLater.AppendElement(key); } void WebRenderLayerManager::DiscardImages() { wr::IpcResourceUpdateQueue resources(WrBridge()->GetShmemAllocator()); for (const auto& key : mImageKeysToDeleteLater) { resources.DeleteImage(key); } for (const auto& key : mImageKeysToDelete) { resources.DeleteImage(key); } mImageKeysToDeleteLater.Clear(); mImageKeysToDelete.Clear(); WrBridge()->UpdateResources(resources); } Loading @@ -958,6 +967,7 @@ WebRenderLayerManager::DiscardLocalImages() // Removes images but doesn't tell the parent side about them // This is useful in empty / failed transactions where we created // image keys but didn't tell the parent about them yet. mImageKeysToDeleteLater.Clear(); mImageKeysToDelete.Clear(); } Loading
gfx/layers/wr/WebRenderLayerManager.h +5 −0 Original line number Diff line number Diff line Loading @@ -250,6 +250,11 @@ private: private: nsIWidget* MOZ_NON_OWNING_REF mWidget; nsTArray<wr::ImageKey> mImageKeysToDelete; // TODO - This is needed because we have some code that creates image keys // and enqueues them for deletion right away which is bad not only because // of poor texture cache usage, but also because images end up deleted before // they are used. This should hopfully be temporary. nsTArray<wr::ImageKey> mImageKeysToDeleteLater; nsTArray<uint64_t> mDiscardedCompositorAnimationsIds; /* PaintedLayer callbacks; valid at the end of a transaciton, Loading