[go: up one dir, main page]

[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_;
 };