Backed out 2 changesets (bug 1048110) for various Android mochitest failures on a CLOSED TREE

Backed out changeset 1cf6f4f27811 (bug 1048110)
Backed out changeset b89f54e21c0b (bug 1048110)
This commit is contained in:
Wes Kocher 2014-08-06 18:32:52 -07:00
parent 36f47ccc2f
commit 7128337cab
14 changed files with 64 additions and 74 deletions

View File

@ -204,20 +204,6 @@ struct BaseRect {
}
void Inflate(const SizeT& aSize) { Inflate(aSize.width, aSize.height); }
void InflateToMultiple(const SizeT& aMultiple)
{
T xMost = XMost();
T yMost = YMost();
x = static_cast<T>(floor(x / aMultiple.width)) * aMultiple.width;
y = static_cast<T>(floor(y / aMultiple.height)) * aMultiple.height;
xMost = static_cast<T>(ceil(x / aMultiple.width)) * aMultiple.width;
yMost = static_cast<T>(ceil(y / aMultiple.height)) * aMultiple.height;
width = xMost - x;
height = yMost - y;
}
void Deflate(T aD) { Deflate(aD, aD); }
void Deflate(T aDx, T aDy)
{

View File

@ -1434,14 +1434,6 @@ public:
virtual int32_t GetMaxLayerSize() { return Manager()->GetMaxTextureSize(); }
/**
* Returns true if this layer's effective transform is not just
* a translation by integers, or if this layer or some ancestor layer
* is marked as having a transform that may change without a full layer
* transaction.
*/
bool MayResample();
protected:
Layer(LayerManager* aManager, void* aImplData);
@ -1490,6 +1482,14 @@ protected:
const gfxRect& aSnapRect,
gfx::Matrix* aResidualTransform);
/**
* Returns true if this layer's effective transform is not just
* a translation by integers, or if this layer or some ancestor layer
* is marked as having a transform that may change without a full layer
* transaction.
*/
bool MayResample();
LayerManager* mManager;
ContainerLayer* mParent;
Layer* mNextSibling;

View File

