Bug 1418374 - Discard blob image key when we create another new one. r=kats draft
authorEthan Lin <ethlin@mozilla.com>
Tue, 21 Nov 2017 11:49:42 +0800
changeset 701660 8967dc3249810f26117fc74b0e263adc12df6120
parent 699096 a3f183201f7f183c263d554bfb15fbf0b0ed2ea4
child 741226 71b37235a12afdd547fef9fe9e9ee88321419212
push id90226
push userbmo:ethlin@mozilla.com
push dateWed, 22 Nov 2017 02:35:12 +0000
reviewerskats
bugs1418374
milestone59.0a1
Bug 1418374 - Discard blob image key when we create another new one. r=kats MozReview-Commit-ID: FOa25SkYmdK
gfx/layers/wr/WebRenderUserData.cpp
gfx/layers/wr/WebRenderUserData.h
gfx/webrender_bindings/webrender_ffi_generated.h
--- 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;