[go: nahoru, domu]

Move raster query queue to its own class

Previously, the raster query queue was part of the
GpuRasterBufferProvider. Soon, we plan to access that queue from
multiple locations. Not all of them are tied to the
GpuRasterBufferProvider.

This CL moves the raster query queue to its own class so it can be
cleanly accessed from other locations.

Change-Id: I8a37258d201bcf2c4caec71ea5bd3a80cd769989
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2354237
Commit-Queue: Khushal <khushalsagar@chromium.org>
Reviewed-by: Khushal <khushalsagar@chromium.org>
Auto-Submit: Chris Blume <cblume@chromium.org>
Cr-Commit-Position: refs/heads/master@{#829511}
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index 76ecd0d..5dfca52 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -372,6 +372,7 @@
     const gfx::Size& max_tile_size,
     bool unpremultiply_and_dither_low_bit_depth_tiles,
     bool enable_oop_rasterization,
+    RasterQueryQueue* const pending_raster_queries,
     float raster_metric_probability)
     : compositor_context_provider_(compositor_context_provider),
       worker_context_provider_(worker_context_provider),
@@ -381,8 +382,10 @@
       unpremultiply_and_dither_low_bit_depth_tiles_(
           unpremultiply_and_dither_low_bit_depth_tiles),
       enable_oop_rasterization_(enable_oop_rasterization),
+      pending_raster_queries_(pending_raster_queries),
       random_generator_(static_cast<uint32_t>(base::RandUint64())),
       bernoulli_distribution_(raster_metric_probability) {
+  DCHECK(pending_raster_queries);
   DCHECK(compositor_context_provider);
   DCHECK(worker_context_provider);
 }
@@ -494,7 +497,7 @@
     bool depends_on_at_raster_decodes,
     bool depends_on_hardware_accelerated_jpeg_candidates,
     bool depends_on_hardware_accelerated_webp_candidates) {
-  PendingRasterQuery query;
+  RasterQuery query;
   query.depends_on_hardware_accelerated_jpeg_candidates =
       depends_on_hardware_accelerated_jpeg_candidates;
   query.depends_on_hardware_accelerated_webp_candidates =
@@ -511,13 +514,12 @@
       query.raster_buffer_creation_time = raster_buffer_creation_time;
 
     // Note that it is important to scope the raster context lock to
-    // PlaybackOnWorkerThreadInternal and release it before acquiring this lock
-    // to avoid a deadlock in CheckRasterFinishedQueries which acquires the
-    // raster context lock while holding this lock.
-    base::AutoLock hold(pending_raster_queries_lock_);
-    pending_raster_queries_.push_back(query);
+    // PlaybackOnWorkerThreadInternal and release it before calling this
+    // function to avoid a deadlock in
+    // RasterQueryQueue::CheckRasterFinishedQueries which acquires the raster
+    // context lock while holding a lock used in the function.
+    pending_raster_queries_->Append(std::move(query));
   }
-  DCHECK(!query.raster_start_query_id || query.raster_duration_query_id);
 
   return raster_finished_token;
 }
@@ -539,7 +541,7 @@
     const RasterSource::PlaybackSettings& playback_settings,
     const GURL& url,
     bool depends_on_at_raster_decodes,
-    PendingRasterQuery* query) {
+    RasterQuery* query) {
   viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
       worker_context_provider_, url.possibly_invalid_spec().c_str());
   gpu::raster::RasterInterface* ri = scoped_context.RasterInterface();
@@ -620,113 +622,4 @@
   }
 }
 
-#define UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(name, total_time) \
-  UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(                              \
-      name, total_time, base::TimeDelta::FromMicroseconds(1),           \
-      base::TimeDelta::FromMilliseconds(100), 100);
-
-bool GpuRasterBufferProvider::CheckRasterFinishedQueries() {
-  base::AutoLock hold(pending_raster_queries_lock_);
-  if (pending_raster_queries_.empty())
-    return false;
-
-  viz::RasterContextProvider::ScopedRasterContextLock scoped_context(
-      worker_context_provider_);
-  auto* ri = scoped_context.RasterInterface();
-
-  auto it = pending_raster_queries_.begin();
-  while (it != pending_raster_queries_.end()) {
-    GLuint complete = 0;
-    ri->GetQueryObjectuivEXT(it->raster_duration_query_id,
-                             GL_QUERY_RESULT_AVAILABLE_NO_FLUSH_CHROMIUM_EXT,
-                             &complete);
-    if (!complete)
-      break;
-
-#if DCHECK_IS_ON()
-    if (it->raster_start_query_id) {
-      // We issued the GL_COMMANDS_ISSUED_TIMESTAMP_CHROMIUM query prior to the
-      // GL_COMMANDS_ISSUED_CHROMIUM query. Therefore, if the result of the
-      // latter is available, the result of the former should be too.
-      complete = 0;
-      ri->GetQueryObjectuivEXT(it->raster_start_query_id,
-                               GL_QUERY_RESULT_AVAILABLE_NO_FLUSH_CHROMIUM_EXT,
-                               &complete);
-      DCHECK(complete);
-    }
-#endif
-
-    GLuint gpu_raster_duration = 0u;
-    ri->GetQueryObjectuivEXT(it->raster_duration_query_id, GL_QUERY_RESULT_EXT,
-                             &gpu_raster_duration);
-    ri->DeleteQueriesEXT(1, &it->raster_duration_query_id);
-
-    base::TimeDelta raster_duration =
-        it->worker_raster_duration +
-        base::TimeDelta::FromMicroseconds(gpu_raster_duration);
-
-    // It is safe to use the UMA macros here with runtime generated strings
-    // because the client name should be initialized once in the process, before
-    // recording any metrics here.
-    const char* client_name = GetClientNameForMetrics();
-
-    if (it->raster_start_query_id) {
-      GLuint64 gpu_raster_start_time = 0u;
-      ri->GetQueryObjectui64vEXT(it->raster_start_query_id, GL_QUERY_RESULT_EXT,
-                                 &gpu_raster_start_time);
-      ri->DeleteQueriesEXT(1, &it->raster_start_query_id);
-
-      // The base::checked_cast<int64_t> should not crash as long as the GPU
-      // process was not compromised: that's because the result of the query
-      // should have been generated using base::TimeDelta::InMicroseconds()
-      // there, so the result should fit in an int64_t.
-      base::TimeDelta raster_scheduling_delay =
-          base::TimeDelta::FromMicroseconds(
-              base::checked_cast<int64_t>(gpu_raster_start_time)) -
-          it->raster_buffer_creation_time.since_origin();
-
-      // We expect the clock we're using to be monotonic, so we shouldn't get a
-      // negative scheduling delay.
-      DCHECK_GE(raster_scheduling_delay.InMicroseconds(), 0u);
-      UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
-          base::StringPrintf(
-              "Renderer4.%s.RasterTaskSchedulingDelayNoAtRasterDecodes.All",
-              client_name),
-          raster_scheduling_delay);
-      if (it->depends_on_hardware_accelerated_jpeg_candidates) {
-        UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
-            base::StringPrintf(
-                "Renderer4.%s.RasterTaskSchedulingDelayNoAtRasterDecodes."
-                "TilesWithJpegHwDecodeCandidates",
-                client_name),
-            raster_scheduling_delay);
-      }
-      if (it->depends_on_hardware_accelerated_webp_candidates) {
-        UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
-            base::StringPrintf(
-                "Renderer4.%s.RasterTaskSchedulingDelayNoAtRasterDecodes."
-                "TilesWithWebPHwDecodeCandidates",
-                client_name),
-            raster_scheduling_delay);
-      }
-    }
-
-    if (enable_oop_rasterization_) {
-      UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
-          base::StringPrintf("Renderer4.%s.RasterTaskTotalDuration.Oop",
-                             client_name),
-          raster_duration);
-    } else {
-      UMA_HISTOGRAM_RASTER_TIME_CUSTOM_MICROSECONDS(
-          base::StringPrintf("Renderer4.%s.RasterTaskTotalDuration.Gpu",
-                             client_name),
-          raster_duration);
-    }
-
-    it = pending_raster_queries_.erase(it);
-  }
-
-  return pending_raster_queries_.size() > 0u;
-}
-
 }  // namespace cc