@ -335,23 +335,8 @@ ClientTiledThebesLayer::RenderLayer()
TILING_LOG("TILING %p: Initial valid region %s\n", this, Stringify(mValidRegion).c_str());
TILING_LOG("TILING %p: Initial low-precision valid region %s\n", this, Stringify(mLowPrecisionValidRegion).c_str());
nsIntRegion neededRegion = mVisibleRegion;
if (MayResample()) {
// If we're resampling then bilinear filtering can read up to 1 pixel
// outside of our texture coords. Make the visible region a single rect,
// and pad it out by 1 pixel (restricted to tile boundaries) so that
// we always have valid content or transparent pixels to sample from.
nsIntRect bounds = neededRegion.GetBounds();
nsIntRect wholeTiles = bounds;
wholeTiles.Inflate(nsIntSize(gfxPrefs::LayersTileWidth(), gfxPrefs::LayersTileHeight()));
nsIntRect padded = bounds;
padded.Inflate(1);
padded.IntersectRect(padded, wholeTiles);
neededRegion = padded;
}
nsIntRegion invalidRegion;
invalidRegion.Sub(neededRegion, mValidRegion);
invalidRegion.Sub(mVisibleRegion, mValidRegion);
if (invalidRegion.IsEmpty()) {
EndPaint();
return;
@ -366,7 +351,7 @@ ClientTiledThebesLayer::RenderLayer()
// In some cases we can take a fast path and just be done with it.
if (UseFastPath()) {
TILING_LOG("TILING %p: Taking fast-path\n", this);
mValidRegion = neededRegion;
mValidRegion = mVisibleRegion;
mContentClient->mTiledBuffer.PaintThebes(mValidRegion, invalidRegion, callback, data);
ClientManager()->Hold(this);
mContentClient->UseTiledLayerBuffer(TiledContentClient::TILED_BUFFER);
@ -383,7 +368,7 @@ ClientTiledThebesLayer::RenderLayer()
// Make sure that tiles that fall outside of the visible region or outside of the
// critical displayport are discarded on the first update. Also make sure that we
// only draw stuff inside the critical displayport on the first update.
mValidRegion.And(mValidRegion, neededRegion);
mValidRegion.And(mValidRegion, mVisibleRegion);
if (!mPaintData.mCriticalDisplayPort.IsEmpty()) {
mValidRegion.And(mValidRegion, LayerIntRect::ToUntyped(mPaintData.mCriticalDisplayPort));
invalidRegion.And(invalidRegion, LayerIntRect::ToUntyped(mPaintData.mCriticalDisplayPort));
@ -402,7 +387,7 @@ ClientTiledThebesLayer::RenderLayer()
if (gfxPrefs::UseLowPrecisionBuffer()) {
// Calculate the invalid region for the low precision buffer. Make sure
// to remove the valid high-precision area so we don't double-paint it.
lowPrecisionInvalidRegion.Sub(neededRegion, mLowPrecisionValidRegion);
lowPrecisionInvalidRegion.Sub(mVisibleRegion, mLowPrecisionValidRegion);
lowPrecisionInvalidRegion.Sub(lowPrecisionInvalidRegion, mValidRegion);
}
TILING_LOG("TILING %p: Low-precision invalid region %s\n", this, Stringify(lowPrecisionInvalidRegion).c_str());

View File

@ -327,11 +327,6 @@ ClientTiledLayerBuffer::GetContentType(SurfaceMode* aMode) const
content = gfxContentType::COLOR;
}
#endif
} else if (mode == SurfaceMode::SURFACE_OPAQUE) {
if (mThebesLayer->MayResample()) {
mode = SurfaceMode::SURFACE_SINGLE_CHANNEL_ALPHA;
content = gfxContentType::COLOR_ALPHA;
}
}
if (aMode) {

View File

@ -37,6 +37,14 @@ class DataSourceSurface;
namespace layers {
// Some properties of a Layer required for tiling
struct TiledLayerProperties
{
nsIntRegion mVisibleRegion;
nsIntRegion mValidRegion;
CSSToScreenScale mEffectiveResolution;
};
class Layer;
class SurfaceDescriptor;
class Compositor;
@ -113,7 +121,8 @@ public:
const gfx::Matrix4x4& aTransform,
const gfx::Filter& aFilter,
const gfx::Rect& aClipRect,
const nsIntRegion* aVisibleRegion = nullptr) = 0;
const nsIntRegion* aVisibleRegion = nullptr,
TiledLayerProperties* aLayerProperties = nullptr) = 0;
/**
* Update the content host.

View File

@ -27,6 +27,7 @@ namespace layers {
ContentHostBase::ContentHostBase(const TextureInfo& aTextureInfo)
: ContentHost(aTextureInfo)
, mPaintWillResample(false)
, mInitialised(false)
{}
@ -40,7 +41,8 @@ ContentHostBase::Composite(EffectChain& aEffectChain,
const gfx::Matrix4x4& aTransform,
const Filter& aFilter,
const Rect& aClipRect,
const nsIntRegion* aVisibleRegion)
const nsIntRegion* aVisibleRegion,
TiledLayerProperties* aLayerProperties)
{
NS_ASSERTION(aVisibleRegion, "Requires a visible region");

View File

@ -64,16 +64,12 @@ public:
const nsIntRegion& aOldValidRegionBack,
nsIntRegion* aUpdatedRegionBack) = 0;
virtual void SetPaintWillResample(bool aResample) { mPaintWillResample = aResample; }
bool PaintWillResample() { return mPaintWillResample; }
virtual void SetPaintWillResample(bool aResample) { }
protected:
ContentHost(const TextureInfo& aTextureInfo)
: CompositableHost(aTextureInfo)
, mPaintWillResample(false)
{}
bool mPaintWillResample;
};
/**
@ -101,7 +97,10 @@ public:
const gfx::Matrix4x4& aTransform,
const gfx::Filter& aFilter,
const gfx::Rect& aClipRect,
const nsIntRegion* aVisibleRegion = nullptr);
const nsIntRegion* aVisibleRegion = nullptr,
TiledLayerProperties* aLayerProperties = nullptr);
virtual void SetPaintWillResample(bool aResample) { mPaintWillResample = aResample; }
virtual NewTextureSource* GetTextureSource() = 0;
virtual NewTextureSource* GetTextureSourceOnWhite() = 0;
@ -114,9 +113,11 @@ protected:
return mBufferRect.TopLeft() - mBufferRotation;
}
bool PaintWillResample() { return mPaintWillResample; }
nsIntRect mBufferRect;
nsIntPoint mBufferRotation;
bool mPaintWillResample;
bool mInitialised;
};

View File

@ -65,7 +65,8 @@ ImageHost::Composite(EffectChain& aEffectChain,
const gfx::Matrix4x4& aTransform,
const gfx::Filter& aFilter,
const gfx::Rect& aClipRect,
const nsIntRegion* aVisibleRegion)
const nsIntRegion* aVisibleRegion,
TiledLayerProperties* aLayerProperties)
{
if (!GetCompositor()) {
// should only happen when a tab is dragged to another window and

View File

@ -50,7 +50,8 @@ public:
const gfx::Matrix4x4& aTransform,
const gfx::Filter& aFilter,
const gfx::Rect& aClipRect,
const nsIntRegion* aVisibleRegion = nullptr) MOZ_OVERRIDE;
const nsIntRegion* aVisibleRegion = nullptr,
TiledLayerProperties* aLayerProperties = nullptr) MOZ_OVERRIDE;
virtual void UseTextureHost(TextureHost* aTexture) MOZ_OVERRIDE;

View File

@ -38,6 +38,7 @@ ThebesLayerComposite::ThebesLayerComposite(LayerManagerComposite *aManager)
: ThebesLayer(aManager, nullptr)
, LayerComposite(aManager)
, mBuffer(nullptr)
, mRequiresTiledProperties(false)
{
MOZ_COUNT_CTOR(ThebesLayerComposite);
mImplData = static_cast<LayerComposite*>(this);
@ -134,6 +135,13 @@ ThebesLayerComposite::RenderLayer(const nsIntRect& aClipRect)
const nsIntRegion& visibleRegion = GetEffectiveVisibleRegion();
TiledLayerProperties tiledLayerProps;
if (mRequiresTiledProperties) {
tiledLayerProps.mVisibleRegion = visibleRegion;
tiledLayerProps.mEffectiveResolution = GetEffectiveResolution();
tiledLayerProps.mValidRegion = mValidRegion;
}
mBuffer->SetPaintWillResample(MayResample());
mBuffer->Composite(effectChain,
@ -141,9 +149,15 @@ ThebesLayerComposite::RenderLayer(const nsIntRect& aClipRect)
GetEffectiveTransform(),
GetEffectFilter(),
clipRect,
&visibleRegion);
&visibleRegion,
mRequiresTiledProperties ? &tiledLayerProps
: nullptr);
mBuffer->BumpFlashCounter();
if (mRequiresTiledProperties) {
mValidRegion = tiledLayerProps.mValidRegion;
}
mCompositeManager->GetCompositor()->MakeCurrent();
}

View File

@ -65,6 +65,8 @@ public:
virtual LayerComposite* AsLayerComposite() MOZ_OVERRIDE { return this; }
void EnsureTiled() { mRequiresTiledProperties = true; }
virtual void InvalidateRegion(const nsIntRegion& aRegion)
{
NS_RUNTIMEABORT("ThebesLayerComposites can't fill invalidated regions");
@ -90,6 +92,7 @@ private:
private:
RefPtr<ContentHost> mBuffer;
bool mRequiresTiledProperties;
};
} /* layers */

View File

@ -241,6 +241,7 @@ TiledContentHost::Attach(Layer* aLayer,
AttachFlags aFlags /* = NO_FLAGS */)
{
CompositableHost::Attach(aLayer, aCompositor, aFlags);
static_cast<ThebesLayerComposite*>(aLayer)->EnsureTiled();
}
void
@ -323,8 +324,11 @@ TiledContentHost::Composite(EffectChain& aEffectChain,
const gfx::Matrix4x4& aTransform,
const gfx::Filter& aFilter,
const gfx::Rect& aClipRect,
const nsIntRegion* aVisibleRegion /* = nullptr */)
const nsIntRegion* aVisibleRegion /* = nullptr */,
TiledLayerProperties* aLayerProperties /* = nullptr */)
{
MOZ_ASSERT(aLayerProperties, "aLayerProperties required for TiledContentHost");
if (mPendingUpload) {
mTiledBuffer.SetCompositor(mCompositor);
mTiledBuffer.Upload();
@ -370,25 +374,13 @@ TiledContentHost::Composite(EffectChain& aEffectChain,
(aOpacity == 1.0f && backgroundColor.a == 1.0f)
? gfxPrefs::LowPrecisionOpacity() : 1.0f;
nsIntRegion tmpRegion;
const nsIntRegion* renderRegion;
if (PaintWillResample()) {
// If we're resampling, then the texture image will contain exactly the
// entire visible region's bounds, and we should draw it all in one quad
// to avoid unexpected aliasing.
tmpRegion = aVisibleRegion->GetBounds();
renderRegion = &tmpRegion;
} else {
renderRegion = aVisibleRegion;
}
// Render the low and high precision buffers.
RenderLayerBuffer(mLowPrecisionTiledBuffer,
lowPrecisionOpacityReduction < 1.0f ? &backgroundColor : nullptr,
aEffectChain, lowPrecisionOpacityReduction * aOpacity,
aFilter, aClipRect, *renderRegion, aTransform);
aFilter, aClipRect, aLayerProperties->mVisibleRegion, aTransform);
RenderLayerBuffer(mTiledBuffer, nullptr, aEffectChain, aOpacity, aFilter,
aClipRect, *renderRegion, aTransform);
aClipRect, aLayerProperties->mVisibleRegion, aTransform);
// Now release the old buffer if it had double-buffered tiles, as we can
// guarantee that they're no longer on the screen (and so any locks that may

View File

@ -223,7 +223,8 @@ public:
const gfx::Matrix4x4& aTransform,
const gfx::Filter& aFilter,
const gfx::Rect& aClipRect,
const nsIntRegion* aVisibleRegion = nullptr);
const nsIntRegion* aVisibleRegion = nullptr,
TiledLayerProperties* aLayerProperties = nullptr);
virtual CompositableType GetType() { return CompositableType::BUFFER_TILED; }

