Commit e7ac1bbe authored by tasak's avatar tasak Committed by Commit bot

Make cc::SoftwareImageDecodeController, cc::GpuImageDecodeController,...

Make cc::SoftwareImageDecodeController, cc::GpuImageDecodeController, cc::ResourcePool, and cc::StagingBufferPool MemoryCoordinatorClient.

- implement OnMemoryStateChange for background renderer's purge +
  suspend. So the method reduces memory only when state == SUSPENDED.
- intent-to-implement-and-ship of background renderer's purge + suspend is
  https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/DK189tnM8l4
- one of the documents attached in the above intent is
  https://docs.google.com/document/d/1EgLimgxWK5DGhptnNVbEGSvVn6Q609ZJaBkLjEPRJvI/edit?usp=sharing

BUG=635419
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_precise_blink_rel

Review-Url: https://codereview.chromium.org/2286583002
Cr-Commit-Position: refs/heads/master@{#418834}
parent 5958170d
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <memory> #include <memory>
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
...@@ -141,11 +142,16 @@ StagingBufferPool::StagingBufferPool(base::SequencedTaskRunner* task_runner, ...@@ -141,11 +142,16 @@ StagingBufferPool::StagingBufferPool(base::SequencedTaskRunner* task_runner,
this, "cc::StagingBufferPool", base::ThreadTaskRunnerHandle::Get()); this, "cc::StagingBufferPool", base::ThreadTaskRunnerHandle::Get());
reduce_memory_usage_callback_ = base::Bind( reduce_memory_usage_callback_ = base::Bind(
&StagingBufferPool::ReduceMemoryUsage, weak_ptr_factory_.GetWeakPtr()); &StagingBufferPool::ReduceMemoryUsage, weak_ptr_factory_.GetWeakPtr());
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
} }
StagingBufferPool::~StagingBufferPool() { StagingBufferPool::~StagingBufferPool() {
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this); this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
} }
void StagingBufferPool::Shutdown() { void StagingBufferPool::Shutdown() {
...@@ -409,4 +415,23 @@ void StagingBufferPool::ReleaseBuffersNotUsedSince(base::TimeTicks time) { ...@@ -409,4 +415,23 @@ void StagingBufferPool::ReleaseBuffersNotUsedSince(base::TimeTicks time) {
} }
} }
void StagingBufferPool::OnMemoryStateChange(base::MemoryState state) {
switch (state) {
case base::MemoryState::NORMAL:
// TODO(tasak): go back to normal state.
break;
case base::MemoryState::THROTTLED:
// TODO(tasak): make the limits of this component's caches smaller to
// save memory usage.
break;
case base::MemoryState::SUSPENDED:
// TODO(tasak): free this component's caches as much as possible before
// suspending renderer.
break;
case base::MemoryState::UNKNOWN:
// NOT_REACHED.
break;
}
}
} // namespace cc } // namespace cc
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <set> #include <set>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "base/time/time.h" #include "base/time/time.h"
...@@ -50,7 +51,8 @@ struct StagingBuffer { ...@@ -50,7 +51,8 @@ struct StagingBuffer {
}; };
class CC_EXPORT StagingBufferPool class CC_EXPORT StagingBufferPool
: public base::trace_event::MemoryDumpProvider { : public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public: public:
~StagingBufferPool() final; ~StagingBufferPool() final;
...@@ -87,6 +89,9 @@ class CC_EXPORT StagingBufferPool ...@@ -87,6 +89,9 @@ class CC_EXPORT StagingBufferPool
void StagingStateAsValueInto( void StagingStateAsValueInto(
base::trace_event::TracedValue* staging_state) const; base::trace_event::TracedValue* staging_state) const;
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
scoped_refptr<base::SequencedTaskRunner> task_runner_; scoped_refptr<base::SequencedTaskRunner> task_runner_;
ContextProvider* const worker_context_provider_; ContextProvider* const worker_context_provider_;
ResourceProvider* const resource_provider_; ResourceProvider* const resource_provider_;
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <utility> #include <utility>
#include "base/format_macros.h" #include "base/format_macros.h"
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/memory_dump_manager.h"
...@@ -71,11 +72,16 @@ ResourcePool::ResourcePool(ResourceProvider* resource_provider, ...@@ -71,11 +72,16 @@ ResourcePool::ResourcePool(ResourceProvider* resource_provider,
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
this, "cc::ResourcePool", task_runner_.get()); this, "cc::ResourcePool", task_runner_.get());
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
} }
ResourcePool::~ResourcePool() { ResourcePool::~ResourcePool() {
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this); this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
DCHECK_EQ(0u, in_use_resources_.size()); DCHECK_EQ(0u, in_use_resources_.size());
...@@ -453,4 +459,23 @@ bool ResourcePool::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args, ...@@ -453,4 +459,23 @@ bool ResourcePool::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
return true; return true;
} }
void ResourcePool::OnMemoryStateChange(base::MemoryState state) {
switch (state) {
case base::MemoryState::NORMAL:
// TODO(tasak): go back to normal state.
break;
case base::MemoryState::THROTTLED:
// TODO(tasak): make the limits of this component's caches smaller to
// save memory usage.
break;
case base::MemoryState::SUSPENDED:
// TODO(tasak): free this component's caches as much as possible before
// suspending renderer.
break;
case base::MemoryState::UNKNOWN:
// NOT_REACHED.
break;
}
}
} // namespace cc } // namespace cc
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <memory> #include <memory>
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/trace_event/memory_dump_provider.h" #include "base/trace_event/memory_dump_provider.h"
#include "cc/base/cc_export.h" #include "cc/base/cc_export.h"
...@@ -22,7 +23,8 @@ ...@@ -22,7 +23,8 @@
namespace cc { namespace cc {
class CC_EXPORT ResourcePool : public base::trace_event::MemoryDumpProvider { class CC_EXPORT ResourcePool : public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public: public:
// Delay before a resource is considered expired. // Delay before a resource is considered expired.
static base::TimeDelta kDefaultExpirationDelay; static base::TimeDelta kDefaultExpirationDelay;
...@@ -156,6 +158,9 @@ class CC_EXPORT ResourcePool : public base::trace_event::MemoryDumpProvider { ...@@ -156,6 +158,9 @@ class CC_EXPORT ResourcePool : public base::trace_event::MemoryDumpProvider {
bool HasEvictableResources() const; bool HasEvictableResources() const;
base::TimeTicks GetUsageTimeForLRUResource() const; base::TimeTicks GetUsageTimeForLRUResource() const;
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
ResourceProvider* resource_provider_; ResourceProvider* resource_provider_;
bool use_gpu_memory_buffers_; bool use_gpu_memory_buffers_;
gfx::BufferUsage usage_; gfx::BufferUsage usage_;
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <inttypes.h> #include <inttypes.h>
#include "base/memory/discardable_memory_allocator.h" #include "base/memory/discardable_memory_allocator.h"
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/numerics/safe_math.h" #include "base/numerics/safe_math.h"
...@@ -348,6 +349,8 @@ GpuImageDecodeController::GpuImageDecodeController(ContextProvider* context, ...@@ -348,6 +349,8 @@ GpuImageDecodeController::GpuImageDecodeController(ContextProvider* context,
this, "cc::GpuImageDecodeController", this, "cc::GpuImageDecodeController",
base::ThreadTaskRunnerHandle::Get()); base::ThreadTaskRunnerHandle::Get());
} }
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
} }
GpuImageDecodeController::~GpuImageDecodeController() { GpuImageDecodeController::~GpuImageDecodeController() {
...@@ -358,6 +361,8 @@ GpuImageDecodeController::~GpuImageDecodeController() { ...@@ -358,6 +361,8 @@ GpuImageDecodeController::~GpuImageDecodeController() {
// It is safe to unregister, even if we didn't register in the constructor. // It is safe to unregister, even if we didn't register in the constructor.
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this); this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
} }
bool GpuImageDecodeController::GetTaskForImageAndRef( bool GpuImageDecodeController::GetTaskForImageAndRef(
...@@ -1174,4 +1179,23 @@ bool GpuImageDecodeController::DiscardableIsLockedForTesting( ...@@ -1174,4 +1179,23 @@ bool GpuImageDecodeController::DiscardableIsLockedForTesting(
return image_data->decode.is_locked(); return image_data->decode.is_locked();
} }
void GpuImageDecodeController::OnMemoryStateChange(base::MemoryState state) {
switch (state) {
case base::MemoryState::NORMAL:
// TODO(tasak): go back to normal state.
break;
case base::MemoryState::THROTTLED:
// TODO(tasak): make the limits of this component's caches smaller to
// save memory usage.
break;
case base::MemoryState::SUSPENDED:
// TODO(tasak): free this component's caches as much as possible before
// suspending renderer.
break;
case base::MemoryState::UNKNOWN:
// NOT_REACHED.
break;
}
}
} // namespace cc } // namespace cc
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "base/containers/mru_cache.h" #include "base/containers/mru_cache.h"
#include "base/memory/discardable_memory.h" #include "base/memory/discardable_memory.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "base/trace_event/memory_dump_provider.h" #include "base/trace_event/memory_dump_provider.h"
#include "cc/base/cc_export.h" #include "cc/base/cc_export.h"
...@@ -97,7 +98,8 @@ class ContextProvider; ...@@ -97,7 +98,8 @@ class ContextProvider;
// //
class CC_EXPORT GpuImageDecodeController class CC_EXPORT GpuImageDecodeController
: public ImageDecodeController, : public ImageDecodeController,
public base::trace_event::MemoryDumpProvider { public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public: public:
explicit GpuImageDecodeController(ContextProvider* context, explicit GpuImageDecodeController(ContextProvider* context,
ResourceFormat decode_format, ResourceFormat decode_format,
...@@ -301,6 +303,9 @@ class CC_EXPORT GpuImageDecodeController ...@@ -301,6 +303,9 @@ class CC_EXPORT GpuImageDecodeController
ImageData* image_data); ImageData* image_data);
void DeletePendingImages(); void DeletePendingImages();
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
const ResourceFormat format_; const ResourceFormat format_;
ContextProvider* context_; ContextProvider* context_;
sk_sp<GrContextThreadSafeProxy> context_threadsafe_proxy_; sk_sp<GrContextThreadSafeProxy> context_threadsafe_proxy_;
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/format_macros.h" #include "base/format_macros.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/discardable_memory.h" #include "base/memory/discardable_memory.h"
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
...@@ -180,6 +181,8 @@ SoftwareImageDecodeController::SoftwareImageDecodeController( ...@@ -180,6 +181,8 @@ SoftwareImageDecodeController::SoftwareImageDecodeController(
this, "cc::SoftwareImageDecodeController", this, "cc::SoftwareImageDecodeController",
base::ThreadTaskRunnerHandle::Get()); base::ThreadTaskRunnerHandle::Get());
} }
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
} }
SoftwareImageDecodeController::~SoftwareImageDecodeController() { SoftwareImageDecodeController::~SoftwareImageDecodeController() {
...@@ -189,6 +192,8 @@ SoftwareImageDecodeController::~SoftwareImageDecodeController() { ...@@ -189,6 +192,8 @@ SoftwareImageDecodeController::~SoftwareImageDecodeController() {
// It is safe to unregister, even if we didn't register in the constructor. // It is safe to unregister, even if we didn't register in the constructor.
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this); this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
} }
bool SoftwareImageDecodeController::GetTaskForImageAndRef( bool SoftwareImageDecodeController::GetTaskForImageAndRef(
...@@ -1078,4 +1083,24 @@ size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe() ...@@ -1078,4 +1083,24 @@ size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe()
return current_usage_bytes_.ValueOrDie(); return current_usage_bytes_.ValueOrDie();
} }
void SoftwareImageDecodeController::OnMemoryStateChange(
base::MemoryState state) {
switch (state) {
case base::MemoryState::NORMAL:
// TODO(tasak): go back to normal state.
break;
case base::MemoryState::THROTTLED:
// TODO(tasak): make the limits of this component's caches smaller to
// save memory usage.
break;
case base::MemoryState::SUSPENDED:
// TODO(tasak): free this component's caches as much as possible before
// suspending renderer.
break;
case base::MemoryState::UNKNOWN:
// NOT_REACHED.
break;
}
}
} // namespace cc } // namespace cc
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "base/containers/mru_cache.h" #include "base/containers/mru_cache.h"
#include "base/hash.h" #include "base/hash.h"
#include "base/memory/discardable_memory_allocator.h" #include "base/memory/discardable_memory_allocator.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/numerics/safe_math.h" #include "base/numerics/safe_math.h"
#include "base/threading/thread_checker.h" #include "base/threading/thread_checker.h"
...@@ -102,7 +103,8 @@ struct ImageDecodeControllerKeyHash { ...@@ -102,7 +103,8 @@ struct ImageDecodeControllerKeyHash {
class CC_EXPORT SoftwareImageDecodeController class CC_EXPORT SoftwareImageDecodeController
: public ImageDecodeController, : public ImageDecodeController,
public base::trace_event::MemoryDumpProvider { public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public: public:
using ImageKey = ImageDecodeControllerKey; using ImageKey = ImageDecodeControllerKey;
using ImageKeyHash = ImageDecodeControllerKeyHash; using ImageKeyHash = ImageDecodeControllerKeyHash;
...@@ -264,6 +266,9 @@ class CC_EXPORT SoftwareImageDecodeController ...@@ -264,6 +266,9 @@ class CC_EXPORT SoftwareImageDecodeController
const char* cache_name, const char* cache_name,
base::trace_event::ProcessMemoryDump* pmd) const; base::trace_event::ProcessMemoryDump* pmd) const;
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
std::unordered_map<ImageKey, scoped_refptr<TileTask>, ImageKeyHash> std::unordered_map<ImageKey, scoped_refptr<TileTask>, ImageKeyHash>
pending_image_tasks_; pending_image_tasks_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment