| OLD | NEW | 
|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "config.h" | 5 #include "config.h" | 
| 6 | 6 | 
| 7 #include "CCPrioritizedTexture.h" | 7 #include "CCPrioritizedTexture.h" | 
| 8 | 8 | 
| 9 #include "CCPrioritizedTextureManager.h" | 9 #include "CCPrioritizedTextureManager.h" | 
| 10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread | 10 #include "CCSingleThreadProxy.h" // For DebugScopedSetImplThread | 
| 11 #include "CCTexture.h" | 11 #include "CCTexture.h" | 
| 12 #include "CCTiledLayerTestCommon.h" | 12 #include "CCTiledLayerTestCommon.h" | 
| 13 #include "FakeCCGraphicsContext.h" | 13 #include "FakeCCGraphicsContext.h" | 
| 14 #include "WebCompositorInitializer.h" | 14 #include "WebCompositorInitializer.h" | 
| 15 #include <gtest/gtest.h> | 15 #include <gtest/gtest.h> | 
| 16 | 16 | 
| 17 using namespace cc; | 17 using namespace cc; | 
| 18 using namespace WebKitTests; | 18 using namespace WebKitTests; | 
| 19 using namespace WTF; | 19 using namespace WTF; | 
| 20 | 20 | 
| 21 namespace { | 21 namespace cc { | 
| 22 | 22 | 
| 23 class CCPrioritizedTextureTest : public testing::Test { | 23 class CCPrioritizedTextureTest : public testing::Test { | 
| 24 public: | 24 public: | 
| 25     CCPrioritizedTextureTest() | 25     CCPrioritizedTextureTest() | 
| 26         : m_textureSize(256, 256) | 26         : m_textureSize(256, 256) | 
| 27         , m_textureFormat(GraphicsContext3D::RGBA) | 27         , m_textureFormat(GraphicsContext3D::RGBA) | 
| 28         , m_compositorInitializer(0) | 28         , m_compositorInitializer(0) | 
| 29         , m_context(WebKit::createFakeCCGraphicsContext()) | 29         , m_context(WebKit::createFakeCCGraphicsContext()) | 
| 30     { | 30     { | 
| 31         DebugScopedSetImplThread implThread; | 31         DebugScopedSetImplThread implThread; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 43         return CCTexture::memorySizeBytes(m_textureSize, m_textureFormat) * text
     ureCount; | 43         return CCTexture::memorySizeBytes(m_textureSize, m_textureFormat) * text
     ureCount; | 
| 44     } | 44     } | 
| 45 | 45 | 
| 46     PassOwnPtr<CCPrioritizedTextureManager> createManager(size_t maxTextures) | 46     PassOwnPtr<CCPrioritizedTextureManager> createManager(size_t maxTextures) | 
| 47     { | 47     { | 
| 48         return CCPrioritizedTextureManager::create(texturesMemorySize(maxTexture
     s), 1024, 0); | 48         return CCPrioritizedTextureManager::create(texturesMemorySize(maxTexture
     s), 1024, 0); | 
| 49     } | 49     } | 
| 50 | 50 | 
| 51     bool validateTexture(OwnPtr<CCPrioritizedTexture>& texture, bool requestLate
     ) | 51     bool validateTexture(OwnPtr<CCPrioritizedTexture>& texture, bool requestLate
     ) | 
| 52     { | 52     { | 
| 53 #if !ASSERT_DISABLED | 53         textureManagerAssertInvariants(texture->textureManager()); | 
| 54         texture->textureManager()->assertInvariants(); |  | 
| 55 #endif |  | 
| 56         if (requestLate) | 54         if (requestLate) | 
| 57             texture->requestLate(); | 55             texture->requestLate(); | 
|  | 56         textureManagerAssertInvariants(texture->textureManager()); | 
| 58         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 57         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
| 59         bool success = texture->canAcquireBackingTexture(); | 58         bool success = texture->canAcquireBackingTexture(); | 
| 60         if (success) | 59         if (success) | 
| 61             texture->acquireBackingTexture(resourceProvider()); | 60             texture->acquireBackingTexture(resourceProvider()); | 
| 62         return success; | 61         return success; | 
| 63     } | 62     } | 
| 64 | 63 | 
|  | 64     void prioritizeTexturesAndBackings(CCPrioritizedTextureManager* textureManag
     er) | 
|  | 65     { | 
|  | 66         textureManager->prioritizeTextures(); | 
|  | 67         textureManagerUpdateBackingsPriorities(textureManager); | 
|  | 68     } | 
|  | 69 | 
|  | 70     void textureManagerUpdateBackingsPriorities(CCPrioritizedTextureManager* tex
     tureManager) | 
|  | 71     { | 
|  | 72         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
|  | 73         textureManager->updateBackingsPriorities(); | 
|  | 74     } | 
|  | 75 | 
| 65     CCResourceProvider* resourceProvider() | 76     CCResourceProvider* resourceProvider() | 
| 66     { | 77     { | 
| 67        return m_resourceProvider.get(); | 78        return m_resourceProvider.get(); | 
| 68     } | 79     } | 
| 69 | 80 | 
|  | 81     void textureManagerAssertInvariants(CCPrioritizedTextureManager* textureMana
     ger) | 
|  | 82     { | 
|  | 83 #if !ASSERT_DISABLED | 
|  | 84         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
|  | 85         textureManager->assertInvariants(); | 
|  | 86 #endif | 
|  | 87     } | 
|  | 88 | 
|  | 89     bool textureBackingIsAbovePriorityCutoff(CCPrioritizedTexture* texture) | 
|  | 90     { | 
|  | 91         return texture->m_backing->wasAbovePriorityCutoffAtLastPriorityUpdate(); | 
|  | 92     } | 
|  | 93 | 
| 70 protected: | 94 protected: | 
| 71     const IntSize m_textureSize; | 95     const IntSize m_textureSize; | 
| 72     const GC3Denum m_textureFormat; | 96     const GC3Denum m_textureFormat; | 
| 73     WebCompositorInitializer m_compositorInitializer; | 97     WebCompositorInitializer m_compositorInitializer; | 
| 74     OwnPtr<CCGraphicsContext> m_context; | 98     OwnPtr<CCGraphicsContext> m_context; | 
| 75     OwnPtr<CCResourceProvider> m_resourceProvider; | 99     OwnPtr<CCResourceProvider> m_resourceProvider; | 
| 76 }; | 100 }; | 
| 77 | 101 | 
|  | 102 } | 
|  | 103 | 
|  | 104 namespace { | 
|  | 105 | 
| 78 TEST_F(CCPrioritizedTextureTest, requestTextureExceedingMaxLimit) | 106 TEST_F(CCPrioritizedTextureTest, requestTextureExceedingMaxLimit) | 
| 79 { | 107 { | 
| 80     const size_t maxTextures = 8; | 108     const size_t maxTextures = 8; | 
| 81     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(maxTextur
     es); | 109     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(maxTextur
     es); | 
| 82 | 110 | 
| 83     // Create textures for double our memory limit. | 111     // Create textures for double our memory limit. | 
| 84     OwnPtr<CCPrioritizedTexture> textures[maxTextures*2]; | 112     OwnPtr<CCPrioritizedTexture> textures[maxTextures*2]; | 
| 85 | 113 | 
| 86     for (size_t i = 0; i < maxTextures*2; ++i) | 114     for (size_t i = 0; i < maxTextures*2; ++i) | 
| 87         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 115         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
| 88 | 116 | 
| 89     // Set decreasing priorities | 117     // Set decreasing priorities | 
| 90     for (size_t i = 0; i < maxTextures*2; ++i) | 118     for (size_t i = 0; i < maxTextures*2; ++i) | 
| 91         textures[i]->setRequestPriority(100 + i); | 119         textures[i]->setRequestPriority(100 + i); | 
| 92 | 120 | 
| 93     // Only lower half should be available. | 121     // Only lower half should be available. | 
| 94     textureManager->prioritizeTextures(); | 122     prioritizeTexturesAndBackings(textureManager.get()); | 
| 95     EXPECT_TRUE(validateTexture(textures[0], false)); | 123     EXPECT_TRUE(validateTexture(textures[0], false)); | 
| 96     EXPECT_TRUE(validateTexture(textures[7], false)); | 124     EXPECT_TRUE(validateTexture(textures[7], false)); | 
| 97     EXPECT_FALSE(validateTexture(textures[8], false)); | 125     EXPECT_FALSE(validateTexture(textures[8], false)); | 
| 98     EXPECT_FALSE(validateTexture(textures[15], false)); | 126     EXPECT_FALSE(validateTexture(textures[15], false)); | 
| 99 | 127 | 
| 100     // Set increasing priorities | 128     // Set increasing priorities | 
| 101     for (size_t i = 0; i < maxTextures*2; ++i) | 129     for (size_t i = 0; i < maxTextures*2; ++i) | 
| 102         textures[i]->setRequestPriority(100 - i); | 130         textures[i]->setRequestPriority(100 - i); | 
| 103 | 131 | 
| 104     // Only upper half should be available. | 132     // Only upper half should be available. | 
| 105     textureManager->prioritizeTextures(); | 133     prioritizeTexturesAndBackings(textureManager.get()); | 
| 106     EXPECT_FALSE(validateTexture(textures[0], false)); | 134     EXPECT_FALSE(validateTexture(textures[0], false)); | 
| 107     EXPECT_FALSE(validateTexture(textures[7], false)); | 135     EXPECT_FALSE(validateTexture(textures[7], false)); | 
| 108     EXPECT_TRUE(validateTexture(textures[8], false)); | 136     EXPECT_TRUE(validateTexture(textures[8], false)); | 
| 109     EXPECT_TRUE(validateTexture(textures[15], false)); | 137     EXPECT_TRUE(validateTexture(textures[15], false)); | 
| 110 | 138 | 
| 111     EXPECT_EQ(texturesMemorySize(maxTextures), textureManager->memoryAboveCutoff
     Bytes()); | 139     EXPECT_EQ(texturesMemorySize(maxTextures), textureManager->memoryAboveCutoff
     Bytes()); | 
| 112     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 140     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| 113 | 141 | 
| 114     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 142     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 
| 115     textureManager->clearAllMemory(resourceProvider()); | 143     textureManager->clearAllMemory(resourceProvider()); | 
| 116 } | 144 } | 
| 117 | 145 | 
| 118 TEST_F(CCPrioritizedTextureTest, changeMemoryLimits) | 146 TEST_F(CCPrioritizedTextureTest, changeMemoryLimits) | 
| 119 { | 147 { | 
| 120     const size_t maxTextures = 8; | 148     const size_t maxTextures = 8; | 
| 121     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(maxTextur
     es); | 149     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(maxTextur
     es); | 
| 122     OwnPtr<CCPrioritizedTexture> textures[maxTextures]; | 150     OwnPtr<CCPrioritizedTexture> textures[maxTextures]; | 
| 123 | 151 | 
| 124     for (size_t i = 0; i < maxTextures; ++i) | 152     for (size_t i = 0; i < maxTextures; ++i) | 
| 125         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 153         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
| 126     for (size_t i = 0; i < maxTextures; ++i) | 154     for (size_t i = 0; i < maxTextures; ++i) | 
| 127         textures[i]->setRequestPriority(100 + i); | 155         textures[i]->setRequestPriority(100 + i); | 
| 128 | 156 | 
| 129     // Set max limit to 8 textures | 157     // Set max limit to 8 textures | 
| 130     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(8)); | 158     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(8)); | 
| 131     textureManager->prioritizeTextures(); | 159     prioritizeTexturesAndBackings(textureManager.get()); | 
| 132     for (size_t i = 0; i < maxTextures; ++i) | 160     for (size_t i = 0; i < maxTextures; ++i) | 
| 133         validateTexture(textures[i], false); | 161         validateTexture(textures[i], false); | 
| 134     { | 162     { | 
| 135         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 163         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
| 136         textureManager->reduceMemory(resourceProvider()); | 164         textureManager->reduceMemory(resourceProvider()); | 
| 137     } | 165     } | 
| 138 | 166 | 
| 139     EXPECT_EQ(texturesMemorySize(8), textureManager->memoryAboveCutoffBytes()); | 167     EXPECT_EQ(texturesMemorySize(8), textureManager->memoryAboveCutoffBytes()); | 
| 140     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 168     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| 141 | 169 | 
| 142     // Set max limit to 5 textures | 170     // Set max limit to 5 textures | 
| 143     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(5)); | 171     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(5)); | 
| 144     textureManager->prioritizeTextures(); | 172     prioritizeTexturesAndBackings(textureManager.get()); | 
| 145     for (size_t i = 0; i < maxTextures; ++i) | 173     for (size_t i = 0; i < maxTextures; ++i) | 
| 146         EXPECT_EQ(validateTexture(textures[i], false), i < 5); | 174         EXPECT_EQ(validateTexture(textures[i], false), i < 5); | 
| 147     { | 175     { | 
| 148         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 176         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
| 149         textureManager->reduceMemory(resourceProvider()); | 177         textureManager->reduceMemory(resourceProvider()); | 
| 150     } | 178     } | 
| 151 | 179 | 
| 152     EXPECT_EQ(texturesMemorySize(5), textureManager->memoryAboveCutoffBytes()); | 180     EXPECT_EQ(texturesMemorySize(5), textureManager->memoryAboveCutoffBytes()); | 
| 153     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 181     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| 154 | 182 | 
| 155     // Set max limit to 4 textures | 183     // Set max limit to 4 textures | 
| 156     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(4)); | 184     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(4)); | 
| 157     textureManager->prioritizeTextures(); | 185     prioritizeTexturesAndBackings(textureManager.get()); | 
| 158     for (size_t i = 0; i < maxTextures; ++i) | 186     for (size_t i = 0; i < maxTextures; ++i) | 
| 159         EXPECT_EQ(validateTexture(textures[i], false), i < 4); | 187         EXPECT_EQ(validateTexture(textures[i], false), i < 4); | 
| 160     { | 188     { | 
| 161         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 189         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
| 162         textureManager->reduceMemory(resourceProvider()); | 190         textureManager->reduceMemory(resourceProvider()); | 
| 163     } | 191     } | 
| 164 | 192 | 
| 165     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryAboveCutoffBytes()); | 193     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryAboveCutoffBytes()); | 
| 166     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 194     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| 167 | 195 | 
| 168     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 196     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 
| 169     textureManager->clearAllMemory(resourceProvider()); | 197     textureManager->clearAllMemory(resourceProvider()); | 
| 170 } | 198 } | 
| 171 | 199 | 
| 172 TEST_F(CCPrioritizedTextureTest, textureManagerPartialUpdateTextures) | 200 TEST_F(CCPrioritizedTextureTest, textureManagerPartialUpdateTextures) | 
| 173 { | 201 { | 
| 174     const size_t maxTextures = 4; | 202     const size_t maxTextures = 4; | 
| 175     const size_t numTextures = 4; | 203     const size_t numTextures = 4; | 
| 176     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(maxTextur
     es); | 204     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(maxTextur
     es); | 
| 177     OwnPtr<CCPrioritizedTexture> textures[numTextures]; | 205     OwnPtr<CCPrioritizedTexture> textures[numTextures]; | 
| 178     OwnPtr<CCPrioritizedTexture> moreTextures[numTextures]; | 206     OwnPtr<CCPrioritizedTexture> moreTextures[numTextures]; | 
| 179 | 207 | 
| 180     for (size_t i = 0; i < numTextures; ++i) { | 208     for (size_t i = 0; i < numTextures; ++i) { | 
| 181         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 209         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
| 182         moreTextures[i] = textureManager->createTexture(m_textureSize, m_texture
     Format); | 210         moreTextures[i] = textureManager->createTexture(m_textureSize, m_texture
     Format); | 
| 183     } | 211     } | 
| 184 | 212 | 
| 185     for (size_t i = 0; i < numTextures; ++i) | 213     for (size_t i = 0; i < numTextures; ++i) | 
| 186         textures[i]->setRequestPriority(200 + i); | 214         textures[i]->setRequestPriority(200 + i); | 
| 187     textureManager->prioritizeTextures(); | 215     prioritizeTexturesAndBackings(textureManager.get()); | 
| 188 | 216 | 
| 189     // Allocate textures which are currently high priority. | 217     // Allocate textures which are currently high priority. | 
| 190     EXPECT_TRUE(validateTexture(textures[0], false)); | 218     EXPECT_TRUE(validateTexture(textures[0], false)); | 
| 191     EXPECT_TRUE(validateTexture(textures[1], false)); | 219     EXPECT_TRUE(validateTexture(textures[1], false)); | 
| 192     EXPECT_TRUE(validateTexture(textures[2], false)); | 220     EXPECT_TRUE(validateTexture(textures[2], false)); | 
| 193     EXPECT_TRUE(validateTexture(textures[3], false)); | 221     EXPECT_TRUE(validateTexture(textures[3], false)); | 
| 194 | 222 | 
| 195     EXPECT_TRUE(textures[0]->haveBackingTexture()); | 223     EXPECT_TRUE(textures[0]->haveBackingTexture()); | 
| 196     EXPECT_TRUE(textures[1]->haveBackingTexture()); | 224     EXPECT_TRUE(textures[1]->haveBackingTexture()); | 
| 197     EXPECT_TRUE(textures[2]->haveBackingTexture()); | 225     EXPECT_TRUE(textures[2]->haveBackingTexture()); | 
| 198     EXPECT_TRUE(textures[3]->haveBackingTexture()); | 226     EXPECT_TRUE(textures[3]->haveBackingTexture()); | 
| 199 | 227 | 
| 200     for (size_t i = 0; i < numTextures; ++i) | 228     for (size_t i = 0; i < numTextures; ++i) | 
| 201         moreTextures[i]->setRequestPriority(100 + i); | 229         moreTextures[i]->setRequestPriority(100 + i); | 
| 202     textureManager->prioritizeTextures(); | 230     prioritizeTexturesAndBackings(textureManager.get()); | 
| 203 | 231 | 
| 204     // Textures are now below cutoff. | 232     // Textures are now below cutoff. | 
| 205     EXPECT_FALSE(validateTexture(textures[0], false)); | 233     EXPECT_FALSE(validateTexture(textures[0], false)); | 
| 206     EXPECT_FALSE(validateTexture(textures[1], false)); | 234     EXPECT_FALSE(validateTexture(textures[1], false)); | 
| 207     EXPECT_FALSE(validateTexture(textures[2], false)); | 235     EXPECT_FALSE(validateTexture(textures[2], false)); | 
| 208     EXPECT_FALSE(validateTexture(textures[3], false)); | 236     EXPECT_FALSE(validateTexture(textures[3], false)); | 
| 209 | 237 | 
| 210     // But they are still valid to use. | 238     // But they are still valid to use. | 
| 211     EXPECT_TRUE(textures[0]->haveBackingTexture()); | 239     EXPECT_TRUE(textures[0]->haveBackingTexture()); | 
| 212     EXPECT_TRUE(textures[1]->haveBackingTexture()); | 240     EXPECT_TRUE(textures[1]->haveBackingTexture()); | 
| (...skipping 26 matching lines...) Expand all  Loading... | 
| 239         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 267         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
| 240 | 268 | 
| 241     // All 16 textures have the same priority except 2 higher priority. | 269     // All 16 textures have the same priority except 2 higher priority. | 
| 242     for (size_t i = 0; i < maxTextures; ++i) | 270     for (size_t i = 0; i < maxTextures; ++i) | 
| 243         textures[i]->setRequestPriority(100); | 271         textures[i]->setRequestPriority(100); | 
| 244     textures[0]->setRequestPriority(99); | 272     textures[0]->setRequestPriority(99); | 
| 245     textures[1]->setRequestPriority(99); | 273     textures[1]->setRequestPriority(99); | 
| 246 | 274 | 
| 247     // Set max limit to 8 textures | 275     // Set max limit to 8 textures | 
| 248     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(8)); | 276     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(8)); | 
| 249     textureManager->prioritizeTextures(); | 277     prioritizeTexturesAndBackings(textureManager.get()); | 
| 250 | 278 | 
| 251     // The two high priority textures should be available, others should not. | 279     // The two high priority textures should be available, others should not. | 
| 252     for (size_t i = 0; i < 2; ++i) | 280     for (size_t i = 0; i < 2; ++i) | 
| 253         EXPECT_TRUE(validateTexture(textures[i], false)); | 281         EXPECT_TRUE(validateTexture(textures[i], false)); | 
| 254     for (size_t i = 2; i < maxTextures; ++i) | 282     for (size_t i = 2; i < maxTextures; ++i) | 
| 255         EXPECT_FALSE(validateTexture(textures[i], false)); | 283         EXPECT_FALSE(validateTexture(textures[i], false)); | 
| 256     EXPECT_EQ(texturesMemorySize(2), textureManager->memoryAboveCutoffBytes()); | 284     EXPECT_EQ(texturesMemorySize(2), textureManager->memoryAboveCutoffBytes()); | 
| 257     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 285     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| 258 | 286 | 
| 259     // Manually reserving textures should only succeed on the higher priority te
     xtures, | 287     // Manually reserving textures should only succeed on the higher priority te
     xtures, | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 271 | 299 | 
