Bug 1364241. Handle empty transactions by keeping around the blob data. r=mchang

This just wasn't implemented before.
This commit is contained in:
Jeff Muizelaar 2017-05-11 18:32:36 -04:00
parent 77fae9e5d6
commit f9396fc921
2 changed files with 21 additions and 18 deletions

View File

@ -47,11 +47,11 @@ WebRenderPaintedLayerBlob::RenderLayer(wr::DisplayListBuilder& aBuilder,
}
IntSize imageSize(size.ToUnknownSize());
RefPtr<gfx::DrawEventRecorderMemory> recorder = MakeAndAddRef<gfx::DrawEventRecorderMemory>();
RefPtr<gfx::DrawTarget> dummyDt = gfx::Factory::CreateDrawTarget(gfx::BackendType::SKIA, imageSize, gfx::SurfaceFormat::B8G8R8X8);
RefPtr<gfx::DrawTarget> dt = gfx::Factory::CreateRecordingDrawTarget(recorder, dummyDt);
if (!regionToPaint.IsEmpty() && WrManager()->GetPaintedLayerCallback()) {
RefPtr<gfx::DrawEventRecorderMemory> recorder = MakeAndAddRef<gfx::DrawEventRecorderMemory>();
RefPtr<gfx::DrawTarget> dummyDt = gfx::Factory::CreateDrawTarget(gfx::BackendType::SKIA, imageSize, gfx::SurfaceFormat::B8G8R8X8);
RefPtr<gfx::DrawTarget> dt = gfx::Factory::CreateRecordingDrawTarget(recorder, dummyDt);
dt->ClearRect(Rect(0, 0, imageSize.width, imageSize.height));
dt->SetTransform(Matrix().PreTranslate(-bounds.x, -bounds.y));
RefPtr<gfxContext> ctx = gfxContext::CreatePreservingTransformOrNull(dt);
@ -67,18 +67,22 @@ WebRenderPaintedLayerBlob::RenderLayer(wr::DisplayListBuilder& aBuilder,
dt->FillRect(Rect(0, 0, imageSize.width, imageSize.height), ColorPattern(Color(1.0, 0.0, 0.0, 0.5)));
}
wr::ByteBuffer bytes;
bytes.Allocate(recorder->RecordingSize());
DebugOnly<bool> ok = recorder->CopyRecording((char*)bytes.AsSlice().begin().get(), bytes.AsSlice().length());
MOZ_ASSERT(ok);
//XXX: We should switch to updating the blob image instead of adding a new one
// That will get rid of this discard bit
if (mImageKey.isSome()) {
WrManager()->AddImageKeyForDiscard(mImageKey.value());
}
mImageKey = Some(GetImageKey());
WrBridge()->SendAddBlobImage(mImageKey.value(), imageSize, size.width * 4, dt->GetFormat(), bytes);
} else {
// we need to reuse the blob image
MOZ_ASSERT(mExternalImageId);
MOZ_ASSERT(mImageContainer->HasCurrentImage());
MOZ_ASSERT(GetInvalidRegion().IsEmpty());
}
wr::ByteBuffer bytes;
bytes.Allocate(recorder->RecordingSize());
DebugOnly<bool> ok = recorder->CopyRecording((char*)bytes.AsSlice().begin().get(), bytes.AsSlice().length());
MOZ_ASSERT(ok);
ScrollingLayersHelper scroller(this, aBuilder, aSc);
StackingContextHelper sc(aSc, aBuilder, this);
LayerRect rect = Bounds();
@ -90,11 +94,7 @@ WebRenderPaintedLayerBlob::RenderLayer(wr::DisplayListBuilder& aBuilder,
sc.ToRelativeWrRect(clipRect),
mask.ptrOr(nullptr));
WrImageKey key = GetImageKey();
WrBridge()->SendAddBlobImage(key, imageSize, size.width * 4, dt->GetFormat(), bytes);
WrManager()->AddImageKeyForDiscard(key);
aBuilder.PushImage(sc.ToRelativeWrRect(rect), clip, wr::ImageRendering::Auto, key);
aBuilder.PushImage(sc.ToRelativeWrRect(rect), clip, wr::ImageRendering::Auto, mImageKey.value());
}
} // namespace layers

View File

@ -35,6 +35,9 @@ protected:
if (mExternalImageId.isSome()) {
WrBridge()->DeallocExternalImageId(mExternalImageId.ref());
}
if (mImageKey.isSome()) {
WrManager()->AddImageKeyForDiscard(mImageKey.value());
}
}
wr::MaybeExternalImageId mExternalImageId;
@ -52,7 +55,7 @@ public:
private:
RefPtr<ImageContainer> mImageContainer;
RefPtr<ImageClient> mImageClient;
Maybe<WrImageKey> mImageKey;
};
} // namespace layers