| 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 "CCPrioritizedTextureManager.h" | 7 #include "CCPrioritizedTextureManager.h" |
| 8 | 8 |
| 9 #include "CCPrioritizedTexture.h" | 9 #include "CCPrioritizedTexture.h" |
| 10 #include "CCPriorityCalculator.h" | 10 #include "CCPriorityCalculator.h" |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 166 } | 166 } |
| 167 | 167 |
| 168 void CCPrioritizedTextureManager::acquireBackingTextureIfNeeded(CCPrioritizedTex
ture* texture, CCResourceProvider* resourceProvider) | 168 void CCPrioritizedTextureManager::acquireBackingTextureIfNeeded(CCPrioritizedTex
ture* texture, CCResourceProvider* resourceProvider) |
| 169 { | 169 { |
| 170 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | 170 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); |
| 171 ASSERT(!texture->isSelfManaged()); | 171 ASSERT(!texture->isSelfManaged()); |
| 172 ASSERT(texture->isAbovePriorityCutoff()); | 172 ASSERT(texture->isAbovePriorityCutoff()); |
| 173 if (texture->backing() || !texture->isAbovePriorityCutoff()) | 173 if (texture->backing() || !texture->isAbovePriorityCutoff()) |
| 174 return; | 174 return; |
| 175 | 175 |
| 176 // Make sure that the backings list is up to date and sorted before traversi
ng it. | |
| 177 updateBackingsPriorities(); | |
| 178 | |
| 179 // Find a backing below, by either recycling or allocating. | 176 // Find a backing below, by either recycling or allocating. |
| 180 CCPrioritizedTexture::Backing* backing = 0; | 177 CCPrioritizedTexture::Backing* backing = 0; |
| 181 | 178 |
| 182 // First try to recycle | 179 // First try to recycle |
| 183 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); +
+it) { | 180 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); +
+it) { |
| 184 if ((*it)->hadOwnerAtLastPriorityUpdate() && (*it)->wasAbovePriorityCuto
ffAtLastPriorityUpdate()) | 181 if ((*it)->hadOwnerAtLastPriorityUpdate() && (*it)->wasAbovePriorityCuto
ffAtLastPriorityUpdate()) |
| 185 break; | 182 break; |
| 186 if ((*it)->size() == texture->size() && (*it)->format() == texture->form
at()) { | 183 if ((*it)->size() == texture->size() && (*it)->format() == texture->form
at()) { |
| 187 backing = (*it); | 184 backing = (*it); |
| 188 break; | 185 break; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 if (backing->hadOwnerAtLastPriorityUpdate() && backing->wasAbovePrio
rityCutoffAtLastPriorityUpdate()) | 217 if (backing->hadOwnerAtLastPriorityUpdate() && backing->wasAbovePrio
rityCutoffAtLastPriorityUpdate()) |
| 221 break; | 218 break; |
| 222 evictBackingResource(backing, resourceProvider); | 219 evictBackingResource(backing, resourceProvider); |
| 223 } | 220 } |
| 224 } | 221 } |
| 225 | 222 |
| 226 void CCPrioritizedTextureManager::reduceMemory(CCResourceProvider* resourceProvi
der) | 223 void CCPrioritizedTextureManager::reduceMemory(CCResourceProvider* resourceProvi
der) |
| 227 { | 224 { |
| 228 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | 225 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); |
| 229 | 226 |
| 230 // Make sure that the backings list is up to date and sorted before traversi
ng it. | |
| 231 updateBackingsPriorities(); | |
| 232 | |
| 233 evictBackingsToReduceMemory(m_memoryAvailableBytes, RespectManagerPriorityCu
toff, resourceProvider); | 227 evictBackingsToReduceMemory(m_memoryAvailableBytes, RespectManagerPriorityCu
toff, resourceProvider); |
| 234 ASSERT(memoryUseBytes() <= maxMemoryLimitBytes()); | 228 ASSERT(memoryUseBytes() <= maxMemoryLimitBytes()); |
| 235 | 229 |
| 236 // We currently collect backings from deleted textures for later recycling. | 230 // We currently collect backings from deleted textures for later recycling. |
| 237 // However, if we do that forever we will always use the max limit even if | 231 // However, if we do that forever we will always use the max limit even if |
| 238 // we really need very little memory. This should probably be solved by redu
cing the | 232 // we really need very little memory. This should probably be solved by redu
cing the |
| 239 // limit externally, but until then this just does some "clean up" of unused | 233 // limit externally, but until then this just does some "clean up" of unused |
| 240 // backing textures (any more than 10%). | 234 // backing textures (any more than 10%). |
| 241 size_t wastedMemory = 0; | 235 size_t wastedMemory = 0; |
| 242 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); +
+it) { | 236 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); +
+it) { |
| 243 if ((*it)->owner()) | 237 if ((*it)->hadOwnerAtLastPriorityUpdate()) |
| 244 break; | 238 break; |
| 245 wastedMemory += (*it)->bytes(); | 239 wastedMemory += (*it)->bytes(); |
| 246 } | 240 } |
| 247 size_t tenPercentOfMemory = m_memoryAvailableBytes / 10; | 241 size_t tenPercentOfMemory = m_memoryAvailableBytes / 10; |
| 248 if (wastedMemory > tenPercentOfMemory) | 242 if (wastedMemory > tenPercentOfMemory) |
| 249 evictBackingsToReduceMemory(memoryUseBytes() - (wastedMemory - tenPercen
tOfMemory), RespectManagerPriorityCutoff, resourceProvider); | 243 evictBackingsToReduceMemory(memoryUseBytes() - (wastedMemory - tenPercen
tOfMemory), RespectManagerPriorityCutoff, resourceProvider); |
| 250 | 244 |
| 251 deleteEvictedBackings(); | 245 deleteEvictedBackings(); |
| 252 } | 246 } |
| 253 | 247 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 400 if (reachedAboveCutoff) { | 394 if (reachedAboveCutoff) { |
| 401 ASSERT((*it)->hadOwnerAtLastPriorityUpdate() && (*it)->wasAbovePrior
ityCutoffAtLastPriorityUpdate()); | 395 ASSERT((*it)->hadOwnerAtLastPriorityUpdate() && (*it)->wasAbovePrior
ityCutoffAtLastPriorityUpdate()); |
| 402 ASSERT(reachedOwned); | 396 ASSERT(reachedOwned); |
| 403 } | 397 } |
| 404 } | 398 } |
| 405 } | 399 } |
| 406 #endif | 400 #endif |
| 407 | 401 |
| 408 | 402 |
| 409 } // namespace cc | 403 } // namespace cc |
| OLD | NEW |