From 57ca0b8c399451051474c10cde842550f1047aa8 Mon Sep 17 00:00:00 2001 From: Markus Stange Date: Sun, 20 Sep 2015 18:34:04 +0200 Subject: [PATCH] Bug 1195400 - Don't use SingleTiledContentClient for layers that are larger than the maximum texture size. r=mattwoodrow --HG-- extra : commitid : 3YaqNF6sPAT extra : rebase_source : af64e3bd795a34d63dea4a5c89014156c8838d13 extra : histedit_source : c0ee79ad404abf3c0270c40ae63f178e04e7a8ab --- gfx/layers/client/ClientTiledPaintedLayer.cpp | 9 ++++++++- gfx/layers/client/SingleTiledContentClient.cpp | 13 +++++++++++++ gfx/layers/client/SingleTiledContentClient.h | 3 +++ gfx/layers/client/TiledContentClient.h | 3 +++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/gfx/layers/client/ClientTiledPaintedLayer.cpp b/gfx/layers/client/ClientTiledPaintedLayer.cpp index 8de49052dd43..f7df347b39a5 100644 --- a/gfx/layers/client/ClientTiledPaintedLayer.cpp +++ b/gfx/layers/client/ClientTiledPaintedLayer.cpp @@ -410,9 +410,16 @@ ClientTiledPaintedLayer::RenderLayer() ClientManager()->GetPaintedLayerCallback(); void *data = ClientManager()->GetPaintedLayerCallbackData(); + IntSize layerSize = mVisibleRegion.GetBounds().Size(); + if (mContentClient && !mContentClient->SupportsLayerSize(layerSize, ClientManager())) { + ClearCachedResources(); + MOZ_ASSERT(!mContentClient); + } + if (!mContentClient) { #if defined(MOZ_B2G) || defined(XP_MACOSX) - if (mCreationHint == LayerManager::NONE) { + if (mCreationHint == LayerManager::NONE && + SingleTiledContentClient::ClientSupportsLayerSize(layerSize, ClientManager())) { mContentClient = new SingleTiledContentClient(this, ClientManager()); } else #endif diff --git a/gfx/layers/client/SingleTiledContentClient.cpp b/gfx/layers/client/SingleTiledContentClient.cpp index c7a1360ea875..b6f64f80f98e 100644 --- a/gfx/layers/client/SingleTiledContentClient.cpp +++ b/gfx/layers/client/SingleTiledContentClient.cpp @@ -40,6 +40,19 @@ SingleTiledContentClient::UpdatedBuffer(TiledBufferType aType) mTiledBuffer->ClearPaintedRegion(); } +/* static */ bool +SingleTiledContentClient::ClientSupportsLayerSize(const IntSize& aSize, ClientLayerManager* aManager) +{ + int32_t maxTextureSize = aManager->GetMaxTextureSize(); + return aSize.width <= maxTextureSize && aSize.height <= maxTextureSize; +} + +bool +SingleTiledContentClient::SupportsLayerSize(const IntSize& aSize, ClientLayerManager* aManager) const +{ + return ClientSupportsLayerSize(aSize, aManager); +} + ClientSingleTiledLayerBuffer::ClientSingleTiledLayerBuffer(ClientTiledPaintedLayer* aPaintedLayer, CompositableClient* aCompositableClient, ClientLayerManager* aManager) diff --git a/gfx/layers/client/SingleTiledContentClient.h b/gfx/layers/client/SingleTiledContentClient.h index 33a01c5c44cc..be7f19b3f966 100644 --- a/gfx/layers/client/SingleTiledContentClient.h +++ b/gfx/layers/client/SingleTiledContentClient.h @@ -119,6 +119,7 @@ protected: } public: + static bool ClientSupportsLayerSize(const IntSize& aSize, ClientLayerManager* aManager); virtual void ClearCachedResources() override; @@ -127,6 +128,8 @@ public: virtual ClientTiledLayerBuffer* GetTiledBuffer() override { return mTiledBuffer; } virtual ClientTiledLayerBuffer* GetLowPrecisionTiledBuffer() override { return nullptr; } + virtual bool SupportsLayerSize(const IntSize& aSize, ClientLayerManager* aManager) const override; + private: nsRefPtr mTiledBuffer; }; diff --git a/gfx/layers/client/TiledContentClient.h b/gfx/layers/client/TiledContentClient.h index b2ba44b81d60..a204bd5b0e22 100644 --- a/gfx/layers/client/TiledContentClient.h +++ b/gfx/layers/client/TiledContentClient.h @@ -623,6 +623,9 @@ public: }; virtual void UpdatedBuffer(TiledBufferType aType) = 0; + virtual bool SupportsLayerSize(const IntSize& aSize, ClientLayerManager* aManager) const + { return true; } + private: const char* mName; };