Skip to content

Commit ca95dad

Browse files
Adapting existing tests to be run with wasm in browser
1 parent 4fdb8a0 commit ca95dad

15 files changed

+137
-231
lines changed

wgpu/tests/buffer.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
use crate::common::{initialize_test, TestParameters, TestingContext};
22
use std::sync::{Arc, atomic::{AtomicBool, Ordering}};
3+
use wasm_bindgen_test::*;
4+
5+
wasm_bindgen_test_configure!(run_in_browser);
36

47
fn test_empty_buffer_range(ctx: &TestingContext, buffer_size: u64, label: &str) {
58
let status = Arc::new(AtomicBool::new(false));
@@ -97,6 +100,7 @@ fn test_empty_buffer_range(ctx: &TestingContext, buffer_size: u64, label: &str)
97100
}
98101

99102
#[test]
103+
// #[wasm_bindgen_test] // 'Buffer slices can not be empty', wgpu\src\lib.rs:2402:39
100104
fn empty_buffer() {
101105
initialize_test(
102106
TestParameters::default(),

wgpu/tests/buffer_usages.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22
33
use crate::common::{fail_if, initialize_test, TestParameters};
44
use wgt::BufferAddress;
5+
use wasm_bindgen_test::*;
6+
7+
wasm_bindgen_test_configure!(run_in_browser);
58

69
const BUFFER_SIZE: BufferAddress = 1234;
710

811
#[test]
12+
#[wasm_bindgen_test]
913
fn buffer_usage() {
1014
fn try_create(enable_mappable_primary_buffers: bool, usages: &[(bool, &[wgpu::BufferUsages])]) {
1115
let mut parameters = TestParameters::default();

wgpu/tests/clear_texture.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use crate::common::{initialize_test, TestParameters, TestingContext};
2+
use wasm_bindgen_test::*;
23
use wgpu::util::align_to;
34

5+
wasm_bindgen_test_configure!(run_in_browser);
6+
47
static TEXTURE_FORMATS_UNCOMPRESSED: &[wgpu::TextureFormat] = &[
58
wgpu::TextureFormat::R8Unorm,
69
wgpu::TextureFormat::R8Snorm,
@@ -304,6 +307,7 @@ fn clear_texture_tests(
304307
}
305308

306309
#[test]
310+
#[wasm_bindgen_test]
307311
fn clear_texture_2d_uncompressed() {
308312
initialize_test(
309313
TestParameters::default().features(wgpu::Features::CLEAR_TEXTURE),
@@ -315,6 +319,7 @@ fn clear_texture_2d_uncompressed() {
315319
}
316320

317321
#[test]
322+
#[wasm_bindgen_test]
318323
fn clear_texture_d32_s8() {
319324
initialize_test(
320325
TestParameters::default()

wgpu/tests/common/mod.rs

Lines changed: 82 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,17 @@ use std::panic::{catch_unwind, AssertUnwindSafe};
55

66
use wgt::{Backends, DeviceDescriptor, DownlevelCapabilities, Features, Limits};
77

8-
use wgpu::{util, Adapter, Device, DownlevelFlags, Instance, Queue};
8+
use wgpu::{Adapter, Device, DownlevelFlags, Instance, Queue};
9+
10+
#[cfg(target_arch = "wasm32")]
11+
use wasm_bindgen::JsCast;
12+
#[cfg(target_arch = "wasm32")]
13+
use web_sys::HtmlCanvasElement;
914

1015
pub mod image;
1116

17+
const CANVAS_ID: &str = "test-canvas";
18+
1219
async fn initialize_device(
1320
adapter: &Adapter,
1421
features: Features,
@@ -170,14 +177,7 @@ pub fn initialize_test(parameters: TestParameters, test_function: impl FnOnce(Te
170177
// We don't actually care if it fails
171178
let _ = env_logger::try_init();
172179

173-
let backend_bits = util::backend_bits_from_env().unwrap_or_else(Backends::all);
174-
let instance = Instance::new(backend_bits);
175-
let adapter = pollster::block_on(util::initialize_adapter_from_env_or_default(
176-
&instance,
177-
backend_bits,
178-
None,
179-
))
180-
.expect("could not find suitable adapter on the system");
180+
let adapter = initialize_adapter();
181181

182182
let adapter_info = adapter.get_info();
183183
let adapter_lowercase_name = adapter_info.name.to_lowercase();
@@ -187,18 +187,28 @@ pub fn initialize_test(parameters: TestParameters, test_function: impl FnOnce(Te
187187

188188
let missing_features = parameters.required_features - adapter_features;
189189
if !missing_features.is_empty() {
190+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
191+
delete_html_canvas();
192+
193+
// TODO: we probably should use log crate here for logging also to wasm console
190194
println!("TEST SKIPPED: MISSING FEATURES {:?}", missing_features);
191195
return;
192196
}
193197

194198
if !parameters.required_limits.check_limits(&adapter_limits) {
199+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
200+
delete_html_canvas();
201+
195202
println!("TEST SKIPPED: LIMIT TOO LOW");
196203
return;
197204
}
198205

199206
let missing_downlevel_flags =
200207
parameters.required_downlevel_properties.flags - adapter_downlevel_capabilities.flags;
201208
if !missing_downlevel_flags.is_empty() {
209+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
210+
delete_html_canvas();
211+
202212
println!(
203213
"TEST SKIPPED: MISSING DOWNLEVEL FLAGS {:?}",
204214
missing_downlevel_flags
@@ -209,6 +219,9 @@ pub fn initialize_test(parameters: TestParameters, test_function: impl FnOnce(Te
209219
if adapter_downlevel_capabilities.shader_model
210220
< parameters.required_downlevel_properties.shader_model
211221
{
222+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
223+
delete_html_canvas();
224+
212225
println!(
213226
"TEST SKIPPED: LOW SHADER MODEL {:?}",
214227
adapter_downlevel_capabilities.shader_model
@@ -273,6 +286,9 @@ pub fn initialize_test(parameters: TestParameters, test_function: impl FnOnce(Te
273286
});
274287

275288
if let Some((reason, true)) = expected_failure_reason {
289+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
290+
delete_html_canvas();
291+
276292
println!("EXPECTED TEST FAILURE SKIPPED: {:?}", reason);
277293
return;
278294
}
@@ -314,6 +330,63 @@ pub fn initialize_test(parameters: TestParameters, test_function: impl FnOnce(Te
314330
}
315331
}
316332

333+
#[cfg(not(all(target_arch = "wasm32", feature = "webgl")))]
334+
fn initialize_adapter() -> Adapter {
335+
let backend_bits = wgpu::util::backend_bits_from_env().unwrap_or_else(Backends::all);
336+
let instance = Instance::new(backend_bits);
337+
338+
pollster::block_on(wgpu::util::initialize_adapter_from_env_or_default(
339+
&instance,
340+
backend_bits,
341+
None,
342+
))
343+
.expect("could not find suitable adapter on the system")
344+
}
345+
346+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
347+
fn initialize_adapter() -> Adapter {
348+
// On wasm, append a canvas to the document body for initializing the adapter
349+
delete_html_canvas(); // if there is a previous one
350+
let canvas = create_html_canvas();
351+
352+
let instance = Instance::new(Backends::GL);
353+
let surface = instance.create_surface_from_canvas(&canvas);
354+
355+
pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
356+
power_preference: wgpu::PowerPreference::default(),
357+
force_fallback_adapter: false,
358+
// Request an adapter which can render to our surface
359+
compatible_surface: Some(&surface),
360+
}))
361+
.expect("could not find suitable adapter on the system")
362+
}
363+
364+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
365+
fn create_html_canvas() -> HtmlCanvasElement {
366+
return web_sys::window()
367+
.and_then(|win| win.document())
368+
.and_then(|doc| {
369+
let body = doc.body().unwrap();
370+
let canvas = doc.create_element("Canvas").unwrap();
371+
canvas.set_id(CANVAS_ID);
372+
body.append_child(&canvas).unwrap();
373+
canvas.dyn_into::<web_sys::HtmlCanvasElement>().ok()
374+
})
375+
.expect("couldn't append canvas to document body");
376+
}
377+
378+
#[cfg(all(target_arch = "wasm32", feature = "webgl"))]
379+
fn delete_html_canvas() {
380+
web_sys::window()
381+
.and_then(|win| win.document())
382+
.and_then(|document| {
383+
if let Some(element) = document.get_element_by_id(CANVAS_ID) {
384+
element.remove();
385+
}
386+
Some(())
387+
});
388+
}
389+
317390
// Run some code in an error scope and assert that validation fails.
318391
pub fn fail<T>(device: &wgpu::Device, callback: impl FnOnce() -> T) -> T {
319392
device.push_error_scope(wgpu::ErrorFilter::Validation);

wgpu/tests/device.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
use wasm_bindgen_test::*;
2+
13
use crate::common::{initialize_test, TestParameters};
24

5+
wasm_bindgen_test_configure!(run_in_browser);
6+
37
#[test]
8+
#[wasm_bindgen_test]
49
fn device_initialization() {
510
initialize_test(TestParameters::default(), |_ctx| {
611
// intentionally empty

wgpu/tests/encoder.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use crate::common::{initialize_test, TestParameters};
2+
use wasm_bindgen_test::*;
3+
4+
wasm_bindgen_test_configure!(run_in_browser);
25

36
#[test]
7+
#[wasm_bindgen_test]
48
fn drop_encoder() {
59
initialize_test(TestParameters::default(), |ctx| {
610
let encoder = ctx

wgpu/tests/poll.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ use wgpu::{
77
};
88

99
use crate::common::{initialize_test, TestParameters, TestingContext};
10+
use wasm_bindgen_test::*;
11+
12+
wasm_bindgen_test_configure!(run_in_browser);
1013

1114
fn generate_dummy_work(ctx: &TestingContext) -> CommandBuffer {
1215
let buffer = ctx.device.create_buffer(&BufferDescriptor {
@@ -53,6 +56,7 @@ fn generate_dummy_work(ctx: &TestingContext) -> CommandBuffer {
5356
}
5457

5558
#[test]
59+
#[wasm_bindgen_test]
5660
fn wait() {
5761
initialize_test(TestParameters::default().skip(), |ctx| {
5862
let cmd_buf = generate_dummy_work(&ctx);
@@ -63,6 +67,7 @@ fn wait() {
6367
}
6468

6569
#[test]
70+
#[wasm_bindgen_test]
6671
fn double_wait() {
6772
initialize_test(TestParameters::default().skip(), |ctx| {
6873
let cmd_buf = generate_dummy_work(&ctx);
@@ -74,6 +79,7 @@ fn double_wait() {
7479
}
7580

7681
#[test]
82+
#[wasm_bindgen_test]
7783
fn wait_on_submission() {
7884
initialize_test(TestParameters::default().skip(), |ctx| {
7985
let cmd_buf = generate_dummy_work(&ctx);
@@ -84,6 +90,7 @@ fn wait_on_submission() {
8490
}
8591

8692
#[test]
93+
#[wasm_bindgen_test]
8794
fn double_wait_on_submission() {
8895
initialize_test(TestParameters::default().skip(), |ctx| {
8996
let cmd_buf = generate_dummy_work(&ctx);
@@ -95,6 +102,7 @@ fn double_wait_on_submission() {
95102
}
96103

97104
#[test]
105+
#[wasm_bindgen_test]
98106
fn wait_out_of_order() {
99107
initialize_test(TestParameters::default().skip(), |ctx| {
100108
let cmd_buf1 = generate_dummy_work(&ctx);

wgpu/tests/queue_transfer.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,12 @@
33
use std::num::NonZeroU32;
44

55
use crate::common::{fail, initialize_test, TestParameters};
6+
use wasm_bindgen_test::*;
7+
8+
wasm_bindgen_test_configure!(run_in_browser);
69

710
#[test]
11+
#[wasm_bindgen_test]
812
fn queue_write_texture_overflow() {
913
initialize_test(TestParameters::default(), |ctx| {
1014
let texture = ctx.device.create_texture(&wgpu::TextureDescriptor {

wgpu/tests/resource_descriptor_accessor.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
use crate::common::{initialize_test, TestParameters};
2+
use wasm_bindgen_test::*;
3+
4+
wasm_bindgen_test_configure!(run_in_browser);
25

36
/// Buffer's size and usage can be read back.
47
#[test]
8+
#[wasm_bindgen_test]
59
fn buffer_size_and_usage() {
610
initialize_test(TestParameters::default(), |ctx| {
711
let buffer = ctx.device.create_buffer(&wgpu::BufferDescriptor {

wgpu/tests/resource_error.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use crate::common::{fail, initialize_test, valid, TestParameters};
2+
use wasm_bindgen_test::*;
3+
4+
wasm_bindgen_test_configure!(run_in_browser);
25

36
#[test]
7+
#[wasm_bindgen_test]
48
fn bad_buffer() {
59
// Create a buffer with bad parameters and call a few methods.
610
// Validation should fail but there should be not panic.
@@ -24,6 +28,7 @@ fn bad_buffer() {
2428
}
2529

2630
#[test]
31+
#[wasm_bindgen_test]
2732
fn bad_texture() {
2833
// Create a texture with bad parameters and call a few methods.
2934
// Validation should fail but there should be not panic.

wgpu/tests/root.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// All files containing tests
22
mod common;
33

4+
mod buffer;
45
mod buffer_copy;
56
mod buffer_usages;
67
mod clear_texture;
@@ -16,6 +17,5 @@ mod shader;
1617
mod shader_primitive_index;
1718
mod texture_bounds;
1819
mod vertex_indices;
19-
mod wasm;
2020
mod write_texture;
2121
mod zero_init_texture_after_discard;

wgpu/tests/shader.wgsl

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)