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 @@
#include <memory>
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/memory/ptr_util.h"
#include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h"
......@@ -141,11 +142,16 @@ StagingBufferPool::StagingBufferPool(base::SequencedTaskRunner* task_runner,
this, "cc::StagingBufferPool", base::ThreadTaskRunnerHandle::Get());
reduce_memory_usage_callback_ = base::Bind(
&StagingBufferPool::ReduceMemoryUsage, weak_ptr_factory_.GetWeakPtr());
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
}
StagingBufferPool::~StagingBufferPool() {
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
}
void StagingBufferPool::Shutdown() {
......@@ -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
......@@ -12,6 +12,7 @@
#include <set>
#include "base/macros.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/memory/weak_ptr.h"
#include "base/synchronization/lock.h"
#include "base/time/time.h"
......@@ -50,7 +51,8 @@ struct StagingBuffer {
};
class CC_EXPORT StagingBufferPool
: public base::trace_event::MemoryDumpProvider {
: public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public:
~StagingBufferPool() final;
......@@ -87,6 +89,9 @@ class CC_EXPORT StagingBufferPool
void StagingStateAsValueInto(
base::trace_event::TracedValue* staging_state) const;
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
ContextProvider* const worker_context_provider_;
ResourceProvider* const resource_provider_;
......
......@@ -11,6 +11,7 @@
#include <utility>
#include "base/format_macros.h"
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/strings/stringprintf.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/memory_dump_manager.h"
......@@ -71,11 +72,16 @@ ResourcePool::ResourcePool(ResourceProvider* resource_provider,
weak_ptr_factory_(this) {
base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider(
this, "cc::ResourcePool", task_runner_.get());
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
}
ResourcePool::~ResourcePool() {
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
DCHECK_EQ(0u, in_use_resources_.size());
......@@ -453,4 +459,23 @@ bool ResourcePool::OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
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
......@@ -13,6 +13,7 @@
#include <memory>
#include "base/macros.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/memory/ptr_util.h"
#include "base/trace_event/memory_dump_provider.h"
#include "cc/base/cc_export.h"
......@@ -22,7 +23,8 @@
namespace cc {
class CC_EXPORT ResourcePool : public base::trace_event::MemoryDumpProvider {
class CC_EXPORT ResourcePool : public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public:
// Delay before a resource is considered expired.
static base::TimeDelta kDefaultExpirationDelay;
......@@ -156,6 +158,9 @@ class CC_EXPORT ResourcePool : public base::trace_event::MemoryDumpProvider {
bool HasEvictableResources() const;
base::TimeTicks GetUsageTimeForLRUResource() const;
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
ResourceProvider* resource_provider_;
bool use_gpu_memory_buffers_;
gfx::BufferUsage usage_;
......
......@@ -7,6 +7,7 @@
#include <inttypes.h>
#include "base/memory/discardable_memory_allocator.h"
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/numerics/safe_math.h"
......@@ -348,6 +349,8 @@ GpuImageDecodeController::GpuImageDecodeController(ContextProvider* context,
this, "cc::GpuImageDecodeController",
base::ThreadTaskRunnerHandle::Get());
}
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
}
GpuImageDecodeController::~GpuImageDecodeController() {
......@@ -358,6 +361,8 @@ GpuImageDecodeController::~GpuImageDecodeController() {
// It is safe to unregister, even if we didn't register in the constructor.
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
}
bool GpuImageDecodeController::GetTaskForImageAndRef(
......@@ -1174,4 +1179,23 @@ bool GpuImageDecodeController::DiscardableIsLockedForTesting(
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
......@@ -11,6 +11,7 @@
#include "base/containers/mru_cache.h"
#include "base/memory/discardable_memory.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/synchronization/lock.h"
#include "base/trace_event/memory_dump_provider.h"
#include "cc/base/cc_export.h"
......@@ -97,7 +98,8 @@ class ContextProvider;
//
class CC_EXPORT GpuImageDecodeController
: public ImageDecodeController,
public base::trace_event::MemoryDumpProvider {
public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public:
explicit GpuImageDecodeController(ContextProvider* context,
ResourceFormat decode_format,
......@@ -301,6 +303,9 @@ class CC_EXPORT GpuImageDecodeController
ImageData* image_data);
void DeletePendingImages();
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
const ResourceFormat format_;
ContextProvider* context_;
sk_sp<GrContextThreadSafeProxy> context_threadsafe_proxy_;
......
......@@ -13,6 +13,7 @@
#include "base/format_macros.h"
#include "base/macros.h"
#include "base/memory/discardable_memory.h"
#include "base/memory/memory_coordinator_client_registry.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/stringprintf.h"
......@@ -180,6 +181,8 @@ SoftwareImageDecodeController::SoftwareImageDecodeController(
this, "cc::SoftwareImageDecodeController",
base::ThreadTaskRunnerHandle::Get());
}
// Register this component with base::MemoryCoordinatorClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this);
}
SoftwareImageDecodeController::~SoftwareImageDecodeController() {
......@@ -189,6 +192,8 @@ SoftwareImageDecodeController::~SoftwareImageDecodeController() {
// It is safe to unregister, even if we didn't register in the constructor.
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this);
// Unregister this component with memory_coordinator::ClientRegistry.
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(this);
}
bool SoftwareImageDecodeController::GetTaskForImageAndRef(
......@@ -1078,4 +1083,24 @@ size_t SoftwareImageDecodeController::MemoryBudget::GetCurrentUsageSafe()
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
......@@ -15,6 +15,7 @@
#include "base/containers/mru_cache.h"
#include "base/hash.h"
#include "base/memory/discardable_memory_allocator.h"
#include "base/memory/memory_coordinator_client.h"
#include "base/memory/ref_counted.h"
#include "base/numerics/safe_math.h"
#include "base/threading/thread_checker.h"
......@@ -102,7 +103,8 @@ struct ImageDecodeControllerKeyHash {
class CC_EXPORT SoftwareImageDecodeController
: public ImageDecodeController,
public base::trace_event::MemoryDumpProvider {
public base::trace_event::MemoryDumpProvider,
public base::MemoryCoordinatorClient {
public:
using ImageKey = ImageDecodeControllerKey;
using ImageKeyHash = ImageDecodeControllerKeyHash;
......@@ -264,6 +266,9 @@ class CC_EXPORT SoftwareImageDecodeController
const char* cache_name,
base::trace_event::ProcessMemoryDump* pmd) const;
// Overriden from base::MemoryCoordinatorClient.
void OnMemoryStateChange(base::MemoryState state) override;
std::unordered_map<ImageKey, scoped_refptr<TileTask>, ImageKeyHash>
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