Bug 539356 - Part 20 - Simplify regions to avoid excessive region calculation. r=roc

This commit is contained in:
Oleg Romashin 2012-08-29 17:48:43 +12:00
parent e084d5ff7f
commit 67b104cbd1
8 changed files with 22 additions and 14 deletions

View File

@ -117,7 +117,7 @@ struct LayerPropertiesBase : public LayerProperties
} }
result = result.Union(ComputeChangeInternal(aCallback)); result = result.Union(ComputeChangeInternal(aCallback));
result = result.Union(TransformRect(mLayer->GetInvalidRect(), mTransform)); result = result.Union(TransformRect(mLayer->GetInvalidRegion().GetBounds(), mTransform));
if (mMaskLayer && otherMask) { if (mMaskLayer && otherMask) {
nsIntRect maskDiff = mMaskLayer->ComputeChange(aCallback); nsIntRect maskDiff = mMaskLayer->ComputeChange(aCallback);

View File

@ -961,23 +961,23 @@ public:
* Returns the current area of the layer (in layer-space coordinates) * Returns the current area of the layer (in layer-space coordinates)
* marked as needed to be recomposited. * marked as needed to be recomposited.
*/ */
const nsIntRect& GetInvalidRect() { return mInvalidRect; } const nsIntRegion& GetInvalidRegion() { return mInvalidRegion; }
/** /**
* Mark the entirety of the layer's visible region as being invalid. * Mark the entirety of the layer's visible region as being invalid.
*/ */
void SetInvalidRectToVisibleRegion() { mInvalidRect = GetVisibleRegion().GetBounds(); } void SetInvalidRectToVisibleRegion() { mInvalidRegion = GetVisibleRegion(); }
/** /**
* Adds to the current invalid rect. * Adds to the current invalid rect.
*/ */
void AddInvalidRect(const nsIntRect& aRect) { mInvalidRect = mInvalidRect.Union(aRect); } void AddInvalidRect(const nsIntRect& aRect) { mInvalidRegion.Or(mInvalidRegion, aRect); }
/** /**
* Clear the invalid rect, marking the layer as being identical to what is currently * Clear the invalid rect, marking the layer as being identical to what is currently
* composited. * composited.
*/ */
void ClearInvalidRect() { mInvalidRect.SetEmpty(); } void ClearInvalidRect() { mInvalidRegion.SetEmpty(); }
#ifdef DEBUG #ifdef DEBUG
@ -1041,7 +1041,7 @@ protected:
float mOpacity; float mOpacity;
nsIntRect mClipRect; nsIntRect mClipRect;
nsIntRect mTileSourceRect; nsIntRect mTileSourceRect;
nsIntRect mInvalidRect; nsIntRegion mInvalidRegion;
uint32_t mContentFlags; uint32_t mContentFlags;
bool mUseClipRect; bool mUseClipRect;
bool mUseTileSourceRect; bool mUseTileSourceRect;

View File

@ -37,8 +37,9 @@ public:
{ {
NS_ASSERTION(BasicManager()->InConstruction(), NS_ASSERTION(BasicManager()->InConstruction(),
"Can only set properties in construction phase"); "Can only set properties in construction phase");
mValidRegion.Sub(mValidRegion, aRegion); mInvalidRegion.Or(mInvalidRegion, aRegion);
AddInvalidRect(aRegion.GetBounds()); mInvalidRegion.SimplifyOutward(10);
mValidRegion.Sub(mValidRegion, mInvalidRegion);
} }
virtual void PaintThebes(gfxContext* aContext, virtual void PaintThebes(gfxContext* aContext,

View File

@ -45,8 +45,9 @@ ThebesLayerD3D10::~ThebesLayerD3D10()
void void
ThebesLayerD3D10::InvalidateRegion(const nsIntRegion &aRegion) ThebesLayerD3D10::InvalidateRegion(const nsIntRegion &aRegion)
{ {
mValidRegion.Sub(mValidRegion, aRegion); mInvalidRegion.Or(mInvalidRegion, aRegion);
AddInvalidRect(aRegion.GetBounds()); mInvalidRegion.SimplifyOutward(10);
mValidRegion.Sub(mValidRegion, mInvalidRegion);
} }
void ThebesLayerD3D10::CopyRegion(ID3D10Texture2D* aSrc, const nsIntPoint &aSrcOffset, void ThebesLayerD3D10::CopyRegion(ID3D10Texture2D* aSrc, const nsIntPoint &aSrcOffset,

View File

@ -49,8 +49,9 @@ ThebesLayerD3D9::~ThebesLayerD3D9()
void void
ThebesLayerD3D9::InvalidateRegion(const nsIntRegion &aRegion) ThebesLayerD3D9::InvalidateRegion(const nsIntRegion &aRegion)
{ {
mValidRegion.Sub(mValidRegion, aRegion); mInvalidRegion.Or(mInvalidRegion, aRegion);
AddInvalidRect(aRegion.GetBounds()); mInvalidRegion.SimplifyOutward(10);
mValidRegion.Sub(mValidRegion, mInvalidRegion);
} }
void void

View File

@ -789,8 +789,9 @@ ThebesLayerOGL::SetVisibleRegion(const nsIntRegion &aRegion)
void void
ThebesLayerOGL::InvalidateRegion(const nsIntRegion &aRegion) ThebesLayerOGL::InvalidateRegion(const nsIntRegion &aRegion)
{ {
mValidRegion.Sub(mValidRegion, aRegion); mInvalidRegion.Or(mInvalidRegion, aRegion);
AddInvalidRect(aRegion.GetBounds()); mInvalidRegion.SimplifyOutward(10);
mValidRegion.Sub(mValidRegion, mInvalidRegion);
} }
void void

View File

@ -1092,6 +1092,8 @@ void nsDisplayList::PaintForFrame(nsDisplayListBuilder* aBuilder,
nsIntRect invalid; nsIntRect invalid;
if (props) { if (props) {
invalid = props->ComputeDifferences(root, computeInvalidFunc); invalid = props->ComputeDifferences(root, computeInvalidFunc);
} else if (widgetTransaction) {
LayerProperties::ClearInvalidations(root);
} }
if (view) { if (view) {

View File

@ -5254,6 +5254,8 @@ PresShell::Paint(nsIView* aViewToPaint,
nsIntRect invalid; nsIntRect invalid;
if (props) { if (props) {
invalid = props->ComputeDifferences(layerManager->GetRoot(), computeInvalidFunc); invalid = props->ComputeDifferences(layerManager->GetRoot(), computeInvalidFunc);
} else {
LayerProperties::ClearInvalidations(layerManager->GetRoot());
} }
if (!invalid.IsEmpty()) { if (!invalid.IsEmpty()) {
if (props) { if (props) {