| 272 TEST_F(CCPrioritizedTextureTest, textureManagerDestroyedFirst) | 300 TEST_F(CCPrioritizedTextureTest, textureManagerDestroyedFirst) | 
| 273 { | 301 { | 
| 274     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(1); | 302     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(1); | 
| 275     OwnPtr<CCPrioritizedTexture> texture = textureManager->createTexture(m_textu
     reSize, m_textureFormat); | 303     OwnPtr<CCPrioritizedTexture> texture = textureManager->createTexture(m_textu
     reSize, m_textureFormat); | 
| 276 | 304 | 
| 277     // Texture is initially invalid, but it will become available. | 305     // Texture is initially invalid, but it will become available. | 
| 278     EXPECT_FALSE(texture->haveBackingTexture()); | 306     EXPECT_FALSE(texture->haveBackingTexture()); | 
| 279 | 307 | 
| 280     texture->setRequestPriority(100); | 308     texture->setRequestPriority(100); | 
| 281     textureManager->prioritizeTextures(); | 309     prioritizeTexturesAndBackings(textureManager.get()); | 
| 282 | 310 | 
| 283     EXPECT_TRUE(validateTexture(texture, false)); | 311     EXPECT_TRUE(validateTexture(texture, false)); | 
| 284     EXPECT_TRUE(texture->canAcquireBackingTexture()); | 312     EXPECT_TRUE(texture->canAcquireBackingTexture()); | 
| 285     EXPECT_TRUE(texture->haveBackingTexture()); | 313     EXPECT_TRUE(texture->haveBackingTexture()); | 
| 286 | 314 | 
| 287     { | 315     { | 
| 288         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 316         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
| 289         textureManager->clearAllMemory(resourceProvider()); | 317         textureManager->clearAllMemory(resourceProvider()); | 
| 290     } | 318     } | 
| 291     textureManager.clear(); | 319     textureManager.clear(); | 
| 292 | 320 | 
| 293     EXPECT_FALSE(texture->canAcquireBackingTexture()); | 321     EXPECT_FALSE(texture->canAcquireBackingTexture()); | 
| 294     EXPECT_FALSE(texture->haveBackingTexture()); | 322     EXPECT_FALSE(texture->haveBackingTexture()); | 
| 295 } | 323 } | 
| 296 | 324 | 
| 297 TEST_F(CCPrioritizedTextureTest, textureMovedToNewManager) | 325 TEST_F(CCPrioritizedTextureTest, textureMovedToNewManager) | 
| 298 { | 326 { | 
| 299     OwnPtr<CCPrioritizedTextureManager> textureManagerOne = createManager(1); | 327     OwnPtr<CCPrioritizedTextureManager> textureManagerOne = createManager(1); | 
| 300     OwnPtr<CCPrioritizedTextureManager> textureManagerTwo = createManager(1); | 328     OwnPtr<CCPrioritizedTextureManager> textureManagerTwo = createManager(1); | 
| 301     OwnPtr<CCPrioritizedTexture> texture = textureManagerOne->createTexture(m_te
     xtureSize, m_textureFormat); | 329     OwnPtr<CCPrioritizedTexture> texture = textureManagerOne->createTexture(m_te
     xtureSize, m_textureFormat); | 
| 302 | 330 | 
| 303     // Texture is initially invalid, but it will become available. | 331     // Texture is initially invalid, but it will become available. | 
| 304     EXPECT_FALSE(texture->haveBackingTexture()); | 332     EXPECT_FALSE(texture->haveBackingTexture()); | 
| 305 | 333 | 
| 306     texture->setRequestPriority(100); | 334     texture->setRequestPriority(100); | 
| 307     textureManagerOne->prioritizeTextures(); | 335     prioritizeTexturesAndBackings(textureManagerOne.get()); | 
| 308 | 336 | 
| 309     EXPECT_TRUE(validateTexture(texture, false)); | 337     EXPECT_TRUE(validateTexture(texture, false)); | 
| 310     EXPECT_TRUE(texture->canAcquireBackingTexture()); | 338     EXPECT_TRUE(texture->canAcquireBackingTexture()); | 
| 311     EXPECT_TRUE(texture->haveBackingTexture()); | 339     EXPECT_TRUE(texture->haveBackingTexture()); | 
| 312 | 340 | 
| 313     texture->setTextureManager(0); | 341     texture->setTextureManager(0); | 
| 314 | 342 | 
| 315     { | 343     { | 
| 316         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 344         DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBloc
     ked; | 
| 317         textureManagerOne->clearAllMemory(resourceProvider()); | 345         textureManagerOne->clearAllMemory(resourceProvider()); | 
| 318     } | 346     } | 
| 319     textureManagerOne.clear(); | 347     textureManagerOne.clear(); | 
| 320 | 348 | 
| 321     EXPECT_FALSE(texture->canAcquireBackingTexture()); | 349     EXPECT_FALSE(texture->canAcquireBackingTexture()); | 
| 322     EXPECT_FALSE(texture->haveBackingTexture()); | 350     EXPECT_FALSE(texture->haveBackingTexture()); | 
| 323 | 351 | 
| 324     texture->setTextureManager(textureManagerTwo.get()); | 352     texture->setTextureManager(textureManagerTwo.get()); | 
| 325 | 353 | 
| 326     textureManagerTwo->prioritizeTextures(); | 354     prioritizeTexturesAndBackings(textureManagerTwo.get()); | 
| 327 | 355 | 
| 328     EXPECT_TRUE(validateTexture(texture, false)); | 356     EXPECT_TRUE(validateTexture(texture, false)); | 
| 329     EXPECT_TRUE(texture->canAcquireBackingTexture()); | 357     EXPECT_TRUE(texture->canAcquireBackingTexture()); | 
| 330     EXPECT_TRUE(texture->haveBackingTexture()); | 358     EXPECT_TRUE(texture->haveBackingTexture()); | 
| 331 | 359 | 
| 332     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 360     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 
| 333     textureManagerTwo->clearAllMemory(resourceProvider()); | 361     textureManagerTwo->clearAllMemory(resourceProvider()); | 
| 334 } | 362 } | 
| 335 | 363 | 
| 336 TEST_F(CCPrioritizedTextureTest, renderSurfacesReduceMemoryAvailableOutsideRootS
     urface) | 364 TEST_F(CCPrioritizedTextureTest, renderSurfacesReduceMemoryAvailableOutsideRootS
     urface) | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 347     OwnPtr<CCPrioritizedTexture> textures[maxTextures]; | 375     OwnPtr<CCPrioritizedTexture> textures[maxTextures]; | 
| 348 | 376 | 
| 349     for (size_t i = 0; i < maxTextures; ++i) | 377     for (size_t i = 0; i < maxTextures; ++i) | 
| 350         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 378         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
| 351 | 379 | 
| 352     // Set decreasing non-visible priorities outside root surface. | 380     // Set decreasing non-visible priorities outside root surface. | 
| 353     for (size_t i = 0; i < maxTextures; ++i) | 381     for (size_t i = 0; i < maxTextures; ++i) | 
| 354         textures[i]->setRequestPriority(100 + i); | 382         textures[i]->setRequestPriority(100 + i); | 
| 355 | 383 | 
| 356     // Only lower half should be available. | 384     // Only lower half should be available. | 
| 357     textureManager->prioritizeTextures(); | 385     prioritizeTexturesAndBackings(textureManager.get()); | 
| 358     EXPECT_TRUE(validateTexture(textures[0], false)); | 386     EXPECT_TRUE(validateTexture(textures[0], false)); | 
| 359     EXPECT_TRUE(validateTexture(textures[3], false)); | 387     EXPECT_TRUE(validateTexture(textures[3], false)); | 
| 360     EXPECT_FALSE(validateTexture(textures[4], false)); | 388     EXPECT_FALSE(validateTexture(textures[4], false)); | 
| 361     EXPECT_FALSE(validateTexture(textures[7], false)); | 389     EXPECT_FALSE(validateTexture(textures[7], false)); | 
| 362 | 390 | 
| 363     // Set increasing non-visible priorities outside root surface. | 391     // Set increasing non-visible priorities outside root surface. | 
| 364     for (size_t i = 0; i < maxTextures; ++i) | 392     for (size_t i = 0; i < maxTextures; ++i) | 
| 365         textures[i]->setRequestPriority(100 - i); | 393         textures[i]->setRequestPriority(100 - i); | 
| 366 | 394 | 
| 367     // Only upper half should be available. | 395     // Only upper half should be available. | 
| 368     textureManager->prioritizeTextures(); | 396     prioritizeTexturesAndBackings(textureManager.get()); | 
| 369     EXPECT_FALSE(validateTexture(textures[0], false)); | 397     EXPECT_FALSE(validateTexture(textures[0], false)); | 
| 370     EXPECT_FALSE(validateTexture(textures[3], false)); | 398     EXPECT_FALSE(validateTexture(textures[3], false)); | 
| 371     EXPECT_TRUE(validateTexture(textures[4], false)); | 399     EXPECT_TRUE(validateTexture(textures[4], false)); | 
| 372     EXPECT_TRUE(validateTexture(textures[7], false)); | 400     EXPECT_TRUE(validateTexture(textures[7], false)); | 
| 373 | 401 | 
| 374     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryAboveCutoffBytes()); | 402     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryAboveCutoffBytes()); | 
| 375     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryForSelfManagedTexture
     s()); | 403     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryForSelfManagedTexture
     s()); | 
