Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5002)

Unified Diff: cc/resources/prioritized_resource_manager.cc

Issue 1057283003: Remove parts of //cc we aren't using (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/prioritized_resource_manager.h ('k') | cc/resources/prioritized_resource_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/resources/prioritized_resource_manager.cc
diff --git a/cc/resources/prioritized_resource_manager.cc b/cc/resources/prioritized_resource_manager.cc
deleted file mode 100644
index 236377b851184d66308d90e38ecec5b550ae153a..0000000000000000000000000000000000000000
--- a/cc/resources/prioritized_resource_manager.cc
+++ /dev/null
@@ -1,547 +0,0 @@
-// Copyright 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "cc/resources/prioritized_resource_manager.h"
-
-#include <algorithm>
-
-#include "base/trace_event/trace_event.h"
-#include "cc/resources/prioritized_resource.h"
-#include "cc/resources/priority_calculator.h"
-#include "cc/trees/proxy.h"
-
-namespace cc {
-
-PrioritizedResourceManager::PrioritizedResourceManager(const Proxy* proxy)
- : max_memory_limit_bytes_(DefaultMemoryAllocationLimit()),
- external_priority_cutoff_(PriorityCalculator::AllowEverythingCutoff()),
- memory_use_bytes_(0),
- memory_above_cutoff_bytes_(0),
- max_memory_needed_bytes_(0),
- memory_available_bytes_(0),
- proxy_(proxy),
- backings_tail_not_sorted_(false),
- memory_visible_bytes_(0),
- memory_visible_and_nearby_bytes_(0),
- memory_visible_last_pushed_bytes_(0),
- memory_visible_and_nearby_last_pushed_bytes_(0) {}
-
-PrioritizedResourceManager::~PrioritizedResourceManager() {
- while (textures_.size() > 0)
- UnregisterTexture(*textures_.begin());
-
- UnlinkAndClearEvictedBackings();
- DCHECK(evicted_backings_.empty());
-
- // Each remaining backing is a leaked opengl texture. There should be none.
- DCHECK(backings_.empty());
-}
-
-size_t PrioritizedResourceManager::MemoryVisibleBytes() const {
- DCHECK(proxy_->IsImplThread());
- return memory_visible_last_pushed_bytes_;
-}
-
-size_t PrioritizedResourceManager::MemoryVisibleAndNearbyBytes() const {
- DCHECK(proxy_->IsImplThread());
- return memory_visible_and_nearby_last_pushed_bytes_;
-}
-
-void PrioritizedResourceManager::PrioritizeTextures() {
- TRACE_EVENT0("cc", "PrioritizedResourceManager::PrioritizeTextures");
- DCHECK(proxy_->IsMainThread());
-
- // Sorting textures in this function could be replaced by a slightly
- // modified O(n) quick-select to partition textures rather than
- // sort them (if performance of the sort becomes an issue).
-
- TextureVector& sorted_textures = temp_texture_vector_;
- sorted_textures.clear();
-
- // Copy all textures into a vector, sort them, and collect memory requirements
- // statistics.
- memory_visible_bytes_ = 0;
- memory_visible_and_nearby_bytes_ = 0;
- for (TextureSet::iterator it = textures_.begin(); it != textures_.end();
- ++it) {
- PrioritizedResource* texture = (*it);
- sorted_textures.push_back(texture);
- if (PriorityCalculator::priority_is_higher(
- texture->request_priority(),
- PriorityCalculator::AllowVisibleOnlyCutoff()))
- memory_visible_bytes_ += texture->bytes();
- if (PriorityCalculator::priority_is_higher(
- texture->request_priority(),
- PriorityCalculator::AllowVisibleAndNearbyCutoff()))
- memory_visible_and_nearby_bytes_ += texture->bytes();
- }
- std::sort(sorted_textures.begin(), sorted_textures.end(), CompareTextures);
-
- // Compute a priority cutoff based on memory pressure
- memory_available_bytes_ = max_memory_limit_bytes_;
- priority_cutoff_ = external_priority_cutoff_;
- size_t memory_bytes = 0;
- for (TextureVector::iterator it = sorted_textures.begin();
- it != sorted_textures.end();
- ++it) {
- if ((*it)->is_self_managed()) {
- // Account for self-managed memory immediately by reducing the memory
- // available (since it never gets acquired).
- size_t new_memory_bytes = memory_bytes + (*it)->bytes();
- if (new_memory_bytes > memory_available_bytes_) {
- priority_cutoff_ = (*it)->request_priority();
- memory_available_bytes_ = memory_bytes;
- break;
- }
- memory_available_bytes_ -= (*it)->bytes();
- } else {
- size_t new_memory_bytes = memory_bytes + (*it)->bytes();
- if (new_memory_bytes > memory_available_bytes_) {
- priority_cutoff_ = (*it)->request_priority();
- break;
- }
- memory_bytes = new_memory_bytes;
- }
- }
-
- // Disallow any textures with priority below the external cutoff to have
- // backings.
- for (TextureVector::iterator it = sorted_textures.begin();
- it != sorted_textures.end();
- ++it) {
- PrioritizedResource* texture = (*it);
- if (!PriorityCalculator::priority_is_higher(texture->request_priority(),
- external_priority_cutoff_) &&
- texture->have_backing_texture())
- texture->Unlink();
- }
-
- // Only allow textures if they are higher than the cutoff. All textures
- // of the same priority are accepted or rejected together, rather than
- // being partially allowed randomly.
- max_memory_needed_bytes_ = 0;
- memory_above_cutoff_bytes_ = 0;
- for (TextureVector::iterator it = sorted_textures.begin();
- it != sorted_textures.end();
- ++it) {
- PrioritizedResource* resource = *it;
- bool is_above_priority_cutoff = PriorityCalculator::priority_is_higher(
- resource->request_priority(), priority_cutoff_);
- resource->set_above_priority_cutoff(is_above_priority_cutoff);
- if (!resource->is_self_managed()) {
- max_memory_needed_bytes_ += resource->bytes();
- if (is_above_priority_cutoff)
- memory_above_cutoff_bytes_ += resource->bytes();
- }
- }
- sorted_textures.clear();
-
- DCHECK_LE(memory_above_cutoff_bytes_, memory_available_bytes_);
- DCHECK_LE(MemoryAboveCutoffBytes(), MaxMemoryLimitBytes());
-}
-
-void PrioritizedResourceManager::PushTexturePrioritiesToBackings() {
- TRACE_EVENT0("cc",
- "PrioritizedResourceManager::PushTexturePrioritiesToBackings");
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
-
- AssertInvariants();
- for (BackingList::iterator it = backings_.begin(); it != backings_.end();
- ++it)
- (*it)->UpdatePriority();
- SortBackings();
- AssertInvariants();
-
- // Push memory requirements to the impl thread structure.
- memory_visible_last_pushed_bytes_ = memory_visible_bytes_;
- memory_visible_and_nearby_last_pushed_bytes_ =
- memory_visible_and_nearby_bytes_;
-}
-
-void PrioritizedResourceManager::UpdateBackingsState(
- ResourceProvider* resource_provider) {
- TRACE_EVENT0("cc",
- "PrioritizedResourceManager::UpdateBackingsInDrawingImplTree");
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
-
- AssertInvariants();
- for (BackingList::iterator it = backings_.begin(); it != backings_.end();
- ++it) {
- PrioritizedResource::Backing* backing = (*it);
- backing->UpdateState(resource_provider);
- }
- SortBackings();
- AssertInvariants();
-}
-
-void PrioritizedResourceManager::SortBackings() {
- TRACE_EVENT0("cc", "PrioritizedResourceManager::SortBackings");
- DCHECK(proxy_->IsImplThread());
-
- // Put backings in eviction/recycling order.
- backings_.sort(CompareBackings);
- backings_tail_not_sorted_ = false;
-}
-
-void PrioritizedResourceManager::ClearPriorities() {
- DCHECK(proxy_->IsMainThread());
- for (TextureSet::iterator it = textures_.begin(); it != textures_.end();
- ++it) {
- // TODO(reveman): We should remove this and just set all priorities to
- // PriorityCalculator::lowestPriority() once we have priorities for all
- // textures (we can't currently calculate distances for off-screen
- // textures).
- (*it)->set_request_priority(
- PriorityCalculator::LingeringPriority((*it)->request_priority()));
- }
-}
-
-bool PrioritizedResourceManager::RequestLate(PrioritizedResource* texture) {
- DCHECK(proxy_->IsMainThread());
-
- // This is already above cutoff, so don't double count it's memory below.
- if (texture->is_above_priority_cutoff())
- return true;
-
- // Allow textures that have priority equal to the cutoff, but not strictly
- // lower.
- if (PriorityCalculator::priority_is_lower(texture->request_priority(),
- priority_cutoff_))
- return false;
-
- // Disallow textures that do not have a priority strictly higher than the
- // external cutoff.
- if (!PriorityCalculator::priority_is_higher(texture->request_priority(),
- external_priority_cutoff_))
- return false;
-
- size_t new_memory_bytes = memory_above_cutoff_bytes_ + texture->bytes();
- if (new_memory_bytes > memory_available_bytes_)
- return false;
-
- memory_above_cutoff_bytes_ = new_memory_bytes;
- texture->set_above_priority_cutoff(true);
- return true;
-}
-
-void PrioritizedResourceManager::AcquireBackingTextureIfNeeded(
- PrioritizedResource* texture,
- ResourceProvider* resource_provider) {
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
- DCHECK(!texture->is_self_managed());
- DCHECK(texture->is_above_priority_cutoff());
- if (texture->backing() || !texture->is_above_priority_cutoff())
- return;
-
- // Find a backing below, by either recycling or allocating.
- PrioritizedResource::Backing* backing = NULL;
-
- // First try to recycle
- for (BackingList::iterator it = backings_.begin(); it != backings_.end();
- ++it) {
- if (!(*it)->CanBeRecycledIfNotInExternalUse())
- break;
- if (resource_provider->InUseByConsumer((*it)->id()))
- continue;
- if ((*it)->size() == texture->size() &&
- (*it)->format() == texture->format()) {
- backing = (*it);
- backings_.erase(it);
- break;
- }
- }
-
- // Otherwise reduce memory and just allocate a new backing texures.
- if (!backing) {
- EvictBackingsToReduceMemory(memory_available_bytes_ - texture->bytes(),
- PriorityCalculator::AllowEverythingCutoff(),
- EVICT_ONLY_RECYCLABLE,
- DO_NOT_UNLINK_BACKINGS,
- resource_provider);
- backing =
- CreateBacking(texture->size(), texture->format(), resource_provider);
- }
-
- // Move the used backing to the end of the eviction list, and note that
- // the tail is not sorted.
- if (backing->owner())
- backing->owner()->Unlink();
- texture->Link(backing);
- backings_.push_back(backing);
- backings_tail_not_sorted_ = true;
-
- // Update the backing's priority from its new owner.
- backing->UpdatePriority();
-}
-
-bool PrioritizedResourceManager::EvictBackingsToReduceMemory(
- size_t limit_bytes,
- int priority_cutoff,
- EvictionPolicy eviction_policy,
- UnlinkPolicy unlink_policy,
- ResourceProvider* resource_provider) {
- DCHECK(proxy_->IsImplThread());
- if (unlink_policy == UNLINK_BACKINGS)
- DCHECK(proxy_->IsMainThreadBlocked());
- if (MemoryUseBytes() <= limit_bytes &&
- PriorityCalculator::AllowEverythingCutoff() == priority_cutoff)
- return false;
-
- // Destroy backings until we are below the limit,
- // or until all backings remaining are above the cutoff.
- bool evicted_anything = false;
- while (backings_.size() > 0) {
- PrioritizedResource::Backing* backing = backings_.front();
- if (MemoryUseBytes() <= limit_bytes &&
- PriorityCalculator::priority_is_higher(
- backing->request_priority_at_last_priority_update(),
- priority_cutoff))
- break;
- if (eviction_policy == EVICT_ONLY_RECYCLABLE &&
- !backing->CanBeRecycledIfNotInExternalUse())
- break;
- if (unlink_policy == UNLINK_BACKINGS && backing->owner())
- backing->owner()->Unlink();
- EvictFirstBackingResource(resource_provider);
- evicted_anything = true;
- }
- return evicted_anything;
-}
-
-void PrioritizedResourceManager::ReduceWastedMemory(
- ResourceProvider* resource_provider) {
- // We currently collect backings from deleted textures for later recycling.
- // However, if we do that forever we will always use the max limit even if
- // we really need very little memory. This should probably be solved by
- // reducing the limit externally, but until then this just does some "clean
- // up" of unused backing textures (any more than 10%).
- size_t wasted_memory = 0;
- for (BackingList::iterator it = backings_.begin(); it != backings_.end();
- ++it) {
- if ((*it)->owner())
- break;
- if ((*it)->in_parent_compositor())
- continue;
- wasted_memory += (*it)->bytes();
- }
- size_t wasted_memory_to_allow = memory_available_bytes_ / 10;
- // If the external priority cutoff indicates that unused memory should be
- // freed, then do not allow any memory for texture recycling.
- if (external_priority_cutoff_ != PriorityCalculator::AllowEverythingCutoff())
- wasted_memory_to_allow = 0;
- if (wasted_memory > wasted_memory_to_allow)
- EvictBackingsToReduceMemory(MemoryUseBytes() -
- (wasted_memory - wasted_memory_to_allow),
- PriorityCalculator::AllowEverythingCutoff(),
- EVICT_ONLY_RECYCLABLE,
- DO_NOT_UNLINK_BACKINGS,
- resource_provider);
-}
-
-void PrioritizedResourceManager::ReduceMemory(
- ResourceProvider* resource_provider) {
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
- EvictBackingsToReduceMemory(memory_available_bytes_,
- PriorityCalculator::AllowEverythingCutoff(),
- EVICT_ANYTHING,
- UNLINK_BACKINGS,
- resource_provider);
- DCHECK_LE(MemoryUseBytes(), memory_available_bytes_);
-
- ReduceWastedMemory(resource_provider);
-}
-
-void PrioritizedResourceManager::ClearAllMemory(
- ResourceProvider* resource_provider) {
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
- if (!resource_provider) {
- DCHECK(backings_.empty());
- return;
- }
- EvictBackingsToReduceMemory(0,
- PriorityCalculator::AllowEverythingCutoff(),
- EVICT_ANYTHING,
- DO_NOT_UNLINK_BACKINGS,
- resource_provider);
-}
-
-bool PrioritizedResourceManager::ReduceMemoryOnImplThread(
- size_t limit_bytes,
- int priority_cutoff,
- ResourceProvider* resource_provider) {
- DCHECK(proxy_->IsImplThread());
- DCHECK(resource_provider);
-
- // If we are in the process of uploading a new frame then the backings at the
- // very end of the list are not sorted by priority. Sort them before doing the
- // eviction.
- if (backings_tail_not_sorted_)
- SortBackings();
- return EvictBackingsToReduceMemory(limit_bytes,
- priority_cutoff,
- EVICT_ANYTHING,
- DO_NOT_UNLINK_BACKINGS,
- resource_provider);
-}
-
-void PrioritizedResourceManager::UnlinkAndClearEvictedBackings() {
- DCHECK(proxy_->IsMainThread());
- base::AutoLock scoped_lock(evicted_backings_lock_);
- for (BackingList::const_iterator it = evicted_backings_.begin();
- it != evicted_backings_.end();
- ++it) {
- PrioritizedResource::Backing* backing = (*it);
- if (backing->owner())
- backing->owner()->Unlink();
- delete backing;
- }
- evicted_backings_.clear();
-}
-
-bool PrioritizedResourceManager::LinkedEvictedBackingsExist() const {
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
- base::AutoLock scoped_lock(evicted_backings_lock_);
- for (BackingList::const_iterator it = evicted_backings_.begin();
- it != evicted_backings_.end();
- ++it) {
- if ((*it)->owner())
- return true;
- }
- return false;
-}
-
-void PrioritizedResourceManager::RegisterTexture(PrioritizedResource* texture) {
- DCHECK(proxy_->IsMainThread());
- DCHECK(texture);
- DCHECK(!texture->resource_manager());
- DCHECK(!texture->backing());
- DCHECK(!ContainsKey(textures_, texture));
-
- texture->set_manager_internal(this);
- textures_.insert(texture);
-}
-
-void PrioritizedResourceManager::UnregisterTexture(
- PrioritizedResource* texture) {
- DCHECK(proxy_->IsMainThread() ||
- (proxy_->IsImplThread() && proxy_->IsMainThreadBlocked()));
- DCHECK(texture);
- DCHECK(ContainsKey(textures_, texture));
-
- ReturnBackingTexture(texture);
- texture->set_manager_internal(NULL);
- textures_.erase(texture);
- texture->set_above_priority_cutoff(false);
-}
-
-void PrioritizedResourceManager::ReturnBackingTexture(
- PrioritizedResource* texture) {
- DCHECK(proxy_->IsMainThread() ||
- (proxy_->IsImplThread() && proxy_->IsMainThreadBlocked()));
- if (texture->backing())
- texture->Unlink();
-}
-
-PrioritizedResource::Backing* PrioritizedResourceManager::CreateBacking(
- const gfx::Size& size,
- ResourceFormat format,
- ResourceProvider* resource_provider) {
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
- DCHECK(resource_provider);
- ResourceProvider::ResourceId resource_id =
- resource_provider->CreateManagedResource(
- size, GL_TEXTURE_2D, GL_CLAMP_TO_EDGE,
- ResourceProvider::TEXTURE_HINT_IMMUTABLE, format);
- PrioritizedResource::Backing* backing = new PrioritizedResource::Backing(
- resource_id, resource_provider, size, format);
- memory_use_bytes_ += backing->bytes();
- return backing;
-}
-
-void PrioritizedResourceManager::EvictFirstBackingResource(
- ResourceProvider* resource_provider) {
- DCHECK(proxy_->IsImplThread());
- DCHECK(resource_provider);
- DCHECK(!backings_.empty());
- PrioritizedResource::Backing* backing = backings_.front();
-
- // Note that we create a backing and its resource at the same time, but we
- // delete the backing structure and its resource in two steps. This is because
- // we can delete the resource while the main thread is running, but we cannot
- // unlink backings while the main thread is running.
- backing->DeleteResource(resource_provider);
- memory_use_bytes_ -= backing->bytes();
- backings_.pop_front();
- base::AutoLock scoped_lock(evicted_backings_lock_);
- evicted_backings_.push_back(backing);
-}
-
-void PrioritizedResourceManager::AssertInvariants() {
-#if DCHECK_IS_ON()
- DCHECK(proxy_->IsImplThread() && proxy_->IsMainThreadBlocked());
-
- // If we hit any of these asserts, there is a bug in this class. To see
- // where the bug is, call this function at the beginning and end of
- // every public function.
-
- // Backings/textures must be doubly-linked and only to other backings/textures
- // in this manager.
- for (BackingList::iterator it = backings_.begin(); it != backings_.end();
- ++it) {
- if ((*it)->owner()) {
- DCHECK(ContainsKey(textures_, (*it)->owner()));
- DCHECK((*it)->owner()->backing() == (*it));
- }
- }
- for (TextureSet::iterator it = textures_.begin(); it != textures_.end();
- ++it) {
- PrioritizedResource* texture = (*it);
- PrioritizedResource::Backing* backing = texture->backing();
- base::AutoLock scoped_lock(evicted_backings_lock_);
- if (backing) {
- if (backing->ResourceHasBeenDeleted()) {
- DCHECK(std::find(backings_.begin(), backings_.end(), backing) ==
- backings_.end());
- DCHECK(std::find(evicted_backings_.begin(),
- evicted_backings_.end(),
- backing) != evicted_backings_.end());
- } else {
- DCHECK(std::find(backings_.begin(), backings_.end(), backing) !=
- backings_.end());
- DCHECK(std::find(evicted_backings_.begin(),
- evicted_backings_.end(),
- backing) == evicted_backings_.end());
- }
- DCHECK(backing->owner() == texture);
- }
- }
-
- // At all times, backings that can be evicted must always come before
- // backings that can't be evicted in the backing texture list (otherwise
- // ReduceMemory will not find all textures available for eviction/recycling).
- bool reached_unrecyclable = false;
- PrioritizedResource::Backing* previous_backing = NULL;
- for (BackingList::iterator it = backings_.begin(); it != backings_.end();
- ++it) {
- PrioritizedResource::Backing* backing = *it;
- if (previous_backing &&
- (!backings_tail_not_sorted_ ||
- !backing->was_above_priority_cutoff_at_last_priority_update()))
- DCHECK(CompareBackings(previous_backing, backing));
- if (!backing->CanBeRecycledIfNotInExternalUse())
- reached_unrecyclable = true;
- if (reached_unrecyclable)
- DCHECK(!backing->CanBeRecycledIfNotInExternalUse());
- else
- DCHECK(backing->CanBeRecycledIfNotInExternalUse());
- previous_backing = backing;
- }
-#endif // DCHECK_IS_ON()
-}
-
-const Proxy* PrioritizedResourceManager::ProxyForDebug() const {
- return proxy_;
-}
-
-} // namespace cc
« no previous file with comments | « cc/resources/prioritized_resource_manager.h ('k') | cc/resources/prioritized_resource_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698