Commit 416dda7d authored by Austin Eng's avatar Austin Eng Committed by Chromium LUCI CQ

Add blink_perf cases for WebGL and WebGPU usage of V8 Fast API Calls

These test cases microbenchmark important entrypoints in the WebGL
and WebGPU APIs where CPU performance is critical. Variants are added
with/without V8's Fast API calls as the feature is still in
development, and we don't want to regress performance.

Bug: 1155348
Change-Id: I21a0b2ba9c2cb8be2ca56f7470ca8bf37ec90b14
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2573385
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: default avatarJohn Chen <johnchen@chromium.org>
Reviewed-by: default avatarKenneth Russell <kbr@chromium.org>
Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Reviewed-by: default avatarDirk Pranke <dpranke@google.com>
Reviewed-by: default avatarCorentin Wallez <cwallez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#841180}
parent 2be9f674
......@@ -344,6 +344,17 @@ if (window.testRunner) {
start(test, requestAnimationFrame, measureFrameTimeOnce);
}
PerfTestRunner.measureInnerRAFTime = function (test) {
PerfTestRunner.unit = "ms";
PerfTestRunner.bufferedLog = true;
test.warmUpCount = test.warmUpCount || 5;
test.iterationCount = test.iterationCount || 10;
// Force gc before starting the test to avoid the measured time from
// being affected by gc performance. See crbug.com/667811#c16.
PerfTestRunner.gc();
start(test, requestAnimationFrame, measureTimeOnce);
}
var lastFrameTime = -1;
function measureFrameTimeOnce() {
if (lastFrameTime != -1)
......
<!DOCTYPE html>
<html>
<head>
<title>
Test CPU performance of the WebGLRenderingContext.drawArrays binding
</title>
<script src="../resources/runner.js"></script>
</head>
<body>
<canvas id="canvas" width=400 height=400></canvas>
<script>
const canvas = document.getElementById('canvas');
const gl = canvas.getContext('webgl');
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0.0, 0.5, 0.0,
-0.5, -0.5, 0.0,
0.5, -0.5, 0.0,
]), gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, null);
const vertShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertShader, `
attribute vec3 a_coord;
void main() {
gl_Position = vec4(a_coord, 1.0);
}`);
gl.compileShader(vertShader);
const fragShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragShader, `
precision mediump float;
uniform vec3 u_color;
void main() {
gl_FragColor = vec4(u_color, 1.0);
}`);
gl.compileShader(fragShader);
const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertShader);
gl.attachShader(shaderProgram, fragShader);
gl.linkProgram(shaderProgram);
gl.useProgram(shaderProgram);
const aCoord = gl.getAttribLocation(shaderProgram, 'a_coord');
const uColor = gl.getUniformLocation(shaderProgram, 'u_color');
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.vertexAttribPointer(aCoord, 3, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(aCoord);
gl.clearColor(0, 0, 0, 1);
gl.viewport(0, 0, canvas.width, canvas.height);
gl.uniform3fv(uColor, [0, 1, 0]);
const iterations = 10000;
PerfTestRunner.measureInnerRAFTime({
description: `CPU time for ${iterations} calls to WebGLRenderingContext.drawArrays`,
warmUpCount: 10,
run() {
gl.clear(gl.COLOR_BUFFER_BIT);
for (let i = 0; i < iterations; ++i) {
gl.drawArrays(gl.TRIANGLES, 0, 3);
}
}
});
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<title>
Test CPU performance of the GPURenderPassEncoder.draw binding
</title>
<script src="../resources/runner.js"></script>
</head>
<body>
<canvas id="canvas" width=400 height=400></canvas>
<script>
(async () => {
const canvas = document.getElementById('canvas');
const context = canvas.getContext('gpupresent');
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const swapChainFormat = await context.getSwapChainPreferredFormat(device);
const swapChain = context.configureSwapChain({
device,
format: swapChainFormat,
});
const pipeline = device.createRenderPipeline({
vertexStage: {
module: device.createShaderModule({
code: `
const pos : array<vec2<f32>, 3> = array<vec2<f32>, 3>(
vec2<f32>(0.0, 0.5),
vec2<f32>(-0.5, -0.5),
vec2<f32>(0.5, -0.5));
[[builtin(position)]] var<out> Position : vec4<f32>;
[[builtin(vertex_idx)]] var<in> VertexIndex : u32;
[[stage(vertex)]] fn main() -> void {
Position = vec4<f32>(pos[VertexIndex], 0.0, 1.0);
}`
}),
entryPoint: 'main',
},
fragmentStage: {
module: device.createShaderModule({
code: `
[[location(0)]] var<out> outColor : vec4<f32>;
[[stage(fragment)]] fn main() -> void {
outColor = vec4<f32>(0.0, 1.0, 0.0, 1.0);
}`
}),
entryPoint: 'main',
},
primitiveTopology: 'triangle-list',
colorStates: [{
format: swapChainFormat,
}],
});
const renderPassDescriptor = {
colorAttachments: [{
attachment: undefined,
loadValue: { r: 0.0, g: 0.0, b: 0.0, a: 1.0 },
}],
};
const iterations = 10000;
PerfTestRunner.measureInnerRAFTime({
description: `CPU time for ${iterations} calls to GPURenderPassEncoder.draw`,
warmUpCount: 10,
run() {
const commandEncoder = device.createCommandEncoder();
renderPassDescriptor.colorAttachments[0].attachment = swapChain.getCurrentTexture().createView();
const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);
passEncoder.setPipeline(pipeline);
for (let i = 0; i < iterations; ++i) {
passEncoder.draw(3, 1, 0, 0);
}
passEncoder.endPass();
device.defaultQueue.submit([commandEncoder.finish()]);
}
});
})();
</script>
</body>
</html>
......@@ -3,6 +3,10 @@ See the following link for directions for making changes to this data:,https://b
Googlers can view additional information about internal perf infrastructure at,https://goto.google.com/chrome-benchmarking-sheet
Benchmark name,Individual owners,Component,Documentation,Tags
UNSCHEDULED_blink_perf.service_worker,"shimazu@chromium.org, falken@chromium.org, ting.shao@intel.com",Blink>ServiceWorker,https://bit.ly/blink-perf-benchmarks,
UNSCHEDULED_blink_perf.webgl,"kbr@chromium.org, enga@chromium.org, webgl-team@google.com",Blink>WebGL,https://bit.ly/blink-perf-benchmarks,
UNSCHEDULED_blink_perf.webgl_fast_call,"kbr@chromium.org, enga@chromium.org, mslekova@chromium.org, webgl-team@google.com",Blink>WebGL,https://bit.ly/blink-perf-benchmarks,
UNSCHEDULED_blink_perf.webgpu,"enga@chromium.org, cwallez@chromium.org, webgpu-developers@google.com",Blink>WebGPU,https://bit.ly/blink-perf-benchmarks,
UNSCHEDULED_blink_perf.webgpu_fast_call,"enga@chromium.org, cwallez@chromium.org, mslekova@chromium.org, webgpu-developers@google.com",Blink>WebGPU,https://bit.ly/blink-perf-benchmarks,
UNSCHEDULED_loading.mbi,blink-isolation-dev@chromium.org,Blink>Internals>Modularization,https://bit.ly/loading-benchmarks,many_agents
base_perftests,"skyostil@chromium.org, gab@chromium.org",Internals>SequenceManager,https://chromium.googlesource.com/chromium/src/+/HEAD/base/README.md#performance-testing,
blink_perf.accessibility,dmazzoni@chromium.org,Blink>Accessibility,https://bit.ly/blink-perf-benchmarks,all
......
......@@ -681,3 +681,70 @@ class BlinkPerfWebAudio(_BlinkPerfBenchmark):
@classmethod
def Name(cls):
return 'blink_perf.webaudio'
@benchmark.Info(
emails=['kbr@chromium.org', 'enga@chromium.org', 'webgl-team@google.com'],
component='Blink>WebGL',
documentation_url='https://bit.ly/blink-perf-benchmarks')
class BlinkPerfWebGL(_BlinkPerfBenchmark):
SUBDIR = 'webgl'
SUPPORTED_PLATFORMS = [story.expectations.ALL]
@classmethod
def Name(cls):
return 'UNSCHEDULED_blink_perf.webgl'
@benchmark.Info(emails=[
'kbr@chromium.org', 'enga@chromium.org', 'mslekova@chromium.org',
'webgl-team@google.com'
],
component='Blink>WebGL',
documentation_url='https://bit.ly/blink-perf-benchmarks')
class BlinkPerfWebGLFastCall(_BlinkPerfBenchmark):
SUBDIR = 'webgl'
SUPPORTED_PLATFORMS = [story.expectations.ALL]
@classmethod
def Name(cls):
return 'UNSCHEDULED_blink_perf.webgl_fast_call'
def SetExtraBrowserOptions(self, options):
options.AppendExtraBrowserArgs(['--enable-unsafe-fast-js-calls'])
@benchmark.Info(emails=[
'enga@chromium.org', 'cwallez@chromium.org', 'webgpu-developers@google.com'
],
component='Blink>WebGPU',
documentation_url='https://bit.ly/blink-perf-benchmarks')
class BlinkPerfWebGPU(_BlinkPerfBenchmark):
SUBDIR = 'webgpu'
SUPPORTED_PLATFORMS = [story.expectations.WIN_10, story.expectations.ALL_MAC]
@classmethod
def Name(cls):
return 'UNSCHEDULED_blink_perf.webgpu'
def SetExtraBrowserOptions(self, options):
options.AppendExtraBrowserArgs(['--enable-unsafe-webgpu'])
@benchmark.Info(emails=[
'enga@chromium.org', 'cwallez@chromium.org', 'mslekova@chromium.org',
'webgpu-developers@google.com'
],
component='Blink>WebGPU',
documentation_url='https://bit.ly/blink-perf-benchmarks')
class BlinkPerfWebGPUFastCall(_BlinkPerfBenchmark):
SUBDIR = 'webgpu'
SUPPORTED_PLATFORMS = [story.expectations.WIN_10, story.expectations.ALL_MAC]
@classmethod
def Name(cls):
return 'UNSCHEDULED_blink_perf.webgpu_fast_call'
def SetExtraBrowserOptions(self, options):
options.AppendExtraBrowserArgs(
['--enable-unsafe-webgpu', '--enable-unsafe-fast-js-calls'])
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