Bug 1243589 - Use SingleTiledContentClient even for scrollable layers if the layer is smaller than a single tile. r?mattwoodrow draft
authorKartikaya Gupta <kgupta@mozilla.com>
Wed, 10 Feb 2016 18:09:21 -0500
changeset 330185 62392c187fe5c8010c3d59225623dca0a737a8b6
parent 330112 ac39fba33c6daf95b2cda71e588ca18e2eb752ab
child 514124 57364181a3316c4548701eac25a00d17b5ec8244
push id10704
push userkgupta@mozilla.com
push dateWed, 10 Feb 2016 23:10:53 +0000
reviewersmattwoodrow
bugs1243589
milestone47.0a1
Bug 1243589 - Use SingleTiledContentClient even for scrollable layers if the layer is smaller than a single tile. r?mattwoodrow MozReview-Commit-ID: HKbSqgBa70q
gfx/layers/client/ClientTiledPaintedLayer.cpp
gfx/layers/client/ClientTiledPaintedLayer.h
gfx/layers/client/SingleTiledContentClient.cpp
gfx/layers/client/SingleTiledContentClient.h
gfx/layers/client/TiledContentClient.h
--- a/gfx/layers/client/ClientTiledPaintedLayer.cpp
+++ b/gfx/layers/client/ClientTiledPaintedLayer.cpp
@@ -23,16 +23,17 @@
 
 namespace mozilla {
 namespace layers {
 
 ClientTiledPaintedLayer::ClientTiledPaintedLayer(ClientLayerManager* const aManager,
                                                ClientLayerManager::PaintedLayerCreationHint aCreationHint)
   : PaintedLayer(aManager, static_cast<ClientLayer*>(this), aCreationHint)
   , mContentClient()
+  , mHaveSingleTiledContentClient(false)
 {
   MOZ_COUNT_CTOR(ClientTiledPaintedLayer);
   mPaintData.mLastScrollOffset = ParentLayerPoint(0, 0);
   mPaintData.mFirstPaint = true;
 }
 
 ClientTiledPaintedLayer::~ClientTiledPaintedLayer()
 {
@@ -406,28 +407,36 @@ ClientTiledPaintedLayer::EndPaint()
 void
 ClientTiledPaintedLayer::RenderLayer()
 {
   LayerManager::DrawPaintedLayerCallback callback =
     ClientManager()->GetPaintedLayerCallback();
   void *data = ClientManager()->GetPaintedLayerCallbackData();
 
   IntSize layerSize = mVisibleRegion.ToUnknownRegion().GetBounds().Size();
-  if (mContentClient && !mContentClient->SupportsLayerSize(layerSize, ClientManager())) {
+  IntSize tileSize(gfxPlatform::GetPlatform()->GetTileWidth(),
+                   gfxPlatform::GetPlatform()->GetTileHeight());
+
+  bool wantSingleTiledContentClient =
+      (mCreationHint == LayerManager::NONE || layerSize <= tileSize) &&
+      SingleTiledContentClient::ClientSupportsLayerSize(layerSize, ClientManager()) &&
+      gfxPrefs::LayersSingleTileEnabled();
+
+  if (mContentClient && mHaveSingleTiledContentClient && !wantSingleTiledContentClient) {
     mContentClient = nullptr;
     mValidRegion.SetEmpty();
   }
 
   if (!mContentClient) {
-    if (mCreationHint == LayerManager::NONE &&
-        SingleTiledContentClient::ClientSupportsLayerSize(layerSize, ClientManager()) &&
-        gfxPrefs::LayersSingleTileEnabled()) {
+    if (wantSingleTiledContentClient) {
       mContentClient = new SingleTiledContentClient(this, ClientManager());
+      mHaveSingleTiledContentClient = true;
     } else {
       mContentClient = new MultiTiledContentClient(this, ClientManager());
+      mHaveSingleTiledContentClient = false;
     }
 
     mContentClient->Connect();
     ClientManager()->AsShadowForwarder()->Attach(mContentClient, this);
     MOZ_ASSERT(mContentClient->GetForwarder());
   }
 
   if (mContentClient->GetTiledBuffer()->HasFormatChanged()) {
--- a/gfx/layers/client/ClientTiledPaintedLayer.h
+++ b/gfx/layers/client/ClientTiledPaintedLayer.h
@@ -128,16 +128,19 @@ private:
 
   /**
    * This causes the paint to be marked as finished, and updates any data
    * necessary to persist until the next paint.
    */
   void EndPaint();
 
   RefPtr<TiledContentClient> mContentClient;
+  // Flag to indicate if mContentClient is a SingleTiledContentClient. This is
+  // only valid when mContentClient is non-null.
+  bool mHaveSingleTiledContentClient;
   nsIntRegion mLowPrecisionValidRegion;
   BasicTiledLayerPaintData mPaintData;
 };
 
 } // namespace layers
 } // namespace mozilla
 
 #endif
--- a/gfx/layers/client/SingleTiledContentClient.cpp
+++ b/gfx/layers/client/SingleTiledContentClient.cpp
@@ -41,22 +41,16 @@ SingleTiledContentClient::UpdatedBuffer(
 
 /* static */ bool
 SingleTiledContentClient::ClientSupportsLayerSize(const gfx::IntSize& aSize, ClientLayerManager* aManager)
 {
   int32_t maxTextureSize = aManager->GetMaxTextureSize();
   return aSize.width <= maxTextureSize && aSize.height <= maxTextureSize;
 }
 
-bool
-SingleTiledContentClient::SupportsLayerSize(const gfx::IntSize& aSize, ClientLayerManager* aManager) const
-{
-  return ClientSupportsLayerSize(aSize, aManager);
-}
-
 ClientSingleTiledLayerBuffer::ClientSingleTiledLayerBuffer(ClientTiledPaintedLayer* aPaintedLayer,
                                                            CompositableClient* aCompositableClient,
                                                            ClientLayerManager* aManager)
   : ClientTiledLayerBuffer(aPaintedLayer, aCompositableClient)
   , mManager(aManager)
   , mFormat(gfx::SurfaceFormat::UNKNOWN)
 {
 }
--- a/gfx/layers/client/SingleTiledContentClient.h
+++ b/gfx/layers/client/SingleTiledContentClient.h
@@ -122,18 +122,16 @@ public:
 
   virtual void ClearCachedResources() override;
 
   virtual void UpdatedBuffer(TiledBufferType aType) override;
 
   virtual ClientTiledLayerBuffer* GetTiledBuffer() override { return mTiledBuffer; }
   virtual ClientTiledLayerBuffer* GetLowPrecisionTiledBuffer() override { return nullptr; }
 
-  virtual bool SupportsLayerSize(const gfx::IntSize& aSize, ClientLayerManager* aManager) const override;
-
 private:
   RefPtr<ClientSingleTiledLayerBuffer> mTiledBuffer;
 };
 
 }
 }
 
 #endif
--- a/gfx/layers/client/TiledContentClient.h
+++ b/gfx/layers/client/TiledContentClient.h
@@ -623,19 +623,16 @@ public:
   virtual ClientTiledLayerBuffer* GetLowPrecisionTiledBuffer() = 0;
 
   enum TiledBufferType {
     TILED_BUFFER,
     LOW_PRECISION_TILED_BUFFER
   };
   virtual void UpdatedBuffer(TiledBufferType aType) = 0;
 
-  virtual bool SupportsLayerSize(const gfx::IntSize& aSize, ClientLayerManager* aManager) const
-  { return true; }
-
 private:
   const char* mName;
 };
 
 /**
  * An implementation of TiledContentClient that supports
  * multiple tiles and a low precision buffer.
  */