зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1429932 - Part 6: Attempt to skip Layer building if the display list hasn't changed. r=mstange
MozReview-Commit-ID: 1kBRIVteNb1
This commit is contained in:
Родитель
ad7cf1fba5
Коммит
756660c0c8
|
@ -3985,6 +3985,9 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
|
|||
if (aFlags & PaintFrameFlags::PAINT_COMPRESSED) {
|
||||
flags |= nsDisplayList::PAINT_COMPRESSED;
|
||||
}
|
||||
if (updateState == PartialUpdateResult::NoChange) {
|
||||
flags |= nsDisplayList::PAINT_IDENTICAL_DISPLAY_LIST;
|
||||
}
|
||||
|
||||
TimeStamp paintStart = TimeStamp::Now();
|
||||
RefPtr<LayerManager> layerManager
|
||||
|
|
|
@ -2612,24 +2612,6 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(nsDisplayListBuilder* aB
|
|||
}
|
||||
}
|
||||
|
||||
// Store the existing layer builder to reinstate it on return.
|
||||
FrameLayerBuilder *oldBuilder = layerManager->GetLayerBuilder();
|
||||
FrameLayerBuilder *layerBuilder = BuildLayers(aBuilder, layerManager,
|
||||
aFlags, widgetTransaction);
|
||||
|
||||
if (!layerBuilder) {
|
||||
layerManager->SetUserData(&gLayerManagerLayerBuilder, oldBuilder);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (widgetTransaction ||
|
||||
// SVG-as-an-image docs don't paint as part of the retained layer tree,
|
||||
// but they still need the invalidation state bits cleared in order for
|
||||
// invalidation for CSS/SMIL animation to work properly.
|
||||
(document && document->IsBeingUsedAsImage())) {
|
||||
frame->ClearInvalidationStateBits();
|
||||
}
|
||||
|
||||
bool temp = aBuilder->SetIsCompositingCheap(layerManager->IsCompositingCheap());
|
||||
LayerManager::EndTransactionFlags flags = LayerManager::END_DEFAULT;
|
||||
if (layerManager->NeedsWidgetInvalidation()) {
|
||||
|
@ -2644,25 +2626,53 @@ already_AddRefed<LayerManager> nsDisplayList::PaintRoot(nsDisplayListBuilder* aB
|
|||
}
|
||||
}
|
||||
|
||||
// If this is the content process, we ship plugin geometry updates over with layer
|
||||
// updates, so calculate that now before we call EndTransaction.
|
||||
nsRootPresContext* rootPresContext = presContext->GetRootPresContext();
|
||||
if (rootPresContext && XRE_IsContentProcess()) {
|
||||
if (aBuilder->WillComputePluginGeometry()) {
|
||||
rootPresContext->ComputePluginGeometryUpdates(aBuilder->RootReferenceFrame(), aBuilder, this);
|
||||
}
|
||||
// The layer system caches plugin configuration information for forwarding
|
||||
// with layer updates which needs to get set during reflow. This must be
|
||||
// called even if there are no windowed plugins in the page.
|
||||
rootPresContext->CollectPluginGeometryUpdates(layerManager);
|
||||
}
|
||||
|
||||
MaybeSetupTransactionIdAllocator(layerManager, presContext);
|
||||
|
||||
layerManager->EndTransaction(FrameLayerBuilder::DrawPaintedLayer,
|
||||
aBuilder, flags);
|
||||
// Store the existing layer builder to reinstate it on return.
|
||||
FrameLayerBuilder *oldBuilder = layerManager->GetLayerBuilder();
|
||||
FrameLayerBuilder *layerBuilder = nullptr;
|
||||
|
||||
bool sent = false;
|
||||
if (aFlags & PAINT_IDENTICAL_DISPLAY_LIST) {
|
||||
sent = layerManager->EndEmptyTransaction(flags);
|
||||
}
|
||||
|
||||
if (!sent) {
|
||||
layerBuilder = BuildLayers(aBuilder, layerManager,
|
||||
aFlags, widgetTransaction);
|
||||
|
||||
if (!layerBuilder) {
|
||||
layerManager->SetUserData(&gLayerManagerLayerBuilder, oldBuilder);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// If this is the content process, we ship plugin geometry updates over with layer
|
||||
// updates, so calculate that now before we call EndTransaction.
|
||||
nsRootPresContext* rootPresContext = presContext->GetRootPresContext();
|
||||
if (rootPresContext && XRE_IsContentProcess()) {
|
||||
if (aBuilder->WillComputePluginGeometry()) {
|
||||
rootPresContext->ComputePluginGeometryUpdates(aBuilder->RootReferenceFrame(), aBuilder, this);
|
||||
}
|
||||
// The layer system caches plugin configuration information for forwarding
|
||||
// with layer updates which needs to get set during reflow. This must be
|
||||
// called even if there are no windowed plugins in the page.
|
||||
rootPresContext->CollectPluginGeometryUpdates(layerManager);
|
||||
}
|
||||
|
||||
layerManager->EndTransaction(FrameLayerBuilder::DrawPaintedLayer,
|
||||
aBuilder, flags);
|
||||
layerBuilder->DidEndTransaction();
|
||||
}
|
||||
|
||||
if (widgetTransaction ||
|
||||
// SVG-as-an-image docs don't paint as part of the retained layer tree,
|
||||
// but they still need the invalidation state bits cleared in order for
|
||||
// invalidation for CSS/SMIL animation to work properly.
|
||||
(document && document->IsBeingUsedAsImage())) {
|
||||
frame->ClearInvalidationStateBits();
|
||||
}
|
||||
|
||||
aBuilder->SetIsCompositingCheap(temp);
|
||||
layerBuilder->DidEndTransaction();
|
||||
|
||||
if (document && widgetTransaction) {
|
||||
TriggerPendingAnimations(document, layerManager->GetAnimationReadyTime());
|
||||
|
|
|
@ -3025,7 +3025,8 @@ public:
|
|||
PAINT_USE_WIDGET_LAYERS = 0x01,
|
||||
PAINT_EXISTING_TRANSACTION = 0x04,
|
||||
PAINT_NO_COMPOSITE = 0x08,
|
||||
PAINT_COMPRESSED = 0x10
|
||||
PAINT_COMPRESSED = 0x10,
|
||||
PAINT_IDENTICAL_DISPLAY_LIST = 0x20
|
||||
};
|
||||
already_AddRefed<LayerManager> PaintRoot(nsDisplayListBuilder* aBuilder,
|
||||
gfxContext* aCtx,
|
||||
|
|
Загрузка…
Ссылка в новой задаче