Skip to content

Commit 27be211

Browse files
committed
Revive the CTS job
Fixes #6838
1 parent 2a924a3 commit 27be211

File tree

10 files changed

+178
-54
lines changed

10 files changed

+178
-54
lines changed

.github/workflows/cts.yml

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
name: CTS
2+
3+
on:
4+
pull_request:
5+
types: [labeled, opened, synchronize]
6+
workflow_dispatch:
7+
8+
env:
9+
CARGO_INCREMENTAL: false
10+
CARGO_TERM_COLOR: always
11+
RUST_BACKTRACE: full
12+
MSRV: "1.84"
13+
14+
jobs:
15+
cts:
16+
# For pull requests, run only run if we add the "PR: run CTS" label
17+
if: ${{ github.event_name == 'workflow_dispatch' || github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'PR: run CTS') }}
18+
19+
strategy:
20+
fail-fast: false
21+
matrix:
22+
include:
23+
# Windows
24+
- name: Windows x86_64
25+
os: windows-2022
26+
target: x86_64-pc-windows-msvc
27+
backends: dx12
28+
29+
# Linux
30+
#- name: Linux x86_64
31+
# os: ubuntu-20.04
32+
# target: x86_64-unknown-linux-gnu
33+
# backends: vulkan # gl
34+
35+
name: CTS ${{ matrix.name }}
36+
runs-on: ${{ matrix.os }}
37+
38+
steps:
39+
- name: checkout repo
40+
uses: actions/checkout@v4
41+
with:
42+
path: wgpu
43+
44+
- name: checkout cts
45+
run: |
46+
git clone https://github.com/gpuweb/cts.git
47+
cd cts
48+
git checkout $(cat ../wgpu/cts_runner/revision.txt)
49+
50+
- name: Install Repo MSRV toolchain
51+
run: |
52+
rustup toolchain install ${{ env.MSRV }} --no-self-update --profile=minimal --target ${{ matrix.target }}
53+
rustup override set ${{ env.MSRV }}
54+
cargo -V
55+
56+
- name: caching
57+
uses: Swatinem/rust-cache@v2
58+
with:
59+
key: cts-b # suffix for cache busting
60+
workspaces: wgpu
61+
62+
# We enable line numbers for panics, but that's it
63+
- name: disable debug
64+
shell: bash
65+
run: |
66+
mkdir -p wgpu/.cargo
67+
echo """[profile.dev]
68+
debug = 1" > wgpu/.cargo/config.toml
69+
70+
- name: build CTS runner
71+
run: |
72+
cargo build --manifest-path wgpu/cts_runner/Cargo.toml
73+
74+
- name: run CTS
75+
shell: bash
76+
run: |
77+
cd cts;
78+
for backend in ${{ matrix.backends }}; do
79+
echo "======= CTS TESTS $backend ======";
80+
grep -v '^//' ../wgpu/cts_runner/test.lst | while IFS=$' \t\r\n' read test; do
81+
echo "=== Running $test ===";
82+
DENO_WEBGPU_BACKEND=$backend cargo run --manifest-path ../wgpu/cts_runner/Cargo.toml --frozen -- ./tools/run_deno --verbose "$test";
83+
done
84+
done
85+
echo;
86+
echo "Note: Summary reflects only the last test suite, not the entire run."

Cargo.lock

+20-20
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+5-5
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,11 @@ web-sys = { version = "0.3.77", default-features = false }
230230
web-time = "1"
231231

232232
# deno dependencies
233-
deno_console = "0.190.0"
234-
deno_core = "0.336.0"
235-
deno_url = "0.190.0"
236-
deno_web = "0.221.0"
237-
deno_webidl = "0.190.0"
233+
deno_console = "0.192.0"
234+
deno_core = "0.338.0"
235+
deno_url = "0.192.0"
236+
deno_web = "0.224.0"
237+
deno_webidl = "0.192.0"
238238
deno_webgpu = { version = "0.157.0", path = "./deno_webgpu" }
239239
deno_unsync = "0.4.2"
240240
deno_error = "0.5.5"

cts_runner/src/bootstrap.js

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import * as performance from "ext:deno_web/15_performance.js";
2929
import { loadWebGPU } from "ext:deno_webgpu/00_init.js";
3030
import * as imageData from "ext:deno_web/16_image_data.js";
3131
const webgpu = loadWebGPU();
32+
webgpu.initGPU();
3233

3334
// imports needed to pass module evaluation
3435
import "ext:deno_url/01_urlpattern.js";

deno_webgpu/adapter.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ use deno_core::v8;
1111
use deno_core::GarbageCollected;
1212
use deno_core::OpState;
1313
use deno_core::WebIDL;
14-
use tokio::sync::Mutex;
1514

1615
use super::device::GPUDevice;
1716
use crate::webidl::features_to_feature_names;
@@ -128,7 +127,9 @@ impl GPUAdapter {
128127
let required_limits =
129128
serde_json::from_value(serde_json::to_value(descriptor.required_limits)?)?;
130129

131-
let webgpu_trace = std::env::var_os("DENO_WEBGPU_TRACE").unwrap();
130+
let trace = std::env::var_os("DENO_WEBGPU_TRACE")
131+
.map(|path| wgpu_types::Trace::Directory(std::path::PathBuf::from(path)))
132+
.unwrap_or_default();
132133

133134
let wgpu_descriptor = wgpu_types::DeviceDescriptor {
134135
label: crate::transform_label(descriptor.label.clone()),
@@ -137,18 +138,19 @@ impl GPUAdapter {
137138
),
138139
required_limits,
139140
memory_hints: Default::default(),
140-
trace: wgpu_types::Trace::Directory(std::path::PathBuf::from(webgpu_trace)),
141+
trace,
141142
};
142143

143144
let (device, queue) =
144145
self.instance
145146
.adapter_request_device(self.id, &wgpu_descriptor, None, None)?;
146147

147-
let (lost_sender, lost_receiver) = tokio::sync::oneshot::channel();
148148
let (uncaptured_sender, mut uncaptured_receiver) = tokio::sync::mpsc::unbounded_channel();
149149
let (uncaptured_sender_is_closed_sender, mut uncaptured_sender_is_closed_receiver) =
150150
tokio::sync::oneshot::channel::<()>();
151151

152+
let resolver = v8::PromiseResolver::new(scope).unwrap();
153+
let promise = resolver.get_promise(scope);
152154
let device = GPUDevice {
153155
instance: self.instance.clone(),
154156
id: device,
@@ -157,12 +159,12 @@ impl GPUAdapter {
157159
queue_obj: SameObject::new(),
158160
adapter_info: self.info.clone(),
159161
error_handler: Arc::new(super::error::DeviceErrorHandler::new(
160-
lost_sender,
162+
v8::Global::new(scope, resolver),
161163
uncaptured_sender,
162164
uncaptured_sender_is_closed_sender,
163165
)),
164166
adapter: self.id,
165-
lost_receiver: Mutex::new(Some(lost_receiver)),
167+
lost_promise: v8::Global::new(scope, promise),
166168
limits: SameObject::new(),
167169
features: SameObject::new(),
168170
};

deno_webgpu/device.rs

+5-10
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ pub struct GPUDevice {
5050
pub queue_obj: SameObject<GPUQueue>,
5151

5252
pub error_handler: super::error::ErrorHandler,
53-
pub lost_receiver: tokio::sync::Mutex<Option<tokio::sync::oneshot::Receiver<()>>>,
53+
pub lost_promise: v8::Global<v8::Promise>,
5454
}
5555

5656
impl Drop for GPUDevice {
@@ -118,6 +118,7 @@ impl GPUDevice {
118118
fn queue(&self, scope: &mut v8::HandleScope) -> v8::Global<v8::Object> {
119119
self.queue_obj.get(scope, |_| GPUQueue {
120120
id: self.queue,
121+
device: self.id,
121122
error_handler: self.error_handler.clone(),
122123
instance: self.instance.clone(),
123124
label: self.label.clone(),
@@ -560,16 +561,10 @@ impl GPUDevice {
560561
}
561562
}
562563

563-
// TODO(@crowlKats): support returning same promise
564-
#[async_method]
565564
#[getter]
566-
#[cppgc]
567-
async fn lost(&self) -> GPUDeviceLostInfo {
568-
if let Some(lost_receiver) = self.lost_receiver.lock().await.take() {
569-
let _ = lost_receiver.await;
570-
}
571-
572-
GPUDeviceLostInfo
565+
#[global]
566+
fn lost(&self) -> v8::Global<v8::Promise> {
567+
self.lost_promise.clone()
573568
}
574569

575570
#[required(1)]

deno_webgpu/error.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ use std::fmt::Formatter;
55
use std::sync::Mutex;
66
use std::sync::OnceLock;
77

8+
use deno_core::v8;
9+
810
use wgpu_core::binding_model::CreateBindGroupError;
911
use wgpu_core::binding_model::CreateBindGroupLayoutError;
1012
use wgpu_core::binding_model::CreatePipelineLayoutError;
@@ -35,7 +37,7 @@ pub type ErrorHandler = std::sync::Arc<DeviceErrorHandler>;
3537

3638
pub struct DeviceErrorHandler {
3739
pub is_lost: OnceLock<()>,
38-
lost_sender: Mutex<Option<tokio::sync::oneshot::Sender<()>>>,
40+
lost_resolver: Mutex<Option<v8::Global<v8::PromiseResolver>>>,
3941
uncaptured_sender_is_closed: Mutex<Option<tokio::sync::oneshot::Sender<()>>>,
4042

4143
pub uncaptured_sender: tokio::sync::mpsc::UnboundedSender<GPUError>,
@@ -53,13 +55,13 @@ impl Drop for DeviceErrorHandler {
5355

5456
impl DeviceErrorHandler {
5557
pub fn new(
56-
lost_sender: tokio::sync::oneshot::Sender<()>,
58+
lost_resolver: v8::Global<v8::PromiseResolver>,
5759
uncaptured_sender: tokio::sync::mpsc::UnboundedSender<GPUError>,
5860
uncaptured_sender_is_closed: tokio::sync::oneshot::Sender<()>,
5961
) -> Self {
6062
Self {
6163
is_lost: Default::default(),
62-
lost_sender: Mutex::new(Some(lost_sender)),
64+
lost_resolver: Mutex::new(Some(lost_resolver)),
6365
uncaptured_sender,
6466
uncaptured_sender_is_closed: Mutex::new(Some(uncaptured_sender_is_closed)),
6567
scopes: Mutex::new(vec![]),
@@ -80,8 +82,8 @@ impl DeviceErrorHandler {
8082
if matches!(err, GPUError::Lost) {
8183
let _ = self.is_lost.set(());
8284

83-
if let Some(sender) = self.lost_sender.lock().unwrap().take() {
84-
let _ = sender.send(());
85+
if let Some(_resolver) = self.lost_resolver.lock().unwrap().take() {
86+
// TODO: Need a scope to call resolver here.
8587
}
8688
return;
8789
}

0 commit comments

Comments
 (0)