Bug 1243589 - Use SingleTiledContentClient even for scrollable layers if the layer is smaller than a single tile. r?mattwoodrow
MozReview-Commit-ID: HKbSqgBa70q
--- 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.
*/