mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 04:45:45 +00:00
Bug 1364241. Handle empty transactions by keeping around the blob data. r=mchang
This just wasn't implemented before.
This commit is contained in:
parent
77fae9e5d6
commit
f9396fc921
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user