Bug 1418374 - Discard blob image key when we create another new one. r=kats
MozReview-Commit-ID: FOa25SkYmdK
--- a/gfx/layers/wr/WebRenderUserData.cpp
+++ b/gfx/layers/wr/WebRenderUserData.cpp
@@ -152,16 +152,26 @@ WebRenderImageData::UpdateImageKey(Image
key = WrBridge()->GetNextImageKey();
aResources.AddExternalImage(mExternalImageId.value(), key);
mKey = Some(key);
mOwnsKey = true;
return mKey;
}
+void
+WebRenderImageData::SetKey(const wr::ImageKey& aKey)
+{
+ if (mKey) {
+ MOZ_ASSERT(mKey.value() != aKey);
+ mWRManager->AddImageKeyForDiscard(mKey.value());
+ }
+ mKey = Some(aKey);
+}
+
already_AddRefed<ImageClient>
WebRenderImageData::GetImageClient()
{
RefPtr<ImageClient> imageClient = mImageClient;
return imageClient.forget();
}
void
--- a/gfx/layers/wr/WebRenderUserData.h
+++ b/gfx/layers/wr/WebRenderUserData.h
@@ -75,17 +75,17 @@ class WebRenderImageData : public WebRen
public:
explicit WebRenderImageData(WebRenderLayerManager* aWRManager, nsDisplayItem* aItem);
virtual ~WebRenderImageData();
virtual WebRenderImageData* AsImageData() override { return this; }
virtual UserDataType GetType() override { return UserDataType::eImage; }
static UserDataType Type() { return UserDataType::eImage; }
Maybe<wr::ImageKey> GetKey() { return mKey; }
- void SetKey(const wr::ImageKey& aKey) { mKey = Some(aKey); }
+ void SetKey(const wr::ImageKey& aKey);
already_AddRefed<ImageClient> GetImageClient();
Maybe<wr::ImageKey> UpdateImageKey(ImageContainer* aContainer,
wr::IpcResourceUpdateQueue& aResources,
bool aForceUpdate = false);
void CreateAsyncImageWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
ImageContainer* aContainer,
--- a/gfx/webrender_bindings/webrender_ffi_generated.h
+++ b/gfx/webrender_bindings/webrender_ffi_generated.h
@@ -508,16 +508,20 @@ struct ComplexClipRegion {
struct ImageKey {
IdNamespace mNamespace;
uint32_t mHandle;
bool operator==(const ImageKey& aOther) const {
return mNamespace == aOther.mNamespace &&
mHandle == aOther.mHandle;
}
+ bool operator!=(const ImageKey& aOther) const {
+ return mNamespace != aOther.mNamespace ||
+ mHandle != aOther.mHandle;
+ }
};
typedef ImageKey WrImageKey;
struct WrImageMask {
WrImageKey image;
LayoutRect rect;
bool repeat;