diff --git a/gfx/layers/wr/WebRenderPaintedLayerBlob.cpp b/gfx/layers/wr/WebRenderPaintedLayerBlob.cpp index 1c6519f5e6ad..f621a7653e41 100644 --- a/gfx/layers/wr/WebRenderPaintedLayerBlob.cpp +++ b/gfx/layers/wr/WebRenderPaintedLayerBlob.cpp @@ -47,11 +47,11 @@ WebRenderPaintedLayerBlob::RenderLayer(wr::DisplayListBuilder& aBuilder, } IntSize imageSize(size.ToUnknownSize()); - RefPtr recorder = MakeAndAddRef(); - RefPtr dummyDt = gfx::Factory::CreateDrawTarget(gfx::BackendType::SKIA, imageSize, gfx::SurfaceFormat::B8G8R8X8); - RefPtr dt = gfx::Factory::CreateRecordingDrawTarget(recorder, dummyDt); - if (!regionToPaint.IsEmpty() && WrManager()->GetPaintedLayerCallback()) { + RefPtr recorder = MakeAndAddRef(); + RefPtr dummyDt = gfx::Factory::CreateDrawTarget(gfx::BackendType::SKIA, imageSize, gfx::SurfaceFormat::B8G8R8X8); + RefPtr dt = gfx::Factory::CreateRecordingDrawTarget(recorder, dummyDt); + dt->ClearRect(Rect(0, 0, imageSize.width, imageSize.height)); dt->SetTransform(Matrix().PreTranslate(-bounds.x, -bounds.y)); RefPtr 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 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 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 diff --git a/gfx/layers/wr/WebRenderPaintedLayerBlob.h b/gfx/layers/wr/WebRenderPaintedLayerBlob.h index 3e0d5d58ee05..3e0569ced430 100644 --- a/gfx/layers/wr/WebRenderPaintedLayerBlob.h +++ b/gfx/layers/wr/WebRenderPaintedLayerBlob.h @@ -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 mImageContainer; RefPtr mImageClient; - + Maybe mImageKey; }; } // namespace layers