[Merge-104][Dr-Dc] Enable MemoryPressureListener for DrDc thread.
Enable MemoryPressureListener for drdc thread which should help in
better cache/memory cleanup and hence less OOM related issues.
(cherry picked from commit 4a8538c26432f272f64f9c2ca43223b1c6fb67f2)
Bug: 1343036
Change-Id: I70dadd126695f034d60c137e5bd566c6274c70f8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3749148
Commit-Queue: vikas soni <vikassoni@chromium.org>
Auto-Submit: vikas soni <vikassoni@chromium.org>
Reviewed-by: Sunny Sachanandani <sunnyps@chromium.org>
Commit-Queue: Sunny Sachanandani <sunnyps@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1022339}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3756578
Commit-Queue: Krishna Govind <govind@chromium.org>
Owners-Override: Krishna Govind <govind@chromium.org>
Reviewed-by: Krishna Govind <govind@chromium.org>
Cr-Commit-Position: refs/branch-heads/5112@{#791}
Cr-Branched-From: b13d3fe7b3c47a56354ef54b221008afa754412e-refs/heads/main@{#1012729}
diff --git a/components/viz/service/display_embedder/compositor_gpu_thread.cc b/components/viz/service/display_embedder/compositor_gpu_thread.cc
index 06e2cb2..02db4e3c 100644
--- a/components/viz/service/display_embedder/compositor_gpu_thread.cc
+++ b/components/viz/service/display_embedder/compositor_gpu_thread.cc
@@ -191,6 +191,17 @@
return init_succeded_;
}
+void CompositorGpuThread::HandleMemoryPressure(
+ base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
+ DCHECK(task_runner()->BelongsToCurrentThread());
+
+ // Context should be current for cache/memory cleanup.
+ if (shared_context_state_ &&
+ shared_context_state_->MakeCurrent(nullptr, /*needs_gl=*/true)) {
+ shared_context_state_->PurgeMemory(memory_pressure_level);
+ }
+}
+
void CompositorGpuThread::Init() {
const auto& gpu_preferences = gpu_channel_manager_->gpu_preferences();
if (enable_watchdog_) {
@@ -201,10 +212,20 @@
if (!watchdog_thread_)
return;
watchdog_thread_->OnInitComplete();
+
+ // Making sure to create the |memory_pressure_listener_| on
+ // CompositorGpuThread since this callback will be called on the thread it was
+ // created on.
+ memory_pressure_listener_ = std::make_unique<base::MemoryPressureListener>(
+ FROM_HERE, base::BindRepeating(&CompositorGpuThread::HandleMemoryPressure,
+ base::Unretained(this))),
init_succeded_ = true;
}
void CompositorGpuThread::CleanUp() {
+ // Destroying |memory_pressure_listener_| here to ensure its destroyed on the
+ // same thread on which it was created on.
+ memory_pressure_listener_.reset();
if (watchdog_thread_)
watchdog_thread_->OnGpuProcessTearDown();
diff --git a/components/viz/service/display_embedder/compositor_gpu_thread.h b/components/viz/service/display_embedder/compositor_gpu_thread.h
index 7ca40835..f23c4e0 100644
--- a/components/viz/service/display_embedder/compositor_gpu_thread.h
+++ b/components/viz/service/display_embedder/compositor_gpu_thread.h
@@ -7,6 +7,7 @@
#include <memory>
+#include "base/memory/memory_pressure_listener.h"
#include "base/memory/raw_ptr.h"
#include "base/threading/thread.h"
#include "components/viz/service/viz_service_export.h"
@@ -67,6 +68,9 @@
bool Initialize();
+ void HandleMemoryPressure(
+ base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level);
+
raw_ptr<gpu::GpuChannelManager> gpu_channel_manager_;
const bool enable_watchdog_;
bool init_succeded_ = false;
@@ -80,6 +84,14 @@
std::unique_ptr<gpu::GpuWatchdogThread> watchdog_thread_;
scoped_refptr<gpu::SharedContextState> shared_context_state_;
+ // To start listening memory pressure signals from the platform, we create a
+ // new instance of MemoryPressureListener, passing a callback to a
+ // function that takes a MemoryPressureLevel parameter.To stop listening,
+ // simply delete the listener object. The implementation guarantees
+ // that the callback will always be called on the thread that created
+ // the listener.
+ std::unique_ptr<base::MemoryPressureListener> memory_pressure_listener_;
+
base::WeakPtrFactory<CompositorGpuThread> weak_ptr_factory_;
};