| 376     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 404     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| 377 | 405 | 
| 378     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 406     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 393     OwnPtr<CCPrioritizedTexture> textures[maxTextures]; | 421     OwnPtr<CCPrioritizedTexture> textures[maxTextures]; | 
| 394 | 422 | 
| 395     for (size_t i = 0; i < maxTextures; ++i) | 423     for (size_t i = 0; i < maxTextures; ++i) | 
| 396         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 424         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
| 397 | 425 | 
| 398     // Set equal priorities. | 426     // Set equal priorities. | 
| 399     for (size_t i = 0; i < maxTextures; ++i) | 427     for (size_t i = 0; i < maxTextures; ++i) | 
| 400         textures[i]->setRequestPriority(100); | 428         textures[i]->setRequestPriority(100); | 
| 401 | 429 | 
| 402     // The first four to be requested late will be available. | 430     // The first four to be requested late will be available. | 
| 403     textureManager->prioritizeTextures(); | 431     prioritizeTexturesAndBackings(textureManager.get()); | 
| 404     for (unsigned i = 0; i < maxTextures; ++i) | 432     for (unsigned i = 0; i < maxTextures; ++i) | 
| 405         EXPECT_FALSE(validateTexture(textures[i], false)); | 433         EXPECT_FALSE(validateTexture(textures[i], false)); | 
| 406     for (unsigned i = 0; i < maxTextures; i += 2) | 434     for (unsigned i = 0; i < maxTextures; i += 2) | 
| 407         EXPECT_TRUE(validateTexture(textures[i], true)); | 435         EXPECT_TRUE(validateTexture(textures[i], true)); | 
| 408     for (unsigned i = 1; i < maxTextures; i += 2) | 436     for (unsigned i = 1; i < maxTextures; i += 2) | 
| 409         EXPECT_FALSE(validateTexture(textures[i], true)); | 437         EXPECT_FALSE(validateTexture(textures[i], true)); | 
| 410 | 438 | 
| 411     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryAboveCutoffBytes()); | 439     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryAboveCutoffBytes()); | 
| 412     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryForSelfManagedTexture
     s()); | 440     EXPECT_EQ(texturesMemorySize(4), textureManager->memoryForSelfManagedTexture
     s()); | 
