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 "CCPrioritizedTextureManager.h" | 7 #include "CCPrioritizedTextureManager.h" |
| 8 | 8 |
| 9 #include "CCPrioritizedTexture.h" | 9 #include "CCPrioritizedTexture.h" |
| 10 #include "CCPriorityCalculator.h" | 10 #include "CCPriorityCalculator.h" |
| 11 #include "CCProxy.h" | 11 #include "CCProxy.h" |
| 12 #include "TraceEvent.h" | 12 #include "TraceEvent.h" |
| 13 #include <algorithm> | 13 #include <algorithm> |
| 14 | 14 |
| 15 using namespace std; | 15 using namespace std; |
| 16 | 16 |
| 17 namespace cc { | 17 namespace cc { |
| 18 | 18 |
| 19 CCPrioritizedTextureManager::CCPrioritizedTextureManager(size_t maxMemoryLimitBy tes, int, int pool) | 19 CCPrioritizedTextureManager::CCPrioritizedTextureManager(size_t maxMemoryLimitBy tes, int, int pool) |
| 20 : m_maxMemoryLimitBytes(maxMemoryLimitBytes) | 20 : m_maxMemoryLimitBytes(maxMemoryLimitBytes) |
| 21 , m_memoryUseBytes(0) | 21 , m_memoryUseBytes(0) |
| 22 , m_memoryAboveCutoffBytes(0) | 22 , m_memoryAboveCutoffBytes(0) |
| 23 , m_memoryAvailableBytes(0) | 23 , m_memoryAvailableBytes(0) |
| 24 , m_pool(pool) | 24 , m_pool(pool) |
| 25 , m_needsUpdateBackingsPrioritites(false) | |
| 26 { | 25 { |
| 27 } | 26 } |
| 28 | 27 |
| 29 CCPrioritizedTextureManager::~CCPrioritizedTextureManager() | 28 CCPrioritizedTextureManager::~CCPrioritizedTextureManager() |
| 30 { | 29 { |
| 31 while (m_textures.size() > 0) | 30 while (m_textures.size() > 0) |
| 32 unregisterTexture(*m_textures.begin()); | 31 unregisterTexture(*m_textures.begin()); |
| 33 | 32 |
| 34 deleteEvictedBackings(); | 33 deleteUnlinkedEvictedBackings(); |
| 34 ASSERT(m_evictedBackings.isEmpty()); | |
| 35 | 35 |
| 36 // Each remaining backing is a leaked opengl texture. There should be none. | 36 // Each remaining backing is a leaked opengl texture. There should be none. |
| 37 ASSERT(m_backings.isEmpty()); | 37 ASSERT(m_backings.isEmpty()); |
| 38 } | 38 } |
| 39 | 39 |
| 40 void CCPrioritizedTextureManager::prioritizeTextures() | 40 void CCPrioritizedTextureManager::prioritizeTextures() |
| 41 { | 41 { |
| 42 TRACE_EVENT0("cc", "CCPrioritizedTextureManager::prioritizeTextures"); | 42 TRACE_EVENT0("cc", "CCPrioritizedTextureManager::prioritizeTextures"); |
| 43 ASSERT(CCProxy::isMainThread()); | 43 ASSERT(CCProxy::isMainThread()); |
| 44 | 44 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 86 // being partially allowed randomly. | 86 // being partially allowed randomly. |
| 87 m_memoryAboveCutoffBytes = 0; | 87 m_memoryAboveCutoffBytes = 0; |
| 88 for (TextureVector::iterator it = sortedTextures.begin(); it != sortedTextur es.end(); ++it) { | 88 for (TextureVector::iterator it = sortedTextures.begin(); it != sortedTextur es.end(); ++it) { |
| 89 bool isAbovePriorityCutoff = CCPriorityCalculator::priorityIsHigher((*it )->requestPriority(), m_priorityCutoff); | 89 bool isAbovePriorityCutoff = CCPriorityCalculator::priorityIsHigher((*it )->requestPriority(), m_priorityCutoff); |
| 90 (*it)->setAbovePriorityCutoff(isAbovePriorityCutoff); | 90 (*it)->setAbovePriorityCutoff(isAbovePriorityCutoff); |
| 91 if (isAbovePriorityCutoff && !(*it)->isSelfManaged()) | 91 if (isAbovePriorityCutoff && !(*it)->isSelfManaged()) |
| 92 m_memoryAboveCutoffBytes += (*it)->bytes(); | 92 m_memoryAboveCutoffBytes += (*it)->bytes(); |
| 93 } | 93 } |
| 94 sortedTextures.clear(); | 94 sortedTextures.clear(); |
| 95 | 95 |
| 96 m_needsUpdateBackingsPrioritites = true; | |
| 97 | |
| 98 ASSERT(m_memoryAboveCutoffBytes <= m_memoryAvailableBytes); | 96 ASSERT(m_memoryAboveCutoffBytes <= m_memoryAvailableBytes); |
| 99 ASSERT(memoryAboveCutoffBytes() <= maxMemoryLimitBytes()); | 97 ASSERT(memoryAboveCutoffBytes() <= maxMemoryLimitBytes()); |
| 100 } | 98 } |
| 101 | 99 |
| 102 void CCPrioritizedTextureManager::updateBackingsPriorities() | 100 void CCPrioritizedTextureManager::pushTexturePrioritiesToBackings() |
| 101 { | |
| 102 TRACE_EVENT0("cc", "CCPrioritizedTextureManager::pushTexturePrioritiesToBack ings"); | |
| 103 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | |
| 104 | |
| 105 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) | |
| 106 (*it)->updatePriority(); | |
| 107 | |
| 108 sortBackings(); | |
| 109 } | |
| 110 | |
| 111 void CCPrioritizedTextureManager::updateBackingsInDrawingImplTree() | |
| 112 { | |
| 113 TRACE_EVENT0("cc", "CCPrioritizedTextureManager::updateBackingsInDrawingImpl Tree"); | |
| 114 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | |
| 115 | |
| 116 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { | |
| 117 CCPrioritizedTexture::Backing* backing = (*it); | |
| 118 backing->updateInDrawingImplTree(); | |
| 119 } | |
| 120 | |
| 121 sortBackings(); | |
| 122 } | |
| 123 | |
| 124 void CCPrioritizedTextureManager::sortBackings() | |
| 103 { | 125 { |
| 104 TRACE_EVENT0("cc", "CCPrioritizedTextureManager::updateBackingsPriorities"); | 126 TRACE_EVENT0("cc", "CCPrioritizedTextureManager::updateBackingsPriorities"); |
| 105 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | 127 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); |
| 106 | 128 |
| 107 if (!m_needsUpdateBackingsPrioritites) | |
| 108 return; | |
| 109 | |
| 110 #if !ASSERT_DISABLED | |
| 111 assertInvariants(); | |
| 112 #endif | |
| 113 | |
| 114 // Update backings' priorities and put backings in eviction/recycling order. | 129 // Update backings' priorities and put backings in eviction/recycling order. |
| 115 BackingVector& sortedBackings = m_tempBackingVector; | 130 BackingVector& sortedBackings = m_tempBackingVector; |
| 116 sortedBackings.clear(); | 131 sortedBackings.clear(); |
| 117 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { | 132 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) |
| 118 (*it)->updatePriority(); | |
| 119 sortedBackings.append(*it); | 133 sortedBackings.append(*it); |
| 120 } | |
| 121 std::sort(sortedBackings.begin(), sortedBackings.end(), compareBackings); | 134 std::sort(sortedBackings.begin(), sortedBackings.end(), compareBackings); |
| 122 | 135 |
| 123 for (BackingVector::iterator it = sortedBackings.begin(); it != sortedBackin gs.end(); ++it) { | 136 for (BackingVector::iterator it = sortedBackings.begin(); it != sortedBackin gs.end(); ++it) { |
| 124 m_backings.remove(*it); | 137 m_backings.remove(*it); |
| 125 m_backings.add(*it); | 138 m_backings.add(*it); |
| 126 } | 139 } |
| 127 sortedBackings.clear(); | 140 sortedBackings.clear(); |
| 128 m_needsUpdateBackingsPrioritites = false; | |
| 129 | 141 |
| 130 #if !ASSERT_DISABLED | 142 #if !ASSERT_DISABLED |
| 131 assertInvariants(); | 143 assertInvariants(); |
| 132 #endif | 144 #endif |
| 133 } | 145 } |
| 134 | 146 |
| 135 void CCPrioritizedTextureManager::clearPriorities() | 147 void CCPrioritizedTextureManager::clearPriorities() |
| 136 { | 148 { |
| 137 ASSERT(CCProxy::isMainThread()); | 149 ASSERT(CCProxy::isMainThread()); |
| 138 for (TextureSet::iterator it = m_textures.begin(); it != m_textures.end(); + +it) { | 150 for (TextureSet::iterator it = m_textures.begin(); it != m_textures.end(); + +it) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 154 | 166 |
| 155 if (CCPriorityCalculator::priorityIsLower(texture->requestPriority(), m_prio rityCutoff)) | 167 if (CCPriorityCalculator::priorityIsLower(texture->requestPriority(), m_prio rityCutoff)) |
| 156 return false; | 168 return false; |
| 157 | 169 |
| 158 size_t newMemoryBytes = m_memoryAboveCutoffBytes + texture->bytes(); | 170 size_t newMemoryBytes = m_memoryAboveCutoffBytes + texture->bytes(); |
| 159 if (newMemoryBytes > m_memoryAvailableBytes) | 171 if (newMemoryBytes > m_memoryAvailableBytes) |
| 160 return false; | 172 return false; |
| 161 | 173 |
| 162 m_memoryAboveCutoffBytes = newMemoryBytes; | 174 m_memoryAboveCutoffBytes = newMemoryBytes; |
| 163 texture->setAbovePriorityCutoff(true); | 175 texture->setAbovePriorityCutoff(true); |
| 164 m_needsUpdateBackingsPrioritites = true; | |
| 165 return true; | 176 return true; |
| 166 } | 177 } |
| 167 | 178 |
| 168 void CCPrioritizedTextureManager::acquireBackingTextureIfNeeded(CCPrioritizedTex ture* texture, CCResourceProvider* resourceProvider) | 179 void CCPrioritizedTextureManager::acquireBackingTextureIfNeeded(CCPrioritizedTex ture* texture, CCResourceProvider* resourceProvider) |
| 169 { | 180 { |
| 170 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | 181 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); |
| 171 ASSERT(!texture->isSelfManaged()); | 182 ASSERT(!texture->isSelfManaged()); |
| 172 ASSERT(texture->isAbovePriorityCutoff()); | 183 ASSERT(texture->isAbovePriorityCutoff()); |
| 173 if (texture->backing() || !texture->isAbovePriorityCutoff()) | 184 if (texture->backing() || !texture->isAbovePriorityCutoff()) |
| 174 return; | 185 return; |
| 175 | 186 |
| 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. | 187 // Find a backing below, by either recycling or allocating. |
| 180 CCPrioritizedTexture::Backing* backing = 0; | 188 CCPrioritizedTexture::Backing* backing = 0; |
| 181 | 189 |
| 182 // First try to recycle | 190 // First try to recycle |
| 183 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { | 191 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { |
| 184 if ((*it)->hadOwnerAtLastPriorityUpdate() && (*it)->wasAbovePriorityCuto ffAtLastPriorityUpdate()) | 192 if (!(*it)->canBeRecycled()) |
| 185 break; | 193 break; |
| 186 if ((*it)->size() == texture->size() && (*it)->format() == texture->form at()) { | 194 if ((*it)->size() == texture->size() && (*it)->format() == texture->form at()) { |
| 187 backing = (*it); | 195 backing = (*it); |
| 188 break; | 196 break; |
| 189 } | 197 } |
| 190 } | 198 } |
| 191 | 199 |
| 192 // Otherwise reduce memory and just allocate a new backing texures. | 200 // Otherwise reduce memory and just allocate a new backing texures. |
| 193 if (!backing) { | 201 if (!backing) { |
| 194 evictBackingsToReduceMemory(m_memoryAvailableBytes - texture->bytes(), R espectManagerPriorityCutoff, resourceProvider); | 202 evictBackingsToReduceMemory(m_memoryAvailableBytes - texture->bytes(), R espectManagerPriorityCutoff, resourceProvider); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 210 { | 218 { |
| 211 ASSERT(CCProxy::isImplThread()); | 219 ASSERT(CCProxy::isImplThread()); |
| 212 if (memoryUseBytes() <= limitBytes) | 220 if (memoryUseBytes() <= limitBytes) |
| 213 return; | 221 return; |
| 214 | 222 |
| 215 // Destroy backings until we are below the limit, | 223 // Destroy backings until we are below the limit, |
| 216 // or until all backings remaining are above the cutoff. | 224 // or until all backings remaining are above the cutoff. |
| 217 while (memoryUseBytes() > limitBytes && m_backings.size() > 0) { | 225 while (memoryUseBytes() > limitBytes && m_backings.size() > 0) { |
| 218 CCPrioritizedTexture::Backing* backing = *m_backings.begin(); | 226 CCPrioritizedTexture::Backing* backing = *m_backings.begin(); |
| 219 if (evictionPolicy == RespectManagerPriorityCutoff) | 227 if (evictionPolicy == RespectManagerPriorityCutoff) |
| 220 if (backing->hadOwnerAtLastPriorityUpdate() && backing->wasAbovePrio rityCutoffAtLastPriorityUpdate()) | 228 if (backing->wasAbovePriorityCutoffAtLastPriorityUpdate()) |
| 221 break; | 229 break; |
| 222 evictBackingResource(backing, resourceProvider); | 230 evictBackingResource(backing, resourceProvider); |
| 223 } | 231 } |
| 224 } | 232 } |
| 225 | 233 |
| 226 void CCPrioritizedTextureManager::reduceMemory(CCResourceProvider* resourceProvi der) | 234 void CCPrioritizedTextureManager::reduceMemory(CCResourceProvider* resourceProvi der) |
| 227 { | 235 { |
| 228 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | 236 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); |
| 229 | 237 |
| 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); | 238 evictBackingsToReduceMemory(m_memoryAvailableBytes, RespectManagerPriorityCu toff, resourceProvider); |
| 234 ASSERT(memoryUseBytes() <= maxMemoryLimitBytes()); | 239 ASSERT(memoryUseBytes() <= maxMemoryLimitBytes()); |
| 235 | 240 |
| 236 // We currently collect backings from deleted textures for later recycling. | 241 // 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 | 242 // 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 | 243 // 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 | 244 // limit externally, but until then this just does some "clean up" of unused |
| 240 // backing textures (any more than 10%). | 245 // backing textures (any more than 10%). |
| 241 size_t wastedMemory = 0; | 246 size_t wastedMemory = 0; |
| 242 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { | 247 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { |
| 243 if ((*it)->owner()) | 248 if ((*it)->owner()) |
| 244 break; | 249 break; |
| 245 wastedMemory += (*it)->bytes(); | 250 wastedMemory += (*it)->bytes(); |
| 246 } | 251 } |
| 247 size_t tenPercentOfMemory = m_memoryAvailableBytes / 10; | 252 size_t tenPercentOfMemory = m_memoryAvailableBytes / 10; |
| 248 if (wastedMemory > tenPercentOfMemory) | 253 if (wastedMemory > tenPercentOfMemory) |
| 249 evictBackingsToReduceMemory(memoryUseBytes() - (wastedMemory - tenPercen tOfMemory), RespectManagerPriorityCutoff, resourceProvider); | 254 evictBackingsToReduceMemory(memoryUseBytes() - (wastedMemory - tenPercen tOfMemory), RespectManagerPriorityCutoff, resourceProvider); |
| 250 | 255 |
| 251 deleteEvictedBackings(); | 256 // Unlink all evicted backings |
| 257 for (BackingVector::const_iterator it = m_evictedBackings.begin(); it != m_e victedBackings.end(); ++it) { | |
| 258 if ((*it)->owner()) | |
| 259 (*it)->owner()->unlink(); | |
| 260 } | |
| 261 | |
| 262 // And clear the list of evicted backings | |
| 263 deleteUnlinkedEvictedBackings(); | |
| 252 } | 264 } |
| 253 | 265 |
| 254 void CCPrioritizedTextureManager::clearAllMemory(CCResourceProvider* resourcePro vider) | 266 void CCPrioritizedTextureManager::clearAllMemory(CCResourceProvider* resourcePro vider) |
| 255 { | 267 { |
| 256 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | 268 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); |
| 257 ASSERT(resourceProvider); | 269 ASSERT(resourceProvider); |
| 258 evictBackingsToReduceMemory(0, DoNotRespectManagerPriorityCutoff, resourcePr ovider); | 270 evictBackingsToReduceMemory(0, DoNotRespectManagerPriorityCutoff, resourcePr ovider); |
| 259 deleteEvictedBackings(); | |
| 260 } | 271 } |
| 261 | 272 |
| 262 void CCPrioritizedTextureManager::reduceMemoryOnImplThread(size_t limitBytes, CC ResourceProvider* resourceProvider) | 273 void CCPrioritizedTextureManager::reduceMemoryOnImplThread(size_t limitBytes, CC ResourceProvider* resourceProvider) |
| 263 { | 274 { |
| 264 ASSERT(CCProxy::isImplThread()); | 275 ASSERT(CCProxy::isImplThread()); |
| 265 ASSERT(resourceProvider); | 276 ASSERT(resourceProvider); |
| 266 evictBackingsToReduceMemory(limitBytes, DoNotRespectManagerPriorityCutoff, r esourceProvider); | 277 evictBackingsToReduceMemory(limitBytes, DoNotRespectManagerPriorityCutoff, r esourceProvider); |
| 267 } | 278 } |
| 268 | 279 |
| 269 void CCPrioritizedTextureManager::getEvictedBackings(BackingVector& evictedBacki ngs) | 280 void CCPrioritizedTextureManager::getEvictedBackings(BackingVector& evictedBacki ngs) |
| 270 { | 281 { |
| 271 ASSERT(CCProxy::isImplThread()); | 282 ASSERT(CCProxy::isImplThread()); |
| 272 evictedBackings.clear(); | 283 evictedBackings.clear(); |
| 273 evictedBackings.append(m_evictedBackings); | 284 evictedBackings.append(m_evictedBackings); |
| 274 } | 285 } |
| 275 | 286 |
| 276 void CCPrioritizedTextureManager::unlinkEvictedBackings(const BackingVector& evi ctedBackings) | 287 void CCPrioritizedTextureManager::unlinkEvictedBackings(const BackingVector& evi ctedBackings) |
| 277 { | 288 { |
| 278 ASSERT(CCProxy::isMainThread()); | 289 ASSERT(CCProxy::isMainThread()); |
| 279 for (BackingVector::const_iterator it = evictedBackings.begin(); it != evict edBackings.end(); ++it) { | 290 for (BackingVector::const_iterator it = evictedBackings.begin(); it != evict edBackings.end(); ++it) { |
| 280 CCPrioritizedTexture::Backing* backing = (*it); | 291 CCPrioritizedTexture::Backing* backing = (*it); |
| 281 if (backing->owner()) | 292 if (backing->owner()) |
| 282 backing->owner()->unlink(); | 293 backing->owner()->unlink(); |
| 283 } | 294 } |
| 284 } | 295 } |
| 285 | 296 |
| 286 bool CCPrioritizedTextureManager::deleteEvictedBackings() | 297 void CCPrioritizedTextureManager::deleteUnlinkedEvictedBackings() |
| 287 { | 298 { |
| 288 ASSERT(CCProxy::isMainThread() || (CCProxy::isImplThread() && CCProxy::isMai nThreadBlocked())); | 299 ASSERT(CCProxy::isMainThread() || (CCProxy::isImplThread() && CCProxy::isMai nThreadBlocked())); |
| 289 bool linkedEvictedBackingsExisted = false; | 300 BackingVector newEvictedBackings; |
| 290 for (BackingVector::const_iterator it = m_evictedBackings.begin(); it != m_e victedBackings.end(); ++it) { | 301 for (BackingVector::const_iterator it = m_evictedBackings.begin(); it != m_e victedBackings.end(); ++it) { |
| 291 CCPrioritizedTexture::Backing* backing = (*it); | 302 CCPrioritizedTexture::Backing* backing = (*it); |
| 292 if (backing->owner()) { | 303 if (backing->owner()) |
| 293 linkedEvictedBackingsExisted = true; | 304 newEvictedBackings.append(backing); |
| 294 backing->owner()->unlink(); | 305 else |
| 295 } | 306 delete backing; |
| 296 delete backing; | |
| 297 } | 307 } |
| 298 m_evictedBackings.clear(); | 308 m_evictedBackings.swap(newEvictedBackings); |
| 299 return linkedEvictedBackingsExisted; | 309 } |
| 310 | |
| 311 bool CCPrioritizedTextureManager::linkedEvictedBackingsExist() const | |
| 312 { | |
| 313 for (BackingVector::const_iterator it = m_evictedBackings.begin(); it != m_e victedBackings.end(); ++it) { | |
| 314 if ((*it)->owner()) | |
| 315 return true; | |
| 316 } | |
| 317 return false; | |
| 300 } | 318 } |
| 301 | 319 |
| 302 void CCPrioritizedTextureManager::registerTexture(CCPrioritizedTexture* texture) | 320 void CCPrioritizedTextureManager::registerTexture(CCPrioritizedTexture* texture) |
| 303 { | 321 { |
| 304 ASSERT(CCProxy::isMainThread()); | 322 ASSERT(CCProxy::isMainThread()); |
| 305 ASSERT(texture); | 323 ASSERT(texture); |
| 306 ASSERT(!texture->textureManager()); | 324 ASSERT(!texture->textureManager()); |
| 307 ASSERT(!texture->backing()); | 325 ASSERT(!texture->backing()); |
| 308 ASSERT(m_textures.find(texture) == m_textures.end()); | 326 ASSERT(m_textures.find(texture) == m_textures.end()); |
| 309 | 327 |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 320 | 338 |
| 321 returnBackingTexture(texture); | 339 returnBackingTexture(texture); |
| 322 texture->setManagerInternal(0); | 340 texture->setManagerInternal(0); |
| 323 m_textures.remove(texture); | 341 m_textures.remove(texture); |
| 324 texture->setAbovePriorityCutoff(false); | 342 texture->setAbovePriorityCutoff(false); |
| 325 } | 343 } |
| 326 | 344 |
| 327 void CCPrioritizedTextureManager::returnBackingTexture(CCPrioritizedTexture* tex ture) | 345 void CCPrioritizedTextureManager::returnBackingTexture(CCPrioritizedTexture* tex ture) |
| 328 { | 346 { |
| 329 ASSERT(CCProxy::isMainThread() || (CCProxy::isImplThread() && CCProxy::isMai nThreadBlocked())); | 347 ASSERT(CCProxy::isMainThread() || (CCProxy::isImplThread() && CCProxy::isMai nThreadBlocked())); |
| 330 if (texture->backing()) { | 348 if (texture->backing()) |
| 331 texture->unlink(); | 349 texture->unlink(); |
| 332 m_needsUpdateBackingsPrioritites = true; | |
| 333 } | |
| 334 } | 350 } |
| 335 | 351 |
| 336 CCPrioritizedTexture::Backing* CCPrioritizedTextureManager::createBacking(IntSiz e size, GC3Denum format, CCResourceProvider* resourceProvider) | 352 CCPrioritizedTexture::Backing* CCPrioritizedTextureManager::createBacking(IntSiz e size, GC3Denum format, CCResourceProvider* resourceProvider) |
| 337 { | 353 { |
| 338 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); | 354 ASSERT(CCProxy::isImplThread() && CCProxy::isMainThreadBlocked()); |
| 339 ASSERT(resourceProvider); | 355 ASSERT(resourceProvider); |
| 340 CCResourceProvider::ResourceId resourceId = resourceProvider->createResource (m_pool, size, format, CCResourceProvider::TextureUsageAny); | 356 CCResourceProvider::ResourceId resourceId = resourceProvider->createResource (m_pool, size, format, CCResourceProvider::TextureUsageAny); |
| 341 CCPrioritizedTexture::Backing* backing = new CCPrioritizedTexture::Backing(r esourceId, resourceProvider, size, format); | 357 CCPrioritizedTexture::Backing* backing = new CCPrioritizedTexture::Backing(r esourceId, resourceProvider, size, format); |
| 342 m_memoryUseBytes += backing->bytes(); | 358 m_memoryUseBytes += backing->bytes(); |
| 343 // Put backing texture at the front for eviction, since it isn't in use yet. | 359 // Put backing texture at the front for eviction, since it isn't in use yet. |
| (...skipping 28 matching lines...) Expand all Loading... | |
| 372 // every public function. | 388 // every public function. |
| 373 | 389 |
| 374 // Backings/textures must be doubly-linked and only to other backings/textur es in this manager. | 390 // Backings/textures must be doubly-linked and only to other backings/textur es in this manager. |
| 375 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { | 391 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { |
| 376 if ((*it)->owner()) { | 392 if ((*it)->owner()) { |
| 377 ASSERT(m_textures.find((*it)->owner()) != m_textures.end()); | 393 ASSERT(m_textures.find((*it)->owner()) != m_textures.end()); |
| 378 ASSERT((*it)->owner()->backing() == (*it)); | 394 ASSERT((*it)->owner()->backing() == (*it)); |
| 379 } | 395 } |
| 380 } | 396 } |
| 381 for (TextureSet::iterator it = m_textures.begin(); it != m_textures.end(); + +it) { | 397 for (TextureSet::iterator it = m_textures.begin(); it != m_textures.end(); + +it) { |
| 382 if ((*it)->backing()) { | 398 CCPrioritizedTexture* texture = (*it); |
| 383 ASSERT(m_backings.find((*it)->backing()) != m_backings.end()); | 399 CCPrioritizedTexture::Backing* backing = texture->backing(); |
| 384 ASSERT((*it)->backing()->owner() == (*it)); | 400 if (backing) { |
| 401 if (backing->resourceHasBeenDeleted()) | |
| 402 ASSERT(m_backings.find(backing) == m_backings.end()); | |
|
epenner
2012/10/09 17:25:04
Maybe ASSERT that it's in the evicted list?
ccameron
2012/10/09 21:03:56
Done.
| |
| 403 else | |
| 404 ASSERT(m_backings.find(backing) != m_backings.end()); | |
| 405 ASSERT(backing->owner() == texture); | |
| 385 } | 406 } |
| 386 } | 407 } |
| 387 | 408 |
| 388 // At all times, backings that can be evicted must always come before | 409 // At all times, backings that can be evicted must always come before |
| 389 // backings that can't be evicted in the backing texture list (otherwise | 410 // backings that can't be evicted in the backing texture list (otherwise |
| 390 // reduceMemory will not find all textures available for eviction/recycling) . | 411 // reduceMemory will not find all textures available for eviction/recycling) . |
| 391 bool reachedOwned = false; | 412 bool reachedUnrecyclable = false; |
| 392 bool reachedAboveCutoff = false; | |
| 393 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { | 413 for (BackingSet::iterator it = m_backings.begin(); it != m_backings.end(); + +it) { |
| 394 if ((*it)->hadOwnerAtLastPriorityUpdate()) | 414 if (!(*it)->canBeRecycled()) |
|
epenner
2012/10/09 17:25:04
This is good to have for if we enable more recycli
| |
| 395 reachedOwned = true; | 415 reachedUnrecyclable = true; |
| 396 if ((*it)->wasAbovePriorityCutoffAtLastPriorityUpdate()) | 416 if (reachedUnrecyclable) |
| 397 reachedAboveCutoff = true; | 417 ASSERT(!(*it)->canBeRecycled()); |
| 398 if (reachedOwned) | 418 else |
| 399 ASSERT((*it)->hadOwnerAtLastPriorityUpdate()); | 419 ASSERT((*it)->canBeRecycled()); |
| 400 if (reachedAboveCutoff) { | |
| 401 ASSERT((*it)->hadOwnerAtLastPriorityUpdate() && (*it)->wasAbovePrior ityCutoffAtLastPriorityUpdate()); | |
| 402 ASSERT(reachedOwned); | |
| 403 } | |
| 404 } | 420 } |
| 405 } | 421 } |
| 406 #endif | 422 #endif |
| 407 | 423 |
| 408 | 424 |
| 409 } // namespace cc | 425 } // namespace cc |
| OLD | NEW |