Commit 790aa532 authored by Teresa Kang's avatar Teresa Kang Committed by Commit Bot

Use willReadFrequently in OffscreenCanvas

The offscreen/onscreen feature sets should be kept as closely as
possible, hence willReadFrequently should be used in
OffscreenCanvas:GetOrCreateResourceProvider() as well to decide whether
to use CPU or GPU. Web tests are added accordingly to verify that
the behaviour of offscreen/onscreen canvases is consistent.

Bug: 1090180
Change-Id: I1f8df9cb1dec2fb3494f56db472958d978fe1c05
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2309569
Commit-Queue: Teresa Kang <teresakang@google.com>
Reviewed-by: default avatarAaron Krajeski <aaronhk@chromium.org>
Reviewed-by: default avatarFernando Serboncini <fserb@chromium.org>
Reviewed-by: default avatarJuanmi Huertas <juanmihd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#792931}
parent 848b4996
......@@ -361,7 +361,8 @@ CanvasResourceProvider* OffscreenCanvas::GetOrCreateResourceProvider() {
IntSize surface_size(width(), height());
const bool can_use_gpu =
SharedGpuContext::IsGpuCompositingEnabled() &&
(Is3d() || RuntimeEnabledFeatures::Accelerated2dCanvasEnabled());
(Is3d() || (RuntimeEnabledFeatures::Accelerated2dCanvasEnabled() &&
!context_->CreationAttributes().will_read_frequently));
const bool composited_mode =
(Is3d() ? RuntimeEnabledFeatures::WebGLImageChromiumEnabled()
: RuntimeEnabledFeatures::Canvas2dImageChromiumEnabled());
......
......@@ -6871,3 +6871,6 @@ crbug.com/1107944 [ Mac ] http/tests/devtools/tracing/timeline-paint/timeline-pa
# Temporarily disable tests to allow a fix in devtools frontend
crbug.com/1011811 http/tests/devtools/modules-load-initial.js [ Pass Failure ]
crbug.com/1092794 fast/canvas/OffscreenCanvas-2d-placeholder-willReadFrequently.html [ Pass Failure ]
crbug.com/1092794 virtual/gpu/fast/canvas/OffscreenCanvas-2d-placeholder-willReadFrequently.html [ Pass Failure ]
<!DOCTYPE html>
<canvas id="canvasCPU" width="300" height="300"></canvas>
<canvas id="canvasGPU" width="300" height="300"></canvas>
<script>
// Testing that willReadFrequently works the same with HTMLCanvasElement and
// OffscreenCanvas with a placeholder canvas
var canvasCPU = document.getElementById("canvasCPU");
var ctxCPU = canvasCPU.getContext('2d', { willReadFrequently: true });
var canvasGPU = document.getElementById("canvasGPU");
var ctxGPU = canvasGPU.getContext('2d', { willReadFrequently: false });
var img = document.createElement('IMG');
img.onload = function () {
ctxCPU.drawImage(img, 0, 0, 300, 300);
ctxGPU.drawImage(img, 0, 0, 300, 300);
}
// This src image corresponds to a gradient white line that looks different in
// CPU and GPU backend
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQ" +
"AAAAGklEQVQYlWNgYGD4j4z/////H12MYVQRUYoAkYZrlWt0UekAAAAASUVORK5CYII=";
</script>
<!DOCTYPE html>
<canvas id="canvasCPU" width="300" height="300"></canvas>
<canvas id="canvasGPU" width="300" height="300"></canvas>
<script>
// Testing that willReadFrequently works the same with HTMLCanvasElement and
// OffscreenCanvas with a placeholder canvas
var canvasCPU = document.getElementById("canvasCPU");
var offscreenCanvasCPU = canvasCPU.transferControlToOffscreen();
var ctxCPU = offscreenCanvasCPU.getContext('2d', { willReadFrequently: true });
var canvasGPU = document.getElementById("canvasGPU");
var offscreenCanvasGPU = canvasGPU.transferControlToOffscreen();
var ctxGPU = offscreenCanvasGPU.getContext('2d', { willReadFrequently: false });
var img = document.createElement('IMG');
img.onload = function () {
ctxCPU.drawImage(img, 0, 0, 300, 300);
ctxGPU.drawImage(img, 0, 0, 300, 300);
}
// This src image corresponds to a gradient white line that looks different in
// CPU and GPU backend
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQ" +
"AAAAGklEQVQYlWNgYGD4j4z/////H12MYVQRUYoAkYZrlWt0UekAAAAASUVORK5CYII=";
</script>
<!DOCTYPE html>
<canvas id="canvasCPU" width="300" height="300"></canvas>
<canvas id="canvasGPU" width="300" height="300"></canvas>
<script>
// Testing that willReadFrequently works the same with HTMLCanvasElement and
// OffscreenCanvas
var canvasCPU = document.getElementById("canvasCPU");
var ctxCPU = canvasCPU.getContext('2d', { willReadFrequently: true });
var canvasGPU = document.getElementById("canvasGPU");
var ctxGPU = canvasGPU.getContext('2d', { willReadFrequently: false });
var img = document.createElement('IMG');
img.onload = function () {
ctxCPU.drawImage(img, 0, 0, 300, 300);
ctxGPU.drawImage(img, 0, 0, 300, 300);
}
// This src image corresponds to a gradient white line that looks different in
// CPU and GPU backend
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQ" +
"AAAAGklEQVQYlWNgYGD4j4z/////H12MYVQRUYoAkYZrlWt0UekAAAAASUVORK5CYII=";
</script>
<!DOCTYPE html>
<canvas id="canvasCPU" width="300" height="300"></canvas>
<canvas id="canvasGPU" width="300" height="300"></canvas>
<script>
// Testing that willReadFrequently works the same with HTMLCanvasElement and
// OffscreenCanvas
var offscreenCanvasCPU = new OffscreenCanvas(400, 400);
var ctxCPU = offscreenCanvasCPU.getContext('2d', { willReadFrequently: true });
var offscreenCanvasGPU = new OffscreenCanvas(400, 400);
var ctxGPU = offscreenCanvasGPU.getContext('2d', { willReadFrequently: false });
var img = document.createElement('IMG');
img.onload = function () {
ctxCPU.drawImage(img, 0, 0, 300, 300);
var c1 = document.getElementById("canvasCPU").getContext("2d");
c1.drawImage(offscreenCanvasCPU, 0, 0);
ctxGPU.drawImage(img, 0, 0, 300, 300);
var c2 = document.getElementById("canvasGPU").getContext("2d");
c2.drawImage(offscreenCanvasGPU, 0, 0);
}
// This src image corresponds to a gradient white line that looks different in
// CPU and GPU backend
img.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAkAAAAJCAYAAADgkQYQ" +
"AAAAGklEQVQYlWNgYGD4j4z/////H12MYVQRUYoAkYZrlWt0UekAAAAASUVORK5CYII=";
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment