0

Delete old WebGPU CTS support infrastructure

This removes all the CTS infrastructure except that which is needed
for the reftests. Reftests will still need to be first pointed to Dawn's
copy of the CTS before they can be removed from Chrome.

Bug: 1333969
Change-Id: Ie46dfd99242dec7c36dcab54b7d6dad0e51b5a52
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3694099
Commit-Queue: Austin Eng <enga@chromium.org>
Reviewed-by: Mike Pinkerton <pinkerton@chromium.org>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Kent Tamura <tkent@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1012306}
This commit is contained in:
Austin Eng
2022-06-09 02:40:29 +00:00
committed by Chromium LUCI CQ
parent 5c39128400
commit 2cddb77500
11 changed files with 19 additions and 4678 deletions

@ -1458,23 +1458,18 @@ if (!is_ios) {
# This target differs from :blink_web_tests in that it uses the same
# test harness and a few additional flags but, more importantly, only runs
# the web_tests/wpt_internal/webgpu tests, so it doesn't have a data
# dependency on the whole web_test directory. run_webgpu_cts.py is a wrapper
# script around run_web_tests.py which performs additional setup for running
# the WebGPU CTS.
# dependency on the whole web_test directory.
script = _common_web_test_script
# Add run_webgpu_cts.py and remove run_web_tests.py from _common_web_test_args
args = [ "@WrappedPath(" +
rebase_path("//third_party/blink/tools/run_webgpu_cts.py",
root_build_dir) + ")" ] + _common_web_test_args -
[ _common_web_test_args[0] ]
args = _common_web_test_args
if (is_asan) {
args += [ "--timeout-ms=30000" ]
}
args += [
"--webgpu-cts-expectations",
"--ignore-default-expectations",
"--additional-expectations",
"@WrappedPath(../../third_party/blink/web_tests/WebGPUExpectations)",
"--isolated-script-test-filter=wpt_internal/webgpu/web_platform/reftests",
"--isolated-script-test-filter=wpt_internal/webgpu/web_platform/reftests/*",
]
data_deps = [

@ -1,6 +0,0 @@
@echo off
:: Copyright 2021 The Chromium Authors. All rights reserved.
:: Use of this source code is governed by a BSD-style license that can be
:: found in the LICENSE file.
vpython %~dp0\run_webgpu_cts.py %*

@ -1,9 +0,0 @@
#!/usr/bin/env vpython
# Copyright 2021 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from blinkpy.common import multiprocessing_bootstrap
multiprocessing_bootstrap.run('..', '..', 'webgpu-cts', 'scripts',
'run_webgpu_cts.py')

@ -8,82 +8,21 @@ JavaScript to run as part of WPT.
at different stages of implementation, and it is more useful to pin a particular
revision of the CTS rather than use the latest version.)
Most of the WebGPU CTS runs on Chrome's infrastructure using the GPU Telemetry
harness (see content/test/gpu/gpu_tests/webgpu_cts_integration_test.py). Only
the reftests run using the web tests infrastructure.
An autoroller (https://autoroll.skia.org/r/webgpu-cts-chromium-autoroll) rolls the WebGPU
CTS into Chromium regularly. Part of the roll requires regenerating a few files which the
autoroller attempts to do.
1. `third_party/webgpu-cts/ts_sources.txt` is a generated file which tells GN the list of Typescript
sources that may impact compilation.
1. `third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html` is a generated file for WPT and
contains all of the "variants" the CTS is run with. It is generated with the script
`third_party/webgpu-cts/scripts/run_regenerate_internal_cts_html.py` based on a manual list of
tests to split into variants (`third_party/blink/web_tests/webgpu/internal_cts_test_splits.pyl`)
and `third_party/blink/web_tests/WebGPUExpectations`.
1. `third_party/webgpu-cts/ts_sources.txt` is a generated file which tells GN the list of Typescript sources to be transpiled to Javascript.
1. `third_party/webgpu-cts/resource_files.txt` is a generated file which tells GN the list of resources that should be included in the test isolate for CTS test pages to load.
1. `third_party/blink/web_tests/wpt_internal/webgpu/web_platform/reftests/**/*.html` are the
reftests and reference files which run on the web tests test infrastructure.
Should the autoroller fail, a manual roll is required.
See below for step-by-step instructions on performing a roll.
### Running reftests through WPT (Blink web_tests)
## How to manually roll the WebGPU CTS into Chromium
1. Run `roll-dep --roll-to origin/main src/third_party/webgpu-cts/src`. This will produce a commit
that updates DEPS.
1. Run `third_party/webgpu-cts/scripts/gen_ts_dep_lists.py`, add any changes, and amend the previous
commit. GN requires us to include a list of all Typescript sources that will affect compilation.
1. Repeat until regeneration succeeds:
1. Run `third_party/webgpu-cts/scripts/run_regenerate_internal_cts_html.py`.
1. In `third_party/blink/web_tests/WebGPUExpectations`,
delete any expectations that caused regeneration errors
(or try to update them if there was a rename).
1. Commit changes, upload patch (ignore line-length warnings in generated files).
1. Run these tryjobs: `dawn-.*-deps-rel`.
1. Make sure there isn't anything terribly wrong
(e.g. a harness bug that causes all tests to fail, or not run at all).
1. Remove stale expectations:
1. Look at the output of `webgpu_blink_web_tests` (and related)
on those tryjobs.
1. Remove any expectations for "passed unexpectedly" test variants
in `WebGPUExpectations`.
1. Repeat until CQ passes:
1. Look at output of `webgpu_blink_web_tests` on all bots.
1. Look at the output of `webgpu_blink_web_tests` (and related)
on any failing bots.
1. Add `WebGPUExpectations` lines for any test variants that
"failed unexpectedly" on any tryjob.
If they failed on all tryjobs, add them to the "Untriaged" section.
If they failed on a specific tryjob, add them to a platform-specific section.
1. Fail and Skip expectations may be any valid WebGPU CTS test query. Other expectations
like Slow, Crash, and Timeout must list parameters in the same exact order that the
test runner loads them in. You can check the ordering by looking at the test code, or
by loading the standalone CTS runner in Chrome.
1. If using a Slow, Crash, or Timeout expectation that is more precise than a whole variant,
it is necessary to **re-run `run_regenerate_internal_cts_html.py`
to automatically subdivide tests to fulfill the expectations**.
1. If a test variant times out simply because it's very long,
add a test query to `third_party/blink/web_tests/webgpu/internal_cts_test_splits.pyl`
for one of its immediate children and re-run `run_regenerate_internal_cts_html.py`.
(TODO: Try to figure out if we can "ping" the harness to prevent
timeouts due to there being many CTS test cases in one WPT variant.)
1. Run `dawn-.*-deps-rel`.
1. Get a review and land the CL!
## Testing Locally
This is not necessary for the roll process, but it can be useful to run tests locally.
Chromium must be launched with `--enable-unsafe-webgpu`
(or `--enable-features=WebGPUService,WebGPU`).
### Manually through standalone, without expectations
- Open <https://gpuweb.github.io/cts/standalone/>
(or <http://localhost:8080/standalone/> if running the cts locally)
in the browser of your choice.
(Note: reftests can be loaded this way, but they won't get compared against the
reference automatically. Use web_tests for that.)
### Through WPT (Blink web_tests)
(If you want to test unlanded changes to the WebGPU CTS, first check them out in
(If you want to test unlanded reftest changes to the WebGPU CTS, first check them out in
`third_party/webgpu-cts/src`, then run
`third_party/webgpu-cts/scripts/gen_ts_dep_lists.py` and
`third_party/webgpu-cts/scripts/run_regenerate_internal_cts_html.py`.)
@ -99,7 +38,7 @@ Then, do one of the following:
#### Manually, without expectations
- Run `third_party/blink/tools/run_blink_wptserve.py -t YOUR_TARGET`
- Open <http://localhost:8001/wpt_internal/webgpu/> in the browser of your choice.
- Open <http://localhost:8001/wpt_internal/webgpu/your_reftest.https.html> in the browser of your choice.
#### Through the automated harness, with expectations
@ -115,10 +54,9 @@ check there to see if this documentation is outdated):
- For backend validation, `--flag-specific` may be changed from `webgpu` to
`webgpu-with-backend-validation` or `webgpu-with-partial-backend-validation`.
To run a particular test rather than the entire WebGPU CTS, add a test filter.
(Note, queries can't be more specific than "variants" already in `cts.https.html`).
To run a particular test rather than all the reftests, add a test filter.
Examples:
- `--isolated-script-test-filter='wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,buffers,map:mapAsync,read:*'`
- `--isolated-script-test-filter='wpt_internal/webgpu/web_platform/reftests/canvas_clear.https.html'`
- `--isolated-script-test-filter='wpt_internal/webgpu/web_platform/reftests/canvas_complex_bgra8unorm_draw.https.html`
- `--isolated-script-test-filter='wpt_internal/webgpu/web_platform/reftests/canvas_clear.https.html`
Finally, to view the results, open `out/YOUR_TARGET/layout-test-results/results.html`.

@ -1,53 +0,0 @@
<!--
This template lives in third_party/blink/web_tests/webgpu/.
This template is a modified copy of templates/cts.https.html from the WebGPU CTS.
https://github.com/gpuweb/cts/blob/main/templates/cts.https.html
Once autogenerated, this file functions identically to the default
cts.https.html generated by the WebGPU CTS, except it has a custom
variant list which breaks down the test cases further so that test
suppressions can be specific to individual tests or test cases.
-->
<!doctype html>
<title>WebGPU CTS</title>
<meta charset=utf-8>
<link rel=help href='https://gpuweb.github.io/gpuweb/'>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<script>
const loadWebGPUExpectations = import('http://localhost:3000/webgpuCtsExpectations.js')
.then(m => m.expectations, () => {
console.error('Unable to connect to expectations server - running without expectations!');
return [];
});
</script>
<script type=module>
import { setBaseResourcePath } from '/gen/third_party/webgpu-cts/src/common/framework/resources.js';
setBaseResourcePath('/gen/third_party/webgpu-cts/resources');
</script>
<script type=module src=/gen/third_party/webgpu-cts/src/common/runtime/wpt.js></script>
<!-- Manually-selected tests to run on worker: -->
<meta name=variant content='?worker=1&q=webgpu:api,operation,buffers,map:mapAsync,write:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,buffers,map:mapAsync,read:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,buffers,map:mapAsync,read,typedArrayAccess:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,buffers,map:mappedAtCreation:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,buffers,map:remapped_for_write:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,buffers,map_detach:while_mapped:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,command_buffer,basic:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,command_buffer,copyBufferToBuffer:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,compute,basic:memcpy:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,compute,basic:large_dispatch:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,rendering,basic:clear:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,rendering,basic:fullscreen_quad:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,rendering,basic:large_draw:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,render_pass,storeOp:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,render_pass,storeop2:*'>
<meta name=variant content='?worker=1&q=webgpu:api,operation,onSubmittedWorkDone:*'>
<meta name=variant content='?worker=1&q=webgpu:api,validation,buffer,destroy:*'>
<meta name=variant content='?worker=1&q=webgpu:api,validation,buffer,mapping:*'>
<!-- Variant list is auto-generated below this line: -->

@ -1,268 +0,0 @@
# Copyright 2021 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# This is a .pyl, or "Python Literal", file. You can treat it just like a
# .json file, with the following exceptions:
# * all keys must be quoted (use single quotes, please);
# * comments are allowed, using '#' syntax; and
# * trailing commas are allowed.
# This is a list of manual test splits for the WebGPU CTS. They are added to workaround timeouts in the CTS due to
# large combinatoric tests with many parameterizations.
# Specifying a query will cause the parent of the the specified subtree to the expanded into separate WPT variants.
# For example, 'webgpu:some,path,to,file:foo:bar=2;*' will generate a variant for all values of bar.
[
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,encoding,cmds,copyTextureToTexture:copy_ranges_with_compressed_texture_formats:format="bc1-rgba-unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,compressed,array:srcFormat="bc1-rgba-unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,compressed,non_array:srcFormat="bc1-rgba-unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,non_compressed,array:srcFormat="rgba8unorm";dstFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,non_compressed,array:srcFormat="rgba8unorm-srgb";dstFormat="rgba8unorm-srgb";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,non_compressed,array:srcFormat="bgra8unorm";dstFormat="bgra8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,non_compressed,array:srcFormat="bgra8unorm-srgb";dstFormat="bgra8unorm-srgb";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,non_compressed,array:srcFormat="rgba32float";dstFormat="rgba32float";dimension="2d";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,copyTextureToTexture:color_textures,non_compressed,non_array:srcFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToBuffer";format="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="3d";readMethod="CopyToBuffer";format="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="CopyToTexture";format="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="3d";readMethod="CopyToTexture";format="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="Sample";format="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="3d";readMethod="Sample";format="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=false;indirect=true;drawCallTestParameter="vertexCount";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=false;indirect=true;drawCallTestParameter="instanceCount";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=false;indirect=true;drawCallTestParameter="firstVertex";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=true;indirect=false;drawCallTestParameter="baseVertex";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=true;indirect=false;drawCallTestParameter="vertexCountInIndexBuffer";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=true;indirect=true;drawCallTestParameter="baseVertex";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=true;indirect=true;drawCallTestParameter="vertexCountInIndexBuffer";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=true;indirect=true;drawCallTestParameter="indexCount";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=true;indirect=true;drawCallTestParameter="instanceCount";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access_vertex:vertex_buffer_access:indexed=true;indirect=true;drawCallTestParameter="firstIndex";type="float32";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,validation,parse,var_and_let:initializer_type:variableOrConstant="var";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,validation,shader_io,shareable_types:io_shareable_type:storageClass="in";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:sampleCount,valid_sampleCount_with_other_parameter_varies:dimension="1d";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createTexture:texture_usage:dimension="1d";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,draw:arguments:first=0;count=0;first_instance=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,draw:arguments:first=0;count=3;first_instance=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,draw:arguments:first=0;count=6;first_instance=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,draw:arguments:first=3;count=0;first_instance=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,draw:arguments:first=3;count=3;first_instance=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,draw:arguments:first=3;count=6;first_instance=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,resource_init,texture_zero:uninitialized_texture_is_zero:dimension="2d";readMethod="DepthTest";format="depth32float";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,blending:GPUBlendComponent:component="color";srcFactor="zero";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,rendering,blending:GPUBlendComponent:component="alpha";srcFactor="zero";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:subresources_and_binding_types_combination_for_aspect:compute=false;binding0InBundle=false;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,resource_usages,texture,in_pass_encoder:subresources_and_binding_types_combination_for_aspect:compute=true;binding0InBundle=false;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:setVertexBuffer_offset_and_attribute_offset:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:non_zero_array_stride_and_attribute_offset:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read";access="read";dynamicOffset=false;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read";access="read";dynamicOffset=false;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read";access="read";dynamicOffset=false;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="write";access="write";dynamicOffset=false;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="write";access="write";dynamicOffset=false;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="write";access="write";dynamicOffset=false;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";dynamicOffset=false;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";dynamicOffset=false;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";dynamicOffset=false;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="write";dynamicOffset=false;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="write";dynamicOffset=false;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="write";dynamicOffset=false;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read";access="read";dynamicOffset=true;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read";access="read";dynamicOffset=true;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read";access="read";dynamicOffset=true;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="write";access="write";dynamicOffset=true;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="write";access="write";dynamicOffset=true;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="write";access="write";dynamicOffset=true;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";dynamicOffset=true;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";dynamicOffset=true;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="read";dynamicOffset=true;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="write";dynamicOffset=true;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="write";dynamicOffset=true;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="storage";storageMode="read_write";access="write";dynamicOffset=true;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="uniform";access="read";dynamicOffset=false;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="uniform";access="read";dynamicOffset=false;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="uniform";access="read";dynamicOffset=false;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="uniform";access="read";dynamicOffset=true;containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="uniform";access="read";dynamicOffset=true;containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="uniform";access="read";dynamicOffset=true;containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="private";access="read";containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="private";access="read";containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="private";access="read";containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="private";access="write";containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="private";access="write";containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="private";access="write";containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="function";access="read";containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="function";access="read";containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="function";access="read";containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="function";access="write";containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="function";access="write";containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="function";access="write";containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="workgroup";access="read";containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="workgroup";access="read";containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="workgroup";access="read";containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="workgroup";access="write";containerType="array";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="workgroup";access="write";containerType="matrix";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,robust_access:linear_memory:storageClass="workgroup";access="write";containerType="vector";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint8x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint8x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint8x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint8x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="unorm8x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="unorm8x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="snorm8x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="snorm8x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint16x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint16x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint16x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint16x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="unorm16x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="unorm16x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="snorm16x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="snorm16x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="float16x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="float16x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="float32";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="float32x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="float32x3";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="float32x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint32";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint32x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint32x3";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="uint32x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint32";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint32x2";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint32x3";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_format_to_shader_format_conversion:format="sint32x4";shaderComponentCount=1;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:max_buffers_and_attribs:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:overlapping_attributes:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="none";orientation="none";srcDoFlipYDuringCopy=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="none";orientation="flipY";srcDoFlipYDuringCopy=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="premultiply";orientation="none";srcDoFlipYDuringCopy=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="premultiply";orientation="flipY";srcDoFlipYDuringCopy=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="none";orientation="none";srcDoFlipYDuringCopy=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="none";orientation="flipY";srcDoFlipYDuringCopy=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="premultiply";orientation="none";srcDoFlipYDuringCopy=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_ImageData:alpha="premultiply";orientation="flipY";srcDoFlipYDuringCopy=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_canvas:orientation="none";srcDoFlipYDuringCopy=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_canvas:orientation="flipY";srcDoFlipYDuringCopy=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_canvas:orientation="none";srcDoFlipYDuringCopy=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,ImageBitmap:from_canvas:orientation="flipY";srcDoFlipYDuringCopy=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_2d_context_canvas:canvasType="onscreen";dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_2d_context_canvas:canvasType="offscreen";dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gl_context_canvas:canvasType="onscreen";contextName="webgl";dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gl_context_canvas:canvasType="onscreen";contextName="webgl2";dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gl_context_canvas:canvasType="offscreen";contextName="webgl";dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gl_context_canvas:canvasType="offscreen";contextName="webgl2";dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gpu_context_canvas:canvasType="onscreen";srcAndDstInSameGPUDevice=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gpu_context_canvas:canvasType="onscreen";srcAndDstInSameGPUDevice=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gpu_context_canvas:canvasType="offscreen";srcAndDstInSameGPUDevice=true;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:web_platform,copyToTexture,canvas:copy_contents_from_gpu_context_canvas:canvasType="offscreen";srcAndDstInSameGPUDevice=false;dstColorFormat="rgba8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:mip_levels:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:offsets_and_sizes:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:origins_and_extents:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:origins_and_extents:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:origins_and_extents:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow:initMethod="WriteTexture";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow:initMethod="WriteTexture";checkMethod="PartialCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,command_buffer,image_copy:rowsPerImage_and_bytesPerRow:initMethod="CopyB2T";checkMethod="FullCopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint8x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint8x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint8x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint8x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="unorm8x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="unorm8x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="snorm8x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="snorm8x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint16x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint16x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint16x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint16x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="unorm16x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="unorm16x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="snorm16x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="snorm16x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="float16x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="float16x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="float32";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="float32x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="float32x3";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="float32x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint32";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint32x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint32x3";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="uint32x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint32";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint32x2";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint32x3";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_offset_alignment:format="sint32x4";arrayStride=256;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,vertex_state:vertex_attribute_contained_in_stride:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,image_copy,layout_related:required_bytes_in_copy:method="WriteTexture";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,image_copy,layout_related:required_bytes_in_copy:method="CopyB2T";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,image_copy,layout_related:required_bytes_in_copy:method="CopyT2B";format="r8unorm";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:array_stride_zero:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_buffer_used_multiple_times_interleaved:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,operation,vertex_state,correctness:vertex_buffer_used_multiple_times_overlapped:format="uint8x2";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,image_copy,texture_related:format:method="WriteTexture";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,image_copy,texture_related:origin_alignment:method="WriteTexture";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[1,1,1];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[1,32,1];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[64,1,1];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[1,1,48];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[1,47,1];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[33,1,1];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[1,1,63];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[8,8,2];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="workgroup";workgroupSize=[7,7,3];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="private";workgroupSize=[1,1,1];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,zero_init:compute,zero_init:storageClass="function";workgroupSize=[1,1,1];batch__=0;*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createRenderPipeline:pipeline_output_targets,blend_min_max:isAsync=false;component="color";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:api,validation,createRenderPipeline:pipeline_output_targets,blend_min_max:isAsync=true;component="color";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,memory_model,atomicity:atomicity:memType="atomic_storage";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,memory_model,atomicity:atomicity:memType="atomic_storage";testType="inter_workgroup"',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,memory_model,coherence:corr:memType="atomic_storage";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,memory_model,coherence:corr:memType="atomic_storage";testType="inter_workgroup"',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:f32:storageClass="uniform";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:f32:storageClass="uniform";vectorize="_undef_";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:f32:storageClass="storage_r";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:f32:storageClass="storage_r";vectorize="_undef_";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:f32:storageClass="storage_rw";*',
'wpt_internal/webgpu/cts.https.html?q=webgpu:shader,execution,expression,call,builtin,atan2:f32:storageClass="storage_rw";vectorize="_undef_";*',
]

File diff suppressed because it is too large Load Diff

@ -89,13 +89,9 @@ action("verify_regenerate_internal_cts_html") {
script = "scripts/run_regenerate_internal_cts_html.py"
inputs = [
"scripts/compile_src.py",
"scripts/run_webgpu_cts.py",
"scripts/tsc_ignore_errors.py",
"scripts/regenerate_internal_cts_html.py",
"//third_party/node/node.py",
"//third_party/blink/web_tests/wpt_internal/webgpu/cts.https.html",
"//third_party/blink/web_tests/webgpu/ctshtml-template.txt",
"//third_party/blink/web_tests/webgpu/argsprefixes.txt",
] + ts_source_inputs
outputs = [ "$target_out_dir/run_$target_name.stamp" ]

@ -30,82 +30,6 @@ def check_or_write_file(filepath, content, check):
with open(filepath, 'wb') as dst:
dst.write(content)
def generate_internal_cts_html(check):
split_list_fd, split_list_fname = tempfile.mkstemp()
cts_html_fd, cts_html_fname = tempfile.mkstemp()
js_out_dir = tempfile.mkdtemp()
contents = None
try:
logging.info('WebGPU CTS: Extracting expectation names...')
old_sys_path = sys.path
try:
sys.path = old_sys_path + [
os.path.join(third_party_dir, 'blink', 'tools')
]
from run_webgpu_cts import split_cts_expectations_and_web_test_expectations
finally:
sys.path = old_sys_path
with open(
os.path.join(third_party_dir, 'blink', 'web_tests',
'WebGPUExpectations')) as f:
web_test_expectations = split_cts_expectations_and_web_test_expectations(
f.read())['web_test_expectations']['expectations']
logging.info('WebGPU CTS: Reading manual test splits...')
with open(
os.path.join(third_party_dir, 'blink', 'web_tests', 'webgpu',
'internal_cts_test_splits.pyl')) as f:
manual_splits = ast.literal_eval(f.read())
with open(split_list_fname, 'w') as split_list_out:
for expectation in web_test_expectations:
if expectation.test:
split_list_out.write('%s\n' % expectation.test)
for test in manual_splits:
split_list_out.write('%s\n' % test)
logging.info('WebGPU CTS: Transpiling tools...')
compile_src_for_node(js_out_dir)
old_sys_path = sys.path
try:
sys.path = old_sys_path + [os.path.join(third_party_dir, 'node')]
from node import RunNode
finally:
sys.path = old_sys_path
logging.info('WebGPU CTS: Generating cts.https.html...')
cmd = [
os.path.join(js_out_dir,
'common/tools/gen_wpt_cts_html.js'), cts_html_fname,
os.path.join(third_party_dir, 'blink', 'web_tests', 'webgpu',
'ctshtml-template.txt'),
os.path.join(third_party_dir, 'blink', 'web_tests', 'webgpu',
'argsprefixes.txt'), split_list_fname,
'wpt_internal/webgpu/cts.https.html', 'webgpu'
]
logging.info(RunNode(cmd))
with open(cts_html_fname, 'rb') as f:
contents = f.read()
finally:
os.close(split_list_fd)
os.close(cts_html_fd)
shutil.rmtree(js_out_dir)
out_cts_html = os.path.join(third_party_dir, 'blink', 'web_tests',
'wpt_internal', 'webgpu', 'cts.https.html')
if not contents:
raise RuntimeError('Failed to generate %s' % out_cts_html)
check_or_write_file(out_cts_html, contents, check=check)
def generate_reftest_html(check):
# Update this to add/remove subdirectories to check.
sub_dirs = ['web_platform']
@ -170,7 +94,6 @@ if __name__ == '__main__':
parser.add_argument('--stamp', help='Stamp file to write after success.')
args = parser.parse_args()
generate_internal_cts_html(check=args.check)
generate_reftest_html(check=args.check)
if args.stamp:

@ -1,257 +0,0 @@
# Copyright 2021 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import json
from six.moves import BaseHTTPServer
from six.moves import urllib
import sys
from tempfile import mkstemp
import threading
import os
import logging
# This script is run via //third_party/blink/tools/run_webgpu_cts.py which
# adds blinkpy to the Python path.
from blinkpy.common import path_finder
from blinkpy.common.host import Host
from blinkpy.web_tests import run_web_tests
path_finder.add_typ_dir_to_sys_path()
from typ.expectations_parser import TaggedTestListParser, Expectation
from typ.json_results import ResultType
# Basic HTTP request handler to serve the WebGPU webgpuCtsExpectations.js file
class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def __init__(self, *args, **kwargs):
BaseHTTPServer.BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
def do_GET(self):
if self.path == "/webgpuCtsExpectations.js":
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-Type', 'application/javascript')
self.end_headers()
self.wfile.write(self.server.expectations_js.encode())
elif self.path == '/_start' or self.path == '/_stop':
self.send_response(200)
self.end_headers()
else:
self.send_response(404)
self.end_headers()
self.wfile.write('Not found')
# Basic HTTP server which handles request using RequestHandler on a background thread.
class ExpectationsServer(BaseHTTPServer.HTTPServer):
def __init__(self, expectations_js, server_address):
BaseHTTPServer.HTTPServer.__init__(self, server_address,
RequestHandler)
self._should_run = False
self._thread = None
self.expectations_js = expectations_js
def start(self):
assert not self._thread
self._should_run = True
def _loop():
while self._should_run:
self.handle_request()
self._thread = threading.Thread(name='webgpu_expectations_server',
target=_loop)
# Mark the thread as a daemon to be sure it exits. We still have an explicit
# |stop| method because daemon threads are stopped abruptly at shutdown without
# cleaning up resources.
self._thread.daemon = True
self._thread.start()
# Ensure the server is running.
# We want to wait synchronously for this so that server startup time doesn't
# cut into test run time.
while True:
try:
urllib.request.urlopen(
'http://%s:%d/_start' %
(self.server_address[0], self.server_address[1])).read()
except IOError as e:
logging.warning(e)
continue
return
def stop(self):
self._should_run = False
try:
# Load a url so |handle_request| returns.
urllib.request.urlopen(
'http://%s:%d/_stop' %
(self.server_address[0], self.server_address[1])).read()
except IOError as e:
logging.warning(e)
self._thread.join()
self._thread = None
def split_cts_expectations_and_web_test_expectations(
expectations_file_contents, platform_tags=None):
"""Split web test expectations (bit.ly/chromium-test-list-format) into a Javascript
module containing expectations for the WebGPU CTS, and a filtered list of the same web
test expectations, excluding the bits handled by the WebGPU CTS. Returns an object:
{
cts_expectations_js: "export const expectations = [ ... ]",
web_test_expectations: {
expectations: <expectations contents>
tag_set: <frozenset of tags used by the expectations>
result_set: <frozenset of result tags used by the expectations>
}
}"""
cts_expectations = []
out_tag_set = set()
out_result_set = set()
out_expectations = []
parser = TaggedTestListParser(expectations_file_contents)
# For each expectation, append it to |cts_expectations| if the CTS can understand it.
# Expectations not supported by the CTS will be forwarded to the web tests harness.
# This allows us to preserve expectations like [ Slow Crash Timeout RetryOnFailure ].
# It also preserves expectations like [ Pass ] which are used for test splitting.
# TODO(crbug.com/1186320): Handle test splits / variant generation separately?
# Web test expectations that are passed through are run as separate variants.
# Since [ Slow Crash Timeout RetryOnFailure Pass ] are Web test expectations,
# they have the downside that they must be a prefix of the test name. If they don't match
# anything the variant generator will warn.
# TODO(crbug.com/1186320): Also validate the CTS expectation query.
# TODO(crbug.com/1186320): We may be able to use skip expectations in the
# CTS for Crash/Timeout, and then have a separate test suite which runs only the problematic
# tests. We would generate variants specifically for each expectation to avoid the
# prefix problem. This would allow us to have exact test suppressions at the cost of
# potentially running some tests multiple times if there are overlapping expectations.
for exp in parser.expectations:
# Skip expectations that are not relevant to this platform
if platform_tags is not None and not exp.tags.issubset(platform_tags):
continue
results = exp.results
raw_results = exp.raw_results
# Do not do special handling of expectations that aren't for the CTS.
# ex.) ref tests run in WPT without the CTS.
# TODO(crbug.com/1186320): This could be a more robust check.
if 'q=webgpu:' in exp.test:
# Pass Skip expectations to the CTS.
if ResultType.Skip in results:
assert len(
results
) == 1, 'Skip expectations must not be combined with other expectations'
cts_expectations.append({
'query': exp.test,
'expectation': 'skip'
})
continue
# Consume the [ Failure ] expectation for the CTS, but forward along other expectations.
# [ Pass, Crash, Timeout ] will impact variant generation.
# TODO(crbug.com/1186320): Teach the CTS RetryOnFailure.
if ResultType.Failure in results and not exp.should_retry_on_failure:
cts_expectations.append({
'query': exp.test,
'expectation': 'fail'
})
results = results.difference(set((ResultType.Failure, )))
raw_results = [r for r in raw_results if r != 'Failure']
if len(raw_results) != 0:
# Forward everything, with the modified results.
out_exp = Expectation(reason=exp.reason,
test=exp.test,
results=results,
lineno=exp.lineno,
retry_on_failure=exp.should_retry_on_failure,
is_slow_test=exp.is_slow_test,
conflict_resolution=exp.conflict_resolution,
raw_tags=exp.raw_tags,
raw_results=raw_results,
is_glob=exp.is_glob,
trailing_comments=exp.trailing_comments)
out_expectations.append(out_exp)
# Add the results and tags the expectation uses to sets.
# We will prepend these to the top of the out file.
out_result_set = out_result_set.union(out_exp.raw_results)
out_tag_set = out_tag_set.union(out_exp.raw_tags)
return {
'cts_expectations_js':
'export const expectations = ' + json.dumps(cts_expectations),
'web_test_expectations': {
'expectations': out_expectations,
'tag_set': out_tag_set,
'result_set': out_result_set
}
}
def main(args, stderr):
parser = argparse.ArgumentParser(
description=
'Start the WebGPU expectations server, then forwards to run_web_tests.py'
)
parser.add_argument('--webgpu-cts-expectations', required=True)
options, rest_args = parser.parse_known_args(args)
web_test_expectations_fd, web_test_expectations_file = mkstemp()
forwarded_args = rest_args + [
'--ignore-default-expectations', '--additional-expectations',
web_test_expectations_file
]
run_web_tests_options = run_web_tests.parse_args(forwarded_args)[0]
# Construct a web tests port using the test arguments forwarded to run_web_tests.py
# (ex. --platform=android) in order to discover the tags that the web tests harness will
# use. This includes the OS, OS version, architecture, etc.
platform_tags = Host().port_factory.get(
run_web_tests_options.platform,
run_web_tests_options).get_platform_tags()
with open(options.webgpu_cts_expectations) as f:
split_result = split_cts_expectations_and_web_test_expectations(
f.read(), platform_tags)
# Write the out expectation file for web tests.
with open(web_test_expectations_file, 'w') as expectations_out:
web_test_exp = split_result['web_test_expectations']
expectations_out.write('# tags: [ ' +
' '.join(web_test_exp['tag_set']) + ' ]\n')
expectations_out.write('# results: [ Slow ' +
' '.join(web_test_exp['result_set']) + ' ]\n\n')
for exp in web_test_exp['expectations']:
expectations_out.write(exp.to_string() + '\n')
server = ExpectationsServer(split_result['cts_expectations_js'],
('127.0.0.1', 3000))
logging.info('Starting expectations server...')
server.start()
try:
return run_web_tests.main(forwarded_args, stderr)
finally:
logging.info('Stopping expectations server...')
server.stop()
os.close(web_test_expectations_fd)
if __name__ == '__main__':
sys.exit(main(sys.argv[1:], sys.stderr))