| 413     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 441     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 431 | 459 | 
| 432     for (size_t i = 0; i < maxTextures; ++i) | 460     for (size_t i = 0; i < maxTextures; ++i) | 
| 433         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 461         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
| 434 | 462 | 
| 435     // Set 6 visible textures in the root surface, and 2 in a child surface. | 463     // Set 6 visible textures in the root surface, and 2 in a child surface. | 
| 436     for (size_t i = 0; i < 6; ++i) | 464     for (size_t i = 0; i < 6; ++i) | 
| 437         textures[i]->setRequestPriority(CCPriorityCalculator::visiblePriority(tr
     ue)); | 465         textures[i]->setRequestPriority(CCPriorityCalculator::visiblePriority(tr
     ue)); | 
| 438     for (size_t i = 6; i < 8; ++i) | 466     for (size_t i = 6; i < 8; ++i) | 
| 439         textures[i]->setRequestPriority(CCPriorityCalculator::visiblePriority(fa
     lse)); | 467         textures[i]->setRequestPriority(CCPriorityCalculator::visiblePriority(fa
     lse)); | 
| 440 | 468 | 
| 441     textureManager->prioritizeTextures(); | 469     prioritizeTexturesAndBackings(textureManager.get()); | 
| 442 | 470 | 
| 443     // Unable to requestLate textures in the child surface. | 471     // Unable to requestLate textures in the child surface. | 
| 444     EXPECT_FALSE(validateTexture(textures[6], true)); | 472     EXPECT_FALSE(validateTexture(textures[6], true)); | 
| 445     EXPECT_FALSE(validateTexture(textures[7], true)); | 473     EXPECT_FALSE(validateTexture(textures[7], true)); | 
| 446 | 474 | 
| 447     // Root surface textures are valid. | 475     // Root surface textures are valid. | 
| 448     for (size_t i = 0; i < 6; ++i) | 476     for (size_t i = 0; i < 6; ++i) | 
| 449         EXPECT_TRUE(validateTexture(textures[i], false)); | 477         EXPECT_TRUE(validateTexture(textures[i], false)); | 
| 450 | 478 | 
| 451     EXPECT_EQ(texturesMemorySize(6), textureManager->memoryAboveCutoffBytes()); | 479     EXPECT_EQ(texturesMemorySize(6), textureManager->memoryAboveCutoffBytes()); | 
| 452     EXPECT_EQ(texturesMemorySize(2), textureManager->memoryForSelfManagedTexture
     s()); | 480     EXPECT_EQ(texturesMemorySize(2), textureManager->memoryForSelfManagedTexture
     s()); | 
