Chromium Code Reviews| 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 WebCore { |
|
jamesr
2012/09/17 18:11:08
is this change deliberate? normally tests are in a
ccameron
2012/09/17 18:15:59
Yes -- I made the test base class a friend of the
jamesr
2012/09/17 18:24:08
It seems to not be quite working:
FAILED: clang++
ccameron
2012/09/17 18:30:30
Ack, you're right!
| |
| 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 |