Reverse logic for willReadFrequently flag
With the New Canvas2D API (crbug.com/1201359) there is one instance
where we are changing existent behavior. Previously, an accelerated
canvas would be turned into a software canvas upon any readback. Now
developers have explicit control with the willReadFrequently creation
attribute:
https://github.com/fserb/canvas2D/blob/master/spec/will-read-frequently.md
Now accelerated canvases will remain accelerated on readback. This
will result in performance regressions for websites that were relying on
the old behavior until they add {willReadFrequently: true} to their
context creation.
This flag allows us to roll out the feature slowly and measure
performance regressions with a finch experiment. It needs to be part of
content/public/common/content_switch_dependent_feature_overrides.cc
because a couple of tests expect canvas readback to not de-accelerate
canvases.
Bug: 1288118
Change-Id: I2d051f30b0df617e60df756626ad66e1255f4ec3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3402979
Reviewed-by: Justin Novosad <junov@chromium.org>
Reviewed-by: Avi Drissman <avi@chromium.org>
Reviewed-by: Aaron Krajeski <aaronhk@chromium.org>
Commit-Queue: Aaron Krajeski <aaronhk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#961951}
diff --git a/content/public/common/content_switch_dependent_feature_overrides.cc b/content/public/common/content_switch_dependent_feature_overrides.cc
index 2036d25..307e11d 100644
--- a/content/public/common/content_switch_dependent_feature_overrides.cc
+++ b/content/public/common/content_switch_dependent_feature_overrides.cc
@@ -104,6 +104,9 @@
{switches::kEnableExperimentalWebPlatformFeatures,
std::cref(blink::features::kClipboardCustomFormats),
base::FeatureList::OVERRIDE_ENABLE_FEATURE},
+ {switches::kEnableExperimentalWebPlatformFeatures,
+ std::cref(blink::features::kCanvas2dStaysGPUOnReadback),
+ base::FeatureList::OVERRIDE_ENABLE_FEATURE},
// Overrides for --enable-experimental-cookie-features.
{switches::kEnableExperimentalCookieFeatures,
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 20327731..7f73a6c 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1805,6 +1805,28 @@
]
}
],
+ "Canvas2DStaysGPUOnReadback": [
+ {
+ "platforms": [
+ "android",
+ "android_weblayer",
+ "android_webview",
+ "chromeos",
+ "chromeos_lacros",
+ "linux",
+ "mac",
+ "windows"
+ ],
+ "experiments": [
+ {
+ "name": "Enabled",
+ "enable_features": [
+ "Canvas2DStaysGPUOnReadback"
+ ]
+ }
+ ]
+ }
+ ],
"CanvasOutOfProcessRasterization": [
{
"platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 1f080bf..403ba32 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -629,10 +629,10 @@
const base::Feature kWebviewAccelerateSmallCanvases{
"WebviewAccelerateSmallCanvases", base::FEATURE_DISABLED_BY_DEFAULT};
-// Use old behavior for accelerated canvases: de-accelerate after first call to
-// ctx.getImageData (crbug.com/1288118)
-const base::Feature kSoftwareCanvas2DOnReadback{
- "SoftwareCanvas2DOnReadback", base::FEATURE_DISABLED_BY_DEFAULT};
+// Let accelerated canvases remain accelerated after readback
+// (crbug.com/1288118)
+const base::Feature kCanvas2dStaysGPUOnReadback{
+ "Canvas2dStaysGPUOnReadback", base::FEATURE_DISABLED_BY_DEFAULT};
// When enabled, frees up CachedMetadata after consumption by script resources
// and modules. Needed for the experiment in http://crbug.com/1045052.
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 0772551..a922ccd 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -200,7 +200,7 @@
BLINK_COMMON_EXPORT extern const base::Feature kWebviewAccelerateSmallCanvases;
-BLINK_COMMON_EXPORT extern const base::Feature kSoftwareCanvas2DOnReadback;
+BLINK_COMMON_EXPORT extern const base::Feature kCanvas2dStaysGPUOnReadback;
BLINK_COMMON_EXPORT extern const base::Feature kDiscardCodeCacheAfterFirstUse;
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
index b051edd..0afcf2e 100644
--- a/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc
@@ -2003,14 +2003,8 @@
// that those get drawn here
FinalizeFrame();
- // TODO(crbug.com/1101055): Remove the check for NewCanvas2DAPI flag once
- // released.
- // TODO(crbug.com/1090180): New Canvas2D API utilizes willReadFrequently
- // attribute that let the users indicate if a canvas will be read frequently
- // through getImageData, thus uses CPU rendering from the start in such cases.
- if (!RuntimeEnabledFeatures::NewCanvas2DAPIEnabled(
- GetTopExecutionContext()) ||
- base::FeatureList::IsEnabled(features::kSoftwareCanvas2DOnReadback)) {
+ if (!RuntimeEnabledFeatures::Canvas2dStaysGPUOnReadbackEnabled(
+ GetTopExecutionContext())) {
// GetImagedata is faster in Unaccelerated canvases.
// In Desynchronized canvas disabling the acceleration will break
// putImageData: crbug.com/1112060.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 246518b0..8cf410ab 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -349,6 +349,10 @@
status: "experimental",
},
{
+ name: "Canvas2dStaysGPUOnReadback",
+ status: "experimental",
+ },
+ {
name: "CanvasColorManagement",
status: "stable",
},