| 453     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 481     EXPECT_LE(textureManager->memoryUseBytes(), textureManager->memoryAboveCutof
     fBytes()); | 
| 454 | 482 | 
| 455     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 483     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 
| 456     textureManager->clearAllMemory(resourceProvider()); | 484     textureManager->clearAllMemory(resourceProvider()); | 
| 457 } | 485 } | 
| 458 | 486 | 
|  | 487 TEST_F(CCPrioritizedTextureTest, requestLateBackingsSorting) | 
|  | 488 { | 
|  | 489     const size_t maxTextures = 8; | 
|  | 490     OwnPtr<CCPrioritizedTextureManager> textureManager = createManager(maxTextur
     es); | 
|  | 491     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(maxTextures)); | 
|  | 492 | 
|  | 493     // Create textures to fill our memory limit. | 
|  | 494     OwnPtr<CCPrioritizedTexture> textures[maxTextures]; | 
|  | 495     for (size_t i = 0; i < maxTextures; ++i) | 
|  | 496         textures[i] = textureManager->createTexture(m_textureSize, m_textureForm
     at); | 
|  | 497 | 
|  | 498     // Set equal priorities, and allocate backings for all textures. | 
|  | 499     for (size_t i = 0; i < maxTextures; ++i) | 
|  | 500         textures[i]->setRequestPriority(100); | 
|  | 501     prioritizeTexturesAndBackings(textureManager.get()); | 
|  | 502     for (unsigned i = 0; i < maxTextures; ++i) | 
|  | 503         EXPECT_TRUE(validateTexture(textures[i], false)); | 
|  | 504 | 
|  | 505     // Drop the memory limit and prioritize (none will be above the threshold, | 
|  | 506     // but they still have backings because reduceMemory hasn't been called). | 
|  | 507     textureManager->setMaxMemoryLimitBytes(texturesMemorySize(maxTextures / 2)); | 
|  | 508     prioritizeTexturesAndBackings(textureManager.get()); | 
|  | 509 | 
|  | 510     // Push half of them back over the limit. | 
|  | 511     for (size_t i = 0; i < maxTextures; i += 2) | 
|  | 512         EXPECT_TRUE(textures[i]->requestLate()); | 
|  | 513 | 
|  | 514     // Push the priorities to the backings array and sort the backings array | 
|  | 515     textureManagerUpdateBackingsPriorities(textureManager.get()); | 
|  | 516 | 
|  | 517     // Assert that the backings list be sorted with the below-limit backings | 
|  | 518     // before the above-limit backings. | 
|  | 519     textureManagerAssertInvariants(textureManager.get()); | 
|  | 520 | 
|  | 521     // Make sure that we have backings for all of the textures. | 
|  | 522     for (size_t i = 0; i < maxTextures; ++i) | 
|  | 523         EXPECT_TRUE(textures[i]->haveBackingTexture()); | 
|  | 524 | 
|  | 525     // Make sure that only the requestLate textures are above the priority cutof
     f | 
|  | 526     for (size_t i = 0; i < maxTextures; i += 2) | 
|  | 527         EXPECT_TRUE(textureBackingIsAbovePriorityCutoff(textures[i].get())); | 
|  | 528     for (size_t i = 1; i < maxTextures; i += 2) | 
|  | 529         EXPECT_FALSE(textureBackingIsAbovePriorityCutoff(textures[i].get())); | 
|  | 530 | 
|  | 531     DebugScopedSetImplThreadAndMainThreadBlocked implThreadAndMainThreadBlocked; | 
|  | 532     textureManager->clearAllMemory(resourceProvider()); | 
|  | 533 } | 
|  | 534 | 
|  | 535 | 
| 459 } // namespace | 536 } // namespace | 
| OLD | NEW | 
|---|