Bug 1223479 - Fix displayport size calculation on fennec. r=kats

The displayport was accidentally being calculated as too large. This was
leading to a large number of tiles existing at once, causing very high
memory usage.
This commit is contained in:
Jamie Nicol 2015-11-11 09:38:12 +00:00
Родитель e5971201e2
Коммит 7f20521a78
2 изменённых файлов: 12 добавлений и 22 удалений

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

@ -1067,12 +1067,6 @@ GetDisplayPortFromMarginsData(nsIContent* aContent,
} }
} }
// Inflate the rectangle by 1 so that we always push to the next tile
// boundary. This is desirable to stop from having a rectangle with a
// moving origin occasionally being smaller when it coincidentally lines
// up to tile boundaries.
screenRect.Inflate(1);
ScreenPoint scrollPosScreen = LayoutDevicePoint::FromAppUnits(scrollPos, auPerDevPixel) ScreenPoint scrollPosScreen = LayoutDevicePoint::FromAppUnits(scrollPos, auPerDevPixel)
* res; * res;

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

@ -22,9 +22,6 @@ final class DisplayPortCalculator {
private static final String LOGTAG = "GeckoDisplayPort"; private static final String LOGTAG = "GeckoDisplayPort";
private static final PointF ZERO_VELOCITY = new PointF(0, 0); private static final PointF ZERO_VELOCITY = new PointF(0, 0);
// Keep this in sync with the TILEDLAYERBUFFER_TILE_SIZE defined in gfx/layers/TiledLayerBuffer.h
private static final int TILE_SIZE = 256;
private static final String PREF_DISPLAYPORT_STRATEGY = "gfx.displayport.strategy"; private static final String PREF_DISPLAYPORT_STRATEGY = "gfx.displayport.strategy";
private static final String PREF_DISPLAYPORT_FM_MULTIPLIER = "gfx.displayport.strategy_fm.multiplier"; private static final String PREF_DISPLAYPORT_FM_MULTIPLIER = "gfx.displayport.strategy_fm.multiplier";
private static final String PREF_DISPLAYPORT_FM_DANGER_X = "gfx.displayport.strategy_fm.danger_x"; private static final String PREF_DISPLAYPORT_FM_DANGER_X = "gfx.displayport.strategy_fm.danger_x";
@ -173,20 +170,19 @@ final class DisplayPortCalculator {
} }
/** /**
* Expand the given margins such that when they are applied on the viewport, the resulting rect * Calculate the display port by expanding the viewport by the specified
* does not have any partial tiles, except when it is clipped by the page bounds. This assumes * margins, then clamping to the page size.
* the tiles are TILE_SIZE by TILE_SIZE and start at the origin, such that there will always be
* a tile at (0,0)-(TILE_SIZE,TILE_SIZE)).
*/ */
private static DisplayPortMetrics getTileAlignedDisplayPortMetrics(RectF margins, float zoom, ImmutableViewportMetrics metrics) { private static DisplayPortMetrics getPageClampedDisplayPortMetrics(RectF margins, float zoom, ImmutableViewportMetrics metrics) {
float left = metrics.viewportRectLeft - margins.left; float left = metrics.viewportRectLeft - margins.left;
float top = metrics.viewportRectTop - margins.top; float top = metrics.viewportRectTop - margins.top;
float right = metrics.viewportRectRight() + margins.right; float right = metrics.viewportRectRight() + margins.right;
float bottom = metrics.viewportRectBottom() + margins.bottom; float bottom = metrics.viewportRectBottom() + margins.bottom;
left = (float) Math.max(metrics.pageRectLeft, TILE_SIZE * Math.floor(left / TILE_SIZE)); left = Math.max(metrics.pageRectLeft, left);
top = (float) Math.max(metrics.pageRectTop, TILE_SIZE * Math.floor(top / TILE_SIZE)); top = Math.max(metrics.pageRectTop, top);
right = (float) Math.min(metrics.pageRectRight, TILE_SIZE * Math.ceil(right / TILE_SIZE)); right = Math.min(metrics.pageRectRight, right);
bottom = (float) Math.min(metrics.pageRectBottom, TILE_SIZE * Math.ceil(bottom / TILE_SIZE)); bottom = Math.min(metrics.pageRectBottom, bottom);
return new DisplayPortMetrics(left, top, right, bottom, zoom); return new DisplayPortMetrics(left, top, right, bottom, zoom);
} }
@ -311,7 +307,7 @@ final class DisplayPortCalculator {
margins.bottom = verticalBuffer - margins.top; margins.bottom = verticalBuffer - margins.top;
margins = shiftMarginsForPageBounds(margins, metrics); margins = shiftMarginsForPageBounds(margins, metrics);
return getTileAlignedDisplayPortMetrics(margins, metrics.zoomFactor, metrics); return getPageClampedDisplayPortMetrics(margins, metrics.zoomFactor, metrics);
} }
@Override @Override
@ -422,7 +418,7 @@ final class DisplayPortCalculator {
RectF margins = velocityBiasedMargins(horizontalBuffer, verticalBuffer, velocity); RectF margins = velocityBiasedMargins(horizontalBuffer, verticalBuffer, velocity);
margins = shiftMarginsForPageBounds(margins, metrics); margins = shiftMarginsForPageBounds(margins, metrics);
return getTileAlignedDisplayPortMetrics(margins, metrics.zoomFactor, metrics); return getPageClampedDisplayPortMetrics(margins, metrics.zoomFactor, metrics);
} }
@Override @Override
@ -689,7 +685,7 @@ final class DisplayPortCalculator {
if (velocity.length() < VELOCITY_THRESHOLD) { if (velocity.length() < VELOCITY_THRESHOLD) {
// if we're going slow, expand the displayport to 9x viewport size // if we're going slow, expand the displayport to 9x viewport size
RectF margins = new RectF(width, height, width, height); RectF margins = new RectF(width, height, width, height);
return getTileAlignedDisplayPortMetrics(margins, metrics.zoomFactor, metrics); return getPageClampedDisplayPortMetrics(margins, metrics.zoomFactor, metrics);
} }
// figure out how far we expect to be // figure out how far we expect to be
@ -714,7 +710,7 @@ final class DisplayPortCalculator {
-Math.min(minDy, maxDy), -Math.min(minDy, maxDy),
Math.max(minDx, maxDx), Math.max(minDx, maxDx),
Math.max(minDy, maxDy)); Math.max(minDy, maxDy));
return getTileAlignedDisplayPortMetrics(margins, metrics.zoomFactor, metrics); return getPageClampedDisplayPortMetrics(margins, metrics.zoomFactor, metrics);
} }
@Override @Override