author | Matt Woodrow <mwoodrow@mozilla.com> |
Sat, 30 Jun 2012 15:06:12 +1200 | |
changeset 98013 | 90ab708bab8b14ea75d49dee9db3b32c3bbbfbf5 |
parent 98012 | ba840bf34511473c2278236237e7a3340e3b6aca |
child 98014 | 65410094add4d86920290f69be224b14885a435f |
push id | 23017 |
push user | ryanvm@gmail.com |
push date | Sat, 30 Jun 2012 19:29:24 +0000 |
treeherder | mozilla-central@4c2ddc60f360 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc |
bugs | 739671 |
milestone | 16.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -84,18 +84,17 @@ public: FrameLayerBuilder* aLayerBuilder, nsIFrame* aContainerFrame, ContainerLayer* aContainerLayer, const FrameLayerBuilder::ContainerParameters& aParameters) : mBuilder(aBuilder), mManager(aManager), mLayerBuilder(aLayerBuilder), mContainerFrame(aContainerFrame), mContainerLayer(aContainerLayer), mParameters(aParameters), - mNextFreeRecycledThebesLayer(0), mNextFreeRecycledColorLayer(0), - mNextFreeRecycledImageLayer(0) + mNextFreeRecycledThebesLayer(0) { nsPresContext* presContext = aContainerFrame->PresContext(); mAppUnitsPerDevPixel = presContext->AppUnitsPerDevPixel(); // When AllowResidualTranslation is false, display items will be drawn // scaled with a translation by integer pixels, so we know how the snapping // will work. mSnappingEnabled = aManager->IsSnappingEffectiveTransforms() && !mParameters.AllowResidualTranslation(); @@ -294,22 +293,22 @@ protected: * a recycled ThebesLayer, and sets up the transform on the ThebesLayer * to account for scrolling. */ already_AddRefed<ThebesLayer> CreateOrRecycleThebesLayer(nsIFrame* aActiveScrolledRoot); /** * Grab the next recyclable ColorLayer, or create one if there are no * more recyclable ColorLayers. */ - already_AddRefed<ColorLayer> CreateOrRecycleColorLayer(); + already_AddRefed<ColorLayer> CreateOrRecycleColorLayer(ThebesLayer* aThebes); /** * Grab the next recyclable ImageLayer, or create one if there are no * more recyclable ImageLayers. */ - already_AddRefed<ImageLayer> CreateOrRecycleImageLayer(); + already_AddRefed<ImageLayer> CreateOrRecycleImageLayer(ThebesLayer* aThebes); /** * Grab a recyclable ImageLayer for use as a mask layer for aLayer (that is a * mask layer which has been used for aLayer before), or create one if such * a layer doesn't exist. */ already_AddRefed<ImageLayer> CreateOrRecycleMaskImageLayerFor(Layer* aLayer); /** * Grabs all ThebesLayers and ColorLayers from the ContainerLayer and makes them @@ -391,23 +390,19 @@ protected: /** * We collect the list of children in here. During ProcessDisplayItems, * the layers in this array either have mContainerLayer as their parent, * or no parent. */ typedef nsAutoTArray<nsRefPtr<Layer>,1> AutoLayersArray; AutoLayersArray mNewChildLayers; nsTArray<nsRefPtr<ThebesLayer> > mRecycledThebesLayers; - nsTArray<nsRefPtr<ColorLayer> > mRecycledColorLayers; - nsTArray<nsRefPtr<ImageLayer> > mRecycledImageLayers; nsDataHashtable<nsPtrHashKey<Layer>, nsRefPtr<ImageLayer> > mRecycledMaskImageLayers; PRUint32 mNextFreeRecycledThebesLayer; - PRUint32 mNextFreeRecycledColorLayer; - PRUint32 mNextFreeRecycledImageLayer; nscoord mAppUnitsPerDevPixel; bool mSnappingEnabled; }; class ThebesDisplayItemLayerUserData : public LayerUserData { public: ThebesDisplayItemLayerUserData() : @@ -433,16 +428,19 @@ public: * have a resolution scale, so we have to snap the ThebesLayer transform, so * 0,0 may not be exactly the top-left of the active scrolled root. Here we * store the coordinates in ThebesLayer space of the top-left of the * active scrolled root. */ gfxPoint mActiveScrolledRootPosition; nsIntRegion mRegionToInvalidate; + + nsRefPtr<ColorLayer> mColorLayer; + nsRefPtr<ImageLayer> mImageLayer; }; /* * User data for layers which will be used as masks. */ struct MaskLayerUserData : public LayerUserData { MaskLayerUserData() : mImageKey(nsnull) {} @@ -947,57 +945,59 @@ FrameLayerBuilder::GetInactiveLayerManag } } NS_ERROR("Failed to find data for display item"); return NULL; } already_AddRefed<ColorLayer> -ContainerState::CreateOrRecycleColorLayer() +ContainerState::CreateOrRecycleColorLayer(ThebesLayer *aThebes) { - nsRefPtr<ColorLayer> layer; - if (mNextFreeRecycledColorLayer < mRecycledColorLayers.Length()) { - // Recycle a layer - layer = mRecycledColorLayers[mNextFreeRecycledColorLayer]; - ++mNextFreeRecycledColorLayer; - // Clear clip rect and mask layer so we don't accidentally stay clipped. - // We will reapply any necessary clipping. + ThebesDisplayItemLayerUserData* data = + static_cast<ThebesDisplayItemLayerUserData*>(aThebes->GetUserData(&gThebesDisplayItemLayerUserData)); + nsRefPtr<ColorLayer> layer = data->mColorLayer; + if (layer) { layer->SetClipRect(nsnull); layer->SetMaskLayer(nsnull); } else { // Create a new layer layer = mManager->CreateColorLayer(); if (!layer) return nsnull; // Mark this layer as being used for Thebes-painting display items + data->mColorLayer = layer; layer->SetUserData(&gColorLayerUserData, nsnull); + + // Remove other layer types we might have stored for this ThebesLayer + data->mImageLayer = nsnull; } return layer.forget(); } already_AddRefed<ImageLayer> -ContainerState::CreateOrRecycleImageLayer() +ContainerState::CreateOrRecycleImageLayer(ThebesLayer *aThebes) { - nsRefPtr<ImageLayer> layer; - if (mNextFreeRecycledImageLayer < mRecycledImageLayers.Length()) { - // Recycle a layer - layer = mRecycledImageLayers[mNextFreeRecycledImageLayer]; - ++mNextFreeRecycledImageLayer; - // Clear clip rect and mask layer so we don't accidentally stay clipped. - // We will reapply any necessary clipping. + ThebesDisplayItemLayerUserData* data = + static_cast<ThebesDisplayItemLayerUserData*>(aThebes->GetUserData(&gThebesDisplayItemLayerUserData)); + nsRefPtr<ImageLayer> layer = data->mImageLayer; + if (layer) { layer->SetClipRect(nsnull); layer->SetMaskLayer(nsnull); } else { // Create a new layer layer = mManager->CreateImageLayer(); if (!layer) return nsnull; // Mark this layer as being used for Thebes-painting display items + data->mImageLayer = layer; layer->SetUserData(&gImageLayerUserData, nsnull); + + // Remove other layer types we might have stored for this ThebesLayer + data->mColorLayer = nsnull; } return layer.forget(); } already_AddRefed<ImageLayer> ContainerState::CreateOrRecycleMaskImageLayerFor(Layer* aLayer) { nsRefPtr<ImageLayer> result = mRecycledMaskImageLayers.Get(aLayer); @@ -1310,30 +1310,30 @@ ContainerState::PopThebesLayerData() nsRefPtr<Layer> layer; nsRefPtr<ImageContainer> imageContainer = data->CanOptimizeImageLayer(); if ((data->mIsSolidColorInVisibleRegion || imageContainer) && data->mLayer->GetValidRegion().IsEmpty()) { NS_ASSERTION(!(data->mIsSolidColorInVisibleRegion && imageContainer), "Can't be a solid color as well as an image!"); if (imageContainer) { - nsRefPtr<ImageLayer> imageLayer = CreateOrRecycleImageLayer(); + nsRefPtr<ImageLayer> imageLayer = CreateOrRecycleImageLayer(data->mLayer); imageLayer->SetContainer(imageContainer); data->mImage->ConfigureLayer(imageLayer); // The layer's current transform is applied first, then the result is scaled. gfx3DMatrix transform = imageLayer->GetTransform()* gfx3DMatrix::ScalingMatrix(mParameters.mXScale, mParameters.mYScale, 1.0f); imageLayer->SetTransform(transform); if (data->mItemClip.mHaveClipRect) { nsIntRect clip = ScaleToNearestPixels(data->mItemClip.mClipRect); imageLayer->IntersectClipRect(clip); } layer = imageLayer; } else { - nsRefPtr<ColorLayer> colorLayer = CreateOrRecycleColorLayer(); + nsRefPtr<ColorLayer> colorLayer = CreateOrRecycleColorLayer(data->mLayer); colorLayer->SetIsFixedPosition(data->mLayer->GetIsFixedPosition()); colorLayer->SetColor(data->mSolidColor); // Copy transform colorLayer->SetTransform(data->mLayer->GetTransform()); // Clip colorLayer to its visible region, since ColorLayers are // allowed to paint outside the visible region. Here we rely on the @@ -2174,21 +2174,17 @@ FrameLayerBuilder::FindOpaqueColorCoveri void ContainerState::CollectOldLayers() { for (Layer* layer = mContainerLayer->GetFirstChild(); layer; layer = layer->GetNextSibling()) { NS_ASSERTION(!layer->HasUserData(&gMaskLayerUserData), "Mask layer in layer tree; could not be recycled."); - if (layer->HasUserData(&gColorLayerUserData)) { - mRecycledColorLayers.AppendElement(static_cast<ColorLayer*>(layer)); - } else if (layer->HasUserData(&gImageLayerUserData)) { - mRecycledImageLayers.AppendElement(static_cast<ImageLayer*>(layer)); - } else if (layer->HasUserData(&gThebesDisplayItemLayerUserData)) { + if (layer->HasUserData(&gThebesDisplayItemLayerUserData)) { NS_ASSERTION(layer->AsThebesLayer(), "Wrong layer type"); mRecycledThebesLayers.AppendElement(static_cast<ThebesLayer*>(layer)); } if (Layer* maskLayer = layer->GetMaskLayer()) { NS_ASSERTION(maskLayer->GetType() == Layer::TYPE_IMAGE, "Could not recycle mask layer, unsupported layer type."); mRecycledMaskImageLayers.Put(layer, static_cast<ImageLayer*>(maskLayer));