Index: cc/output/context_cache_controller.cc |
diff --git a/cc/output/context_cache_controller.cc b/cc/output/context_cache_controller.cc |
index 7401629e37caf32adc5537af6fcfd5558e9a8aef..218059dd1780531bd90debf3b0f8884b5a92cb6a 100644 |
--- a/cc/output/context_cache_controller.cc |
+++ b/cc/output/context_cache_controller.cc |
@@ -4,26 +4,20 @@ |
#include "cc/output/context_cache_controller.h" |
-#include "base/bind.h" |
#include "base/logging.h" |
#include "base/memory/ptr_util.h" |
#include "base/single_thread_task_runner.h" |
-#include "base/synchronization/lock.h" |
#include "gpu/command_buffer/client/context_support.h" |
#include "third_party/skia/include/gpu/GrContext.h" |
namespace cc { |
-namespace { |
-static const int kIdleCleanupDelaySeconds = 1; |
-} // namespace |
+ContextCacheController::ScopedVisibility::ScopedVisibility() = default; |
-ContextCacheController::ScopedToken::ScopedToken() = default; |
- |
-ContextCacheController::ScopedToken::~ScopedToken() { |
+ContextCacheController::ScopedVisibility::~ScopedVisibility() { |
DCHECK(released_); |
} |
-void ContextCacheController::ScopedToken::Release() { |
+void ContextCacheController::ScopedVisibility::Release() { |
DCHECK(!released_); |
released_ = true; |
} |
@@ -31,16 +25,7 @@ |
ContextCacheController::ContextCacheController( |
gpu::ContextSupport* context_support, |
scoped_refptr<base::SingleThreadTaskRunner> task_runner) |
- : context_support_(context_support), |
- task_runner_(std::move(task_runner)), |
- weak_factory_(this) { |
- // The |weak_factory_| can only be used from a single thread. We |
- // create/destroy this class and run callbacks on a single thread, but we |
- // want to be able to post callbacks from multiple threads. We need a weak |
- // ptr to post callbacks, so acquire one here, while we're on the right |
- // thread. |
- weak_ptr_ = weak_factory_.GetWeakPtr(); |
-} |
+ : context_support_(context_support), task_runner_(std::move(task_runner)) {} |
ContextCacheController::~ContextCacheController() = default; |
@@ -48,15 +33,8 @@ |
gr_context_ = gr_context; |
} |
-void ContextCacheController::SetLock(base::Lock* lock) { |
- context_lock_ = lock; |
-} |
- |
std::unique_ptr<ContextCacheController::ScopedVisibility> |
ContextCacheController::ClientBecameVisible() { |
- if (context_lock_) |
- context_lock_->AssertAcquired(); |
- |
bool became_visible = num_clients_visible_ == 0; |
++num_clients_visible_; |
@@ -71,105 +49,24 @@ |
DCHECK(scoped_visibility); |
scoped_visibility->Release(); |
- if (context_lock_) |
- context_lock_->AssertAcquired(); |
- |
DCHECK_GT(num_clients_visible_, 0u); |
--num_clients_visible_; |
if (num_clients_visible_ == 0) { |
- // We are freeing resources now - cancel any pending idle callbacks. |
- InvalidatePendingIdleCallbacks(); |
- |
if (gr_context_) |
gr_context_->freeGpuResources(); |
context_support_->SetAggressivelyFreeResources(true); |
} |
} |
-std::unique_ptr<ContextCacheController::ScopedBusy> |
-ContextCacheController::ClientBecameBusy() { |
- if (context_lock_) |
- context_lock_->AssertAcquired(); |
- |
- ++num_clients_busy_; |
- // We are busy, cancel any pending idle callbacks. |
- InvalidatePendingIdleCallbacks(); |
- |
- return base::WrapUnique(new ScopedBusy()); |
+std::unique_ptr<ContextCacheController::ScopedVisibility> |
+ContextCacheController::CreateScopedVisibilityForTesting() const { |
+ return base::WrapUnique(new ScopedVisibility()); |
} |
-void ContextCacheController::ClientBecameNotBusy( |
- std::unique_ptr<ScopedBusy> scoped_busy) { |
- DCHECK(scoped_busy); |
- scoped_busy->Release(); |
- |
- if (context_lock_) |
- context_lock_->AssertAcquired(); |
- |
- DCHECK_GT(num_clients_busy_, 0u); |
- --num_clients_busy_; |
- |
- // If we have become idle and we are visible, queue a task to drop resources |
- // after a delay. If are not visible, we have already dropped resources. |
- if (num_clients_busy_ == 0 && num_clients_visible_ > 0 && task_runner_) { |
- // If we already have a callback pending, don't post a new one. The pending |
- // callback will handle posting a new callback itself. This prevents us from |
- // flooding the system with tasks. |
- if (!callback_pending_) { |
- { |
- base::AutoLock hold(current_idle_generation_lock_); |
- PostIdleCallback(current_idle_generation_); |
- } |
- callback_pending_ = true; |
- } |
- } |
-} |
- |
-void ContextCacheController::PostIdleCallback( |
- uint32_t current_idle_generation) const { |
- task_runner_->PostDelayedTask( |
- FROM_HERE, base::Bind(&ContextCacheController::OnIdle, weak_ptr_, |
- current_idle_generation), |
- base::TimeDelta::FromSeconds(kIdleCleanupDelaySeconds)); |
-} |
- |
-void ContextCacheController::InvalidatePendingIdleCallbacks() { |
- base::AutoLock hold(current_idle_generation_lock_); |
- ++current_idle_generation_; |
-} |
- |
-void ContextCacheController::OnIdle(uint32_t idle_generation) { |
- // First check if we should run our idle callback at all. If we have become |
- // busy since scheduling, just schedule another idle callback and return. |
- { |
- base::AutoLock hold(current_idle_generation_lock_); |
- if (current_idle_generation_ != idle_generation) { |
- PostIdleCallback(current_idle_generation_); |
- return; |
- } |
- } |
- |
- // Try to acquire the context lock - if we can't acquire it then we've become |
- // busy since checking |current_idle_generation_| above. In this case, just |
- // re-post our idle callback and return. |
- if (context_lock_ && !context_lock_->Try()) { |
- base::AutoLock hold(current_idle_generation_lock_); |
- PostIdleCallback(current_idle_generation_); |
- return; |
- } |
- |
- if (gr_context_) |
- gr_context_->freeGpuResources(); |
- |
- // Toggle SetAggressivelyFreeResources to drop command buffer data. |
- context_support_->SetAggressivelyFreeResources(true); |
- context_support_->SetAggressivelyFreeResources(false); |
- |
- callback_pending_ = false; |
- |
- if (context_lock_) |
- context_lock_->Release(); |
+void ContextCacheController::ReleaseScopedVisibilityForTesting( |
+ std::unique_ptr<ScopedVisibility> scoped_visibility) const { |
+ scoped_visibility->Release(); |
} |
} // namespace cc |