View File

@ -68,7 +68,7 @@ fuzzy(3,7860) fuzzy-if(cocoaWidget,5,89041) fuzzy-if(azureSkiaGL,2,90000) == rad
== radial-position-1a.html radial-position-1-ref.html
== radial-position-1b.html radial-position-1-ref.html
fuzzy-if(azureQuartz,4,22317) == radial-shape-closest-corner-1a.html radial-shape-closest-corner-1-ref.html
fuzzy(1,238) fuzzy-if(cocoaWidget,3,460) fuzzy-if(azureQuartz,4,22608) == radial-shape-closest-corner-1b.html radial-shape-closest-corner-1-ref.html
fuzzy(1,232) fuzzy-if(cocoaWidget,3,460) fuzzy-if(azureQuartz,4,22608) == radial-shape-closest-corner-1b.html radial-shape-closest-corner-1-ref.html
fuzzy-if(azureQuartz,2,41171) == radial-shape-closest-corner-1c.html radial-shape-closest-corner-1-ref.html
fuzzy-if(/^Windows\x20NT\x206\.2/.test(http.oscpu),1,5) fuzzy-if(Android,17,3880) == radial-shape-closest-side-1a.html radial-shape-closest-side-1-ref.html
fuzzy-if(/^Windows\x20NT\x206\.2/.test(http.oscpu),1,5) fuzzy-if(Android,17,3880) == radial-shape-closest-side-1b.html radial-shape-closest-side-1-ref.html