Bug 1382314 - Fix invalidation problem for layers-free mode. r=jrmuizel
MozReview-Commit-ID: 8z03n7zmvOz
--- a/gfx/layers/wr/WebRenderLayerManager.cpp
+++ b/gfx/layers/wr/WebRenderLayerManager.cpp
@@ -375,25 +375,31 @@ WebRenderLayerManager::PushItemAsImage(n
LayerPoint offset = ViewAs<LayerPixel>(
LayoutDevicePoint::FromAppUnits(aItem->ToReferenceFrame() + shift, appUnitsPerDevPixel),
PixelCastJustification::WebRenderHasUnitResolution);
nsRegion invalidRegion;
nsAutoPtr<nsDisplayItemGeometry> geometry = fallbackData->GetGeometry();
if (geometry) {
- nsPoint shift = itemBounds.TopLeft() - geometry->mBounds.TopLeft();
- geometry->MoveBy(shift);
- aItem->ComputeInvalidationRegion(aDisplayListBuilder, geometry, &invalidRegion);
- nsRect lastBounds = fallbackData->GetBounds();
- lastBounds.MoveBy(shift);
+ nsRect invalid;
+ if (aItem->IsInvalid(invalid)) {
+ invalidRegion.OrWith(clippedBounds);
+ } else {
+ nsPoint shift = itemBounds.TopLeft() - geometry->mBounds.TopLeft();
+ geometry->MoveBy(shift);
+ aItem->ComputeInvalidationRegion(aDisplayListBuilder, geometry, &invalidRegion);
- if (!lastBounds.IsEqualInterior(clippedBounds)) {
- invalidRegion.OrWith(lastBounds);
- invalidRegion.OrWith(clippedBounds);
+ nsRect lastBounds = fallbackData->GetBounds();
+ lastBounds.MoveBy(shift);
+
+ if (!lastBounds.IsEqualInterior(clippedBounds)) {
+ invalidRegion.OrWith(lastBounds);
+ invalidRegion.OrWith(clippedBounds);
+ }
}
}
if (!geometry || !invalidRegion.IsEmpty()) {
if (gfxPrefs::WebRenderBlobImages()) {
RefPtr<gfx::DrawEventRecorderMemory> recorder = MakeAndAddRef<gfx::DrawEventRecorderMemory>();
RefPtr<gfx::DrawTarget> dummyDt =
gfx::Factory::CreateDrawTarget(gfx::BackendType::SKIA, gfx::IntSize(1, 1), gfx::SurfaceFormat::B8G8R8X8);