Bug 1404181 - Part 7: Add a way to check if existing painted items might need to be redrawn for a sync decode. r?mstange draft
authorMatt Woodrow <mwoodrow@mozilla.com>, Miko Mynttinen <mikokm@gmail.com>, Timothy Nikkel <tnikkel@gmail.com>
Wed, 27 Sep 2017 17:03:38 +1300
changeset 684518 a606e05994158caabea55f01b782de6ebe8cc52c
parent 684517 4885d6d3a073eadab76efbd4001673075ea4fa74
child 684519 d0752e7c27fed49affd863f47293b0d26de7cb77
push id85633
push usermwoodrow@mozilla.com
push dateSun, 22 Oct 2017 23:03:02 +0000
reviewersmstange
bugs1404181
milestone58.0a1
Bug 1404181 - Part 7: Add a way to check if existing painted items might need to be redrawn for a sync decode. r?mstange MozReview-Commit-ID: 98qxakaKolI
layout/generic/nsBulletFrame.cpp
layout/generic/nsPluginFrame.cpp
layout/generic/nsPluginFrame.h
layout/painting/nsDisplayListInvalidation.h
--- a/layout/generic/nsBulletFrame.cpp
+++ b/layout/generic/nsBulletFrame.cpp
@@ -183,16 +183,21 @@ public:
   nsDisplayBulletGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder)
     : nsDisplayItemGenericGeometry(aItem, aBuilder)
     , nsImageGeometryMixin(aItem, aBuilder)
   {
     nsBulletFrame* f = static_cast<nsBulletFrame*>(aItem->Frame());
     mOrdinal = f->GetOrdinal();
   }
 
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return ShouldInvalidateToSyncDecodeImages();
+  }
+
   int32_t mOrdinal;
 };
 
 class BulletRenderer final
 {
 public:
   BulletRenderer(imgIContainer* image, const nsRect& dest)
     : mImage(image)
--- a/layout/generic/nsPluginFrame.cpp
+++ b/layout/generic/nsPluginFrame.cpp
@@ -910,16 +910,21 @@ public:
   }
 
   LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
                                    LayerManager* aManager,
                                    const ContainerLayerParameters& aParameters) override
   {
     return LAYER_ACTIVE;
   }
+
+  virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override
+  {
+    return new nsDisplayPluginGeometry(this, aBuilder);
+  }
 };
 
 static nsRect
 GetDisplayItemBounds(nsDisplayListBuilder* aBuilder,
                      const nsDisplayItem* aItem,
                      nsIFrame* aFrame)
 {
   // XXX For slightly more accurate region computations we should pixel-snap this
--- a/layout/generic/nsPluginFrame.h
+++ b/layout/generic/nsPluginFrame.h
@@ -343,16 +343,31 @@ private:
   // plugins we register on the root PresContext.
   // This is only non-null while we have a plugin registered for geometry
   // updates.
   RefPtr<nsRootPresContext> mRootPresContextRegisteredWith;
 
   mozilla::UniquePtr<PluginFrameDidCompositeObserver> mDidCompositeObserver;
 };
 
+class nsDisplayPluginGeometry : public nsDisplayItemGenericGeometry
+{
+public:
+  nsDisplayPluginGeometry(nsDisplayItem *aItem, nsDisplayListBuilder* aBuilder)
+    : nsDisplayItemGenericGeometry(aItem, aBuilder)
+  {}
+
+  // Plugins MozPaintWait event depends on sync decode, so we always want
+  // to rebuild the display list when sync decoding.
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return true;
+  }
+};
+
 class nsDisplayPlugin : public nsDisplayItem {
 public:
   nsDisplayPlugin(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame)
     : nsDisplayItem(aBuilder, aFrame)
   {
     MOZ_COUNT_CTOR(nsDisplayPlugin);
     aBuilder->SetContainsPluginItem();
   }
@@ -386,16 +401,21 @@ public:
   virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
                                    LayerManager* aManager,
                                    const ContainerLayerParameters& aParameters) override
   {
     return static_cast<nsPluginFrame*>(mFrame)->GetLayerState(aBuilder,
                                                               aManager);
   }
 
+  virtual nsDisplayItemGeometry* AllocateGeometry(nsDisplayListBuilder* aBuilder) override
+  {
+    return new nsDisplayPluginGeometry(this, aBuilder);
+  }
+
   virtual bool CreateWebRenderCommands(mozilla::wr::DisplayListBuilder& aBuilder,
                                        mozilla::wr::IpcResourceUpdateQueue& aResources,
                                        const StackingContextHelper& aSc,
                                        mozilla::layers::WebRenderLayerManager* aManager,
                                        nsDisplayListBuilder* aDisplayListBuilder) override;
 };
 
 #endif /* nsPluginFrame_h___ */
--- a/layout/painting/nsDisplayListInvalidation.h
+++ b/layout/painting/nsDisplayListInvalidation.h
@@ -56,16 +56,21 @@ public:
    *
    * @param aOffset Offset to shift by.
    */
   virtual void MoveBy(const nsPoint& aOffset)
   {
     mBounds.MoveBy(aOffset);
   }
 
+  virtual bool InvalidateForSyncDecodeImages() const
+  {
+    return false;
+  }
+
   /**
    * Bounds of the display item
    */
   nsRect mBounds;
 };
 
 /**
  * A default geometry implementation, used by nsDisplayItem. Retains
@@ -165,16 +170,21 @@ class nsDisplayItemGenericImageGeometry
   , public nsImageGeometryMixin<nsDisplayItemGenericImageGeometry>
 {
 public:
   nsDisplayItemGenericImageGeometry(nsDisplayItem* aItem,
                                     nsDisplayListBuilder* aBuilder)
     : nsDisplayItemGenericGeometry(aItem, aBuilder)
     , nsImageGeometryMixin(aItem, aBuilder)
   { }
+
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return ShouldInvalidateToSyncDecodeImages();
+  }
 };
 
 class nsDisplayItemBoundsGeometry : public nsDisplayItemGeometry
 {
 public:
   nsDisplayItemBoundsGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder);
 
   bool mHasRoundedCorners;
@@ -184,28 +194,38 @@ class nsDisplayBorderGeometry
   : public nsDisplayItemGeometry
   , public nsImageGeometryMixin<nsDisplayBorderGeometry>
 {
 public:
   nsDisplayBorderGeometry(nsDisplayItem* aItem, nsDisplayListBuilder* aBuilder);
 
   virtual void MoveBy(const nsPoint& aOffset) override;
 
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return ShouldInvalidateToSyncDecodeImages();
+  }
+
   nsRect mContentRect;
 };
 
 class nsDisplayBackgroundGeometry
   : public nsDisplayItemGeometry
   , public nsImageGeometryMixin<nsDisplayBackgroundGeometry>
 {
 public:
   nsDisplayBackgroundGeometry(nsDisplayBackgroundImage* aItem, nsDisplayListBuilder* aBuilder);
 
   virtual void MoveBy(const nsPoint& aOffset) override;
 
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return ShouldInvalidateToSyncDecodeImages();
+  }
+
   nsRect mPositioningArea;
   nsRect mDestRect;
 };
 
 class nsDisplayThemedBackgroundGeometry : public nsDisplayItemGeometry
 {
 public:
   nsDisplayThemedBackgroundGeometry(nsDisplayThemedBackground* aItem, nsDisplayListBuilder* aBuilder);
@@ -281,25 +301,35 @@ public:
 };
 
 class nsDisplayMaskGeometry : public nsDisplaySVGEffectGeometry
   , public nsImageGeometryMixin<nsDisplayMaskGeometry>
 {
 public:
   nsDisplayMaskGeometry(nsDisplayMask* aItem, nsDisplayListBuilder* aBuilder);
 
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return ShouldInvalidateToSyncDecodeImages();
+  }
+
   nsTArray<nsRect> mDestRects;
 };
 
 class nsDisplayFilterGeometry : public nsDisplaySVGEffectGeometry
   , public nsImageGeometryMixin<nsDisplayFilterGeometry>
 {
 public:
   nsDisplayFilterGeometry(nsDisplayFilter* aItem,
                           nsDisplayListBuilder* aBuilder);
+
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return ShouldInvalidateToSyncDecodeImages();
+  }
 };
 
 class nsCharClipGeometry : public nsDisplayItemGenericGeometry
 {
 public:
   nsCharClipGeometry(nsCharClipDisplayItem* aItem,
                      nsDisplayListBuilder* aBuilder);
 
@@ -311,12 +341,17 @@ class nsDisplayTableItemGeometry
   : public nsDisplayItemGenericGeometry
   , public nsImageGeometryMixin<nsDisplayTableItemGeometry>
 {
 public:
   nsDisplayTableItemGeometry(nsDisplayTableItem* aItem,
                              nsDisplayListBuilder* aBuilder,
                              const nsPoint& aFrameOffsetToViewport);
 
+  virtual bool InvalidateForSyncDecodeImages() const override
+  {
+    return ShouldInvalidateToSyncDecodeImages();
+  }
+
   nsPoint mFrameOffsetToViewport;
 };
 
 #endif /*NSDISPLAYLISTINVALIDATION_H_*/