merge mozilla-central to mozilla-inbound. r=merge a=merge

This commit is contained in:
Sebastian Hengst 2017-11-19 15:07:33 +02:00
Родитель 8e2d781184 c633ffa4c4
Коммит 14e2187cb1
5 изменённых файлов: 37 добавлений и 77 удалений

Просмотреть файл

@ -644,7 +644,7 @@ private:
DECL_GFX_PREF(Live, "layout.css.touch_action.enabled", TouchActionEnabled, bool, false);
DECL_GFX_PREF(Live, "layout.display-list.build-twice", LayoutDisplayListBuildTwice, bool, false);
DECL_GFX_PREF(Live, "layout.display-list.retain", LayoutRetainDisplayList, bool, true);
DECL_GFX_PREF(Once, "layout.display-list.retain", LayoutRetainDisplayList, bool, true);
DECL_GFX_PREF(Live, "layout.display-list.rebuild-frame-limit", LayoutRebuildFrameLimit, uint32_t, 500);
DECL_GFX_PREF(Live, "layout.display-list.dump", LayoutDumpDisplayList, bool, false);
DECL_GFX_PREF(Live, "layout.display-list.dump-content", LayoutDumpDisplayListContent, bool, false);

Просмотреть файл

@ -3618,33 +3618,6 @@ nsLayoutUtils::AddExtraBackgroundItems(nsDisplayListBuilder& aBuilder,
}
}
/**
* Returns a retained display list builder for frame |aFrame|. If there is no
* retained display list builder property set for the frame, and if the flag
* |aRetainingEnabled| is true, a new retained display list builder is created,
* stored as a property for the frame, and returned.
*/
static RetainedDisplayListBuilder*
GetOrCreateRetainedDisplayListBuilder(nsIFrame* aFrame, bool aRetainingEnabled,
bool aBuildCaret)
{
RetainedDisplayListBuilder* retainedBuilder =
aFrame->GetProperty(RetainedDisplayListBuilder::Cached());
if (retainedBuilder) {
return retainedBuilder;
}
if (aRetainingEnabled) {
retainedBuilder =
new RetainedDisplayListBuilder(aFrame, nsDisplayListBuilderMode::PAINTING,
aBuildCaret);
aFrame->SetProperty(RetainedDisplayListBuilder::Cached(), retainedBuilder);
}
return retainedBuilder;
}
nsresult
nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
const nsRegion& aDirtyRegion, nscolor aBackstop,
@ -3681,28 +3654,31 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
TimeStamp startBuildDisplayList = TimeStamp::Now();
const bool buildCaret = !(aFlags & PaintFrameFlags::PAINT_HIDE_CARET);
const bool isForPainting = (aFlags & PaintFrameFlags::PAINT_WIDGET_LAYERS) &&
aBuilderMode == nsDisplayListBuilderMode::PAINTING;
// Retained display list builder is currently only used for content processes.
const bool retainingEnabled = isForPainting &&
gfxPrefs::LayoutRetainDisplayList() && XRE_IsContentProcess();
RetainedDisplayListBuilder* retainedBuilder =
GetOrCreateRetainedDisplayListBuilder(aFrame, retainingEnabled, buildCaret);
// Only use the retained display list builder if the retaining is currently
// enabled. This check is needed because it is possible that the pref has been
// disabled after creating the retained display list builder.
const bool useRetainedBuilder = retainedBuilder && retainingEnabled;
Maybe<nsDisplayListBuilder> nonRetainedBuilder;
Maybe<nsDisplayList> nonRetainedList;
nsDisplayListBuilder* builderPtr = nullptr;
nsDisplayList* listPtr = nullptr;
RetainedDisplayListBuilder* retainedBuilder = nullptr;
if (useRetainedBuilder) {
const bool buildCaret = !(aFlags & PaintFrameFlags::PAINT_HIDE_CARET);
// Enable display list retaining if the pref is set and if we are in a
// content process.
const bool retainDisplayList =
gfxPrefs::LayoutRetainDisplayList() && XRE_IsContentProcess();
if (retainDisplayList &&
aBuilderMode == nsDisplayListBuilderMode::PAINTING &&
(aFlags & PaintFrameFlags::PAINT_WIDGET_LAYERS)) {
retainedBuilder = aFrame->GetProperty(RetainedDisplayListBuilder::Cached());
if (!retainedBuilder) {
retainedBuilder =
new RetainedDisplayListBuilder(aFrame, aBuilderMode, buildCaret);
aFrame->SetProperty(RetainedDisplayListBuilder::Cached(), retainedBuilder);
}
MOZ_ASSERT(retainedBuilder);
builderPtr = retainedBuilder->Builder();
listPtr = retainedBuilder->List();
} else {
@ -3711,16 +3687,6 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
nonRetainedList.emplace();
listPtr = nonRetainedList.ptr();
}
// Retained builder exists, but display list retaining is disabled.
if (!useRetainedBuilder && retainedBuilder) {
// Clear the modified frames lists and frame properties.
retainedBuilder->ClearModifiedFrameProps();
// Clear the retained display list.
retainedBuilder->List()->DeleteAll(retainedBuilder->Builder());
}
nsDisplayListBuilder& builder = *builderPtr;
nsDisplayList& list = *listPtr;
@ -3850,12 +3816,14 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
builder.IsBuildingLayerEventRegions() &&
nsLayoutUtils::HasDocumentLevelListenersForApzAwareEvents(presShell));
const bool paintedPreviously =
aFrame->HasProperty(nsIFrame::ModifiedFrameList());
// Attempt to do a partial build and merge into the existing list.
// This calls BuildDisplayListForStacking context on a subset of the
// viewport.
bool merged = false;
if (useRetainedBuilder) {
if (retainedBuilder && paintedPreviously) {
merged = retainedBuilder->AttemptPartialUpdate(aBackstop);
}
@ -4089,11 +4057,12 @@ nsLayoutUtils::PaintFrame(gfxContext* aRenderingContext, nsIFrame* aFrame,
AUTO_PROFILER_TRACING("Paint", "DisplayListResources");
// Flush the list so we don't trigger the IsEmpty-on-destruction assertion
if (!useRetainedBuilder) {
if (!retainedBuilder) {
list.DeleteAll(&builder);
builder.EndFrame();
} else {
builder.EndFrame();
}
builder.EndFrame();
}
return NS_OK;
}

Просмотреть файл

@ -1052,6 +1052,14 @@ nsIFrame::MarkNeedsDisplayItemRebuild()
modifiedFrames->AppendElement(this);
// TODO: this is a bit of a hack. We are using ModifiedFrameList property to
// decide whether we are trying to reuse the display list.
if (displayRoot != rootFrame &&
!displayRoot->HasProperty(nsIFrame::ModifiedFrameList())) {
displayRoot->SetProperty(nsIFrame::ModifiedFrameList(),
new nsTArray<nsIFrame*>());
}
MOZ_ASSERT(PresContext()->LayoutPhaseCount(eLayoutPhase_DisplayListBuilding) == 0);
SetFrameIsModified(true);

Просмотреть файл

@ -792,15 +792,6 @@ ClearFrameProps(nsTArray<nsIFrame*>& aFrames)
}
}
void
RetainedDisplayListBuilder::ClearModifiedFrameProps()
{
nsTArray<nsIFrame*> modifiedFrames =
GetModifiedFrames(mBuilder.RootReferenceFrame());
ClearFrameProps(modifiedFrames);
}
bool
RetainedDisplayListBuilder::AttemptPartialUpdate(nscolor aBackstop)
{

Просмотреть файл

@ -27,14 +27,6 @@ struct RetainedDisplayListBuilder {
bool AttemptPartialUpdate(nscolor aBackstop);
/**
* Iterates through the display list builder reference frame document and
* subdocuments, and clears the modified frame lists from the root frames.
* Also clears the frame properties set by RetainedDisplayListBuilder for all
* the frames in the modified frame lists.
*/
void ClearModifiedFrameProps();
NS_DECLARE_FRAME_PROPERTY_DELETABLE(Cached, RetainedDisplayListBuilder)
private: