[go: nahoru, domu]

Put unpremultiply/dither low bit depth tiles behind runtime flag

After discussion with mariakhomenko@, we decided to leave this feature
enabled despite some expected regressions. This change will allow us
to disable this feature via Finch if any unexpected results appear
as this rolls to stable.

Bug: 825589
Cq-Include-Trybots: luci.chromium.try:android_optional_gpu_tests_rel;master.tryserver.blink:linux_trusty_blink_rel
Change-Id: I46506aa8807e1c10f0833e414253d1df11cf1382
Reviewed-on: https://chromium-review.googlesource.com/1014285
Reviewed-by: enne <enne@chromium.org>
Commit-Queue: Eric Karl <ericrk@chromium.org>
Cr-Commit-Position: refs/heads/master@{#551095}
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc
index 5a4c95c5..9803cfa 100644
--- a/cc/raster/gpu_raster_buffer_provider.cc
+++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -247,15 +247,6 @@
   ri->DeleteTextures(1, &texture_id);
 }
 
-bool ShouldUnpremultiplyAndDitherResource(viz::ResourceFormat format) {
-  switch (format) {
-    case viz::RGBA_4444:
-      return true;
-    default:
-      return false;
-  }
-}
-
 }  // namespace
 
 // Subclass for InUsePoolResource that holds ownership of a gpu-rastered backing
@@ -351,6 +342,7 @@
     int gpu_rasterization_msaa_sample_count,
     viz::ResourceFormat preferred_tile_format,
     const gfx::Size& max_tile_size,
+    bool unpremultiply_and_dither_low_bit_depth_tiles,
     bool enable_oop_rasterization)
     : compositor_context_provider_(compositor_context_provider),
       worker_context_provider_(worker_context_provider),
@@ -359,6 +351,8 @@
       msaa_sample_count_(gpu_rasterization_msaa_sample_count),
       preferred_tile_format_(preferred_tile_format),
       max_tile_size_(max_tile_size),
+      unpremultiply_and_dither_low_bit_depth_tiles_(
+          unpremultiply_and_dither_low_bit_depth_tiles),
       enable_oop_rasterization_(enable_oop_rasterization) {
   DCHECK(compositor_context_provider);
   DCHECK(worker_context_provider);
@@ -552,4 +546,14 @@
   return LayerTreeResourceProvider::GenerateSyncTokenHelper(ri);
 }
 
+bool GpuRasterBufferProvider::ShouldUnpremultiplyAndDitherResource(
+    viz::ResourceFormat format) const {
+  switch (format) {
+    case viz::RGBA_4444:
+      return unpremultiply_and_dither_low_bit_depth_tiles_;
+    default:
+      return false;
+  }
+}
+
 }  // namespace cc
diff --git a/cc/raster/gpu_raster_buffer_provider.h b/cc/raster/gpu_raster_buffer_provider.h
index 790ed870..56fc5ea 100644
--- a/cc/raster/gpu_raster_buffer_provider.h
+++ b/cc/raster/gpu_raster_buffer_provider.h
@@ -28,6 +28,7 @@
                           int gpu_rasterization_msaa_sample_count,
                           viz::ResourceFormat preferred_tile_format,
                           const gfx::Size& max_tile_size,
+                          bool unpremultiply_and_dither_low_bit_depth_tiles,
                           bool enable_oop_rasterization);
   ~GpuRasterBufferProvider() override;
 
@@ -110,6 +111,8 @@
     DISALLOW_COPY_AND_ASSIGN(RasterBufferImpl);
   };
 
+  bool ShouldUnpremultiplyAndDitherResource(viz::ResourceFormat format) const;
+
   viz::ContextProvider* const compositor_context_provider_;
   viz::RasterContextProvider* const worker_context_provider_;
   LayerTreeResourceProvider* const resource_provider_;
@@ -117,6 +120,7 @@
   const int msaa_sample_count_;
   const viz::ResourceFormat preferred_tile_format_;
   const gfx::Size max_tile_size_;
+  const bool unpremultiply_and_dither_low_bit_depth_tiles_;
   const bool enable_oop_rasterization_;
 
   DISALLOW_COPY_AND_ASSIGN(GpuRasterBufferProvider);
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc
index 25f5bc65..4d96efe 100644
--- a/cc/raster/raster_buffer_provider_perftest.cc
+++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -376,7 +376,7 @@
         raster_buffer_provider_ = std::make_unique<GpuRasterBufferProvider>(
             compositor_context_provider_.get(), worker_context_provider_.get(),
             resource_provider_.get(), false, 0,
-            viz::PlatformColor::BestTextureFormat(), gfx::Size(), false);
+            viz::PlatformColor::BestTextureFormat(), gfx::Size(), true, false);
         resource_pool_ = std::make_unique<ResourcePool>(
             resource_provider_.get(), task_runner_,
             ResourcePool::kDefaultExpirationDelay, ResourcePool::Mode::kGpu,
diff --git a/cc/raster/raster_buffer_provider_unittest.cc b/cc/raster/raster_buffer_provider_unittest.cc
index fbb8b17..d5a911e 100644
--- a/cc/raster/raster_buffer_provider_unittest.cc
+++ b/cc/raster/raster_buffer_provider_unittest.cc
@@ -181,7 +181,7 @@
         raster_buffer_provider_ = std::make_unique<GpuRasterBufferProvider>(
             context_provider_.get(), worker_context_provider_.get(),
             resource_provider_.get(), false, 0,
-            viz::PlatformColor::BestTextureFormat(), gfx::Size(), false);
+            viz::PlatformColor::BestTextureFormat(), gfx::Size(), true, false);
         pool_ = std::make_unique<ResourcePool>(
             resource_provider_.get(), base::ThreadTaskRunnerHandle::Get(),
             base::TimeDelta(), ResourcePool::Mode::kGpu, true);
diff --git a/cc/test/layer_tree_pixel_resource_test.cc b/cc/test/layer_tree_pixel_resource_test.cc
index ca4067b..4de002a2 100644
--- a/cc/test/layer_tree_pixel_resource_test.cc
+++ b/cc/test/layer_tree_pixel_resource_test.cc
@@ -70,7 +70,7 @@
       return std::make_unique<GpuRasterBufferProvider>(
           compositor_context_provider, worker_context_provider,
           resource_provider, false, 0, viz::PlatformColor::BestTextureFormat(),
-          gfx::Size(), false);
+          gfx::Size(), true, false);
     case ZERO_COPY:
       EXPECT_TRUE(compositor_context_provider);
       EXPECT_TRUE(gpu_memory_buffer_manager);
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 02721b9..39e00a00 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -2654,7 +2654,9 @@
         resource_provider_.get(),
         settings_.resource_settings.use_gpu_memory_buffer_resources,
         msaa_sample_count, settings_.preferred_tile_format,
-        settings_.max_gpu_raster_tile_size, use_oop_rasterization_);
+        settings_.max_gpu_raster_tile_size,
+        settings_.unpremultiply_and_dither_low_bit_depth_tiles,
+        use_oop_rasterization_);
   }
 
   bool use_zero_copy = settings_.use_zero_copy;
diff --git a/cc/trees/layer_tree_host_pixeltest_tiles.cc b/cc/trees/layer_tree_host_pixeltest_tiles.cc
index b2c81a9..bf42914 100644
--- a/cc/trees/layer_tree_host_pixeltest_tiles.cc
+++ b/cc/trees/layer_tree_host_pixeltest_tiles.cc
@@ -61,11 +61,13 @@
         settings->gpu_rasterization_forced = true;
         settings->use_partial_raster = true;
         settings->preferred_tile_format = viz::RGBA_4444;
+        settings->unpremultiply_and_dither_low_bit_depth_tiles = true;
         break;
       case FULL_GPU_LOW_BIT_DEPTH:
         settings->gpu_rasterization_forced = true;
         settings->use_partial_raster = false;
         settings->preferred_tile_format = viz::RGBA_4444;
+        settings->unpremultiply_and_dither_low_bit_depth_tiles = true;
         break;
     }
   }
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h
index f85f1dd..2584543 100644
--- a/cc/trees/layer_tree_settings.h
+++ b/cc/trees/layer_tree_settings.h
@@ -94,6 +94,7 @@
   size_t decoded_image_working_set_budget_bytes = 128 * 1024 * 1024;
   int max_preraster_distance_in_screen_pixels = 1000;
   viz::ResourceFormat preferred_tile_format;
+  bool unpremultiply_and_dither_low_bit_depth_tiles = false;
 
   bool enable_mask_tiling = true;
 
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index 71fdaa6..9d0ebcb 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -100,6 +100,9 @@
 namespace content {
 namespace {
 
+const base::Feature kUnpremultiplyAndDitherLowBitDepthTiles = {
+    "UnpremultiplyAndDitherLowBitDepthTiles", base::FEATURE_ENABLED_BY_DEFAULT};
+
 using ReportTimeCallback =
     base::Callback<void(WebLayerTreeView::SwapResult, double)>;
 
@@ -548,11 +551,17 @@
         base::SysInfo::AmountOfPhysicalMemoryMB() <= 512 &&
         !using_synchronous_compositor) {
       settings.preferred_tile_format = viz::RGBA_4444;
-      // We need to allocate an additional RGBA_8888 intermediate for each tile
+
+      // If we are going to unpremultiply and dither these tiles, we need to
+      // allocate an additional RGBA_8888 intermediate for each tile
       // rasterization when rastering to RGBA_4444 to allow for dithering.
       // Setting a reasonable sized max tile size allows this intermediate to
       // be consistently reused.
-      settings.max_gpu_raster_tile_size = gfx::Size(512, 256);
+      if (base::FeatureList::IsEnabled(
+              kUnpremultiplyAndDitherLowBitDepthTiles)) {
+        settings.max_gpu_raster_tile_size = gfx::Size(512, 256);
+        settings.unpremultiply_and_dither_low_bit_depth_tiles = true;
+      }
     }
   }