[go: nahoru, domu]

Allow cc to cancel GPU create calls on a worker thread at shutdown.

Once GPU code in the browser moves to the UI thread,
cc::TileTaskManagerImpl::Shutdown would run on the main thread and
cancel pending tasks and wait for in-progress ones to finish. The
latter may be waiting on tasks to the main thread to call
HostGpuMemoryBufferManager::AllocateGpuMemoryBuffer which would
deadlock. My previous fix in r873954 was complicated and ended up
needing more complexity (e.g. https://crrev.com/c/2844359) since parts
of the GPU code would need to run on the IO thread, sometimes
synchronously.

This fix will allow a future revert of the parts of the previous cl
that moved HostGpuMemoryBufferManager to the IO thread and is overall
simpler.

Bug: 904556
Change-Id: Ia795d540d8a1cd02114a885380262dbfd0eedef9
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2845201
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: kylechar <kylechar@chromium.org>
Reviewed-by: Dale Curtis <dalecurtis@chromium.org>
Reviewed-by: Kenneth Russell <kbr@chromium.org>
Reviewed-by: Ted Choc <tedchoc@chromium.org>
Reviewed-by: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#877581}
diff --git a/cc/raster/zero_copy_raster_buffer_provider.cc b/cc/raster/zero_copy_raster_buffer_provider.cc
index cca625539..2184021 100644
--- a/cc/raster/zero_copy_raster_buffer_provider.cc
+++ b/cc/raster/zero_copy_raster_buffer_provider.cc
@@ -67,10 +67,12 @@
  public:
   ZeroCopyRasterBufferImpl(
       gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager,
+      base::WaitableEvent* shutdown_event,
       const ResourcePool::InUsePoolResource& in_use_resource,
       ZeroCopyGpuBacking* backing)
       : backing_(backing),
         gpu_memory_buffer_manager_(gpu_memory_buffer_manager),
+        shutdown_event_(shutdown_event),
         resource_size_(in_use_resource.size()),
         resource_format_(in_use_resource.format()),
         resource_color_space_(in_use_resource.color_space()),
@@ -124,7 +126,7 @@
     if (!gpu_memory_buffer_) {
       gpu_memory_buffer_ = gpu_memory_buffer_manager_->CreateGpuMemoryBuffer(
           resource_size_, viz::BufferFormat(resource_format_), kBufferUsage,
-          gpu::kNullSurfaceHandle);
+          gpu::kNullSurfaceHandle, shutdown_event_);
       // Note that GpuMemoryBuffer allocation can fail.
       // https://crbug.com/554541
       if (!gpu_memory_buffer_)
@@ -156,6 +158,7 @@
 
   // These fields are for use on the worker thread.
   gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
+  base::WaitableEvent* shutdown_event_;
   gfx::Size resource_size_;
   viz::ResourceFormat resource_format_;
   gfx::ColorSpace resource_color_space_;
@@ -201,8 +204,8 @@
   ZeroCopyGpuBacking* backing =
       static_cast<ZeroCopyGpuBacking*>(resource.gpu_backing());
 
-  return std::make_unique<ZeroCopyRasterBufferImpl>(gpu_memory_buffer_manager_,
-                                                    resource, backing);
+  return std::make_unique<ZeroCopyRasterBufferImpl>(
+      gpu_memory_buffer_manager_, shutdown_event_, resource, backing);
 }
 
 void ZeroCopyRasterBufferProvider::Flush() {}
@@ -234,6 +237,11 @@
   return 0;
 }
 
+void ZeroCopyRasterBufferProvider::SetShutdownEvent(
+    base::WaitableEvent* shutdown_event) {
+  shutdown_event_ = shutdown_event;
+}
+
 void ZeroCopyRasterBufferProvider::Shutdown() {}
 
 }  // namespace cc