diff --git a/tests/Cargo.toml b/tests/Cargo.toml index 10a0555aa5..5ee691ba05 100644 --- a/tests/Cargo.toml +++ b/tests/Cargo.toml @@ -22,11 +22,16 @@ name = "wgpu-compile-test" path = "compile_tests/root.rs" harness = true +[[test]] +name = "wgpu-validation-test" +path = "validation_tests/root.rs" +harness = true + [features] webgl = ["wgpu/webgl"] [dependencies] -wgpu.workspace = true +wgpu = { workspace = true, features = ["noop"] } wgpu-macros.workspace = true anyhow.workspace = true diff --git a/tests/validation_tests/noop.rs b/tests/validation_tests/noop.rs new file mode 100644 index 0000000000..65c1681da0 --- /dev/null +++ b/tests/validation_tests/noop.rs @@ -0,0 +1,61 @@ +//! Tests of [`wgpu::Backend::Noop`]. + +use std::sync::atomic::{AtomicBool, Ordering::Relaxed}; +use std::sync::Arc; + +#[test] +fn device_is_not_available_by_default() { + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { + backends: wgpu::Backends::NOOP, + ..Default::default() + }); + + assert_eq!( + pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions::default())), + None, + "noop backend adapter present when it should not be" + ); +} + +#[test] +fn device_and_buffers() { + let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { + backends: wgpu::Backends::NOOP, + backend_options: wgpu::BackendOptions { + noop: wgpu::NoopBackendOptions { enable: true }, + ..Default::default() + }, + ..Default::default() + }); + let adapter = + pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions::default())) + .expect("adapter"); + let (device, queue) = + pollster::block_on(adapter.request_device(&wgpu::DeviceDescriptor::default(), None)) + .expect("device"); + + assert_eq!(adapter.get_info().backend, wgpu::Backend::Noop); + + // Demonstrate that creating and *writing* to a buffer succeeds. + // This also involves creation of a staging buffer. + let buffer = device.create_buffer(&wgpu::BufferDescriptor { + label: Some("hello world"), + size: 8, + usage: wgpu::BufferUsages::COPY_DST | wgpu::BufferUsages::COPY_SRC, + mapped_at_creation: false, + }); + assert_eq!(buffer.size(), 8); + queue.write_buffer(&buffer, 0, &[1, 2, 3, 4]); + queue.write_buffer(&buffer, 4, &[5, 6, 7, 8]); + + // Demonstrate that we can read back data from the buffer. + // This also involves copy_buffer_to_buffer(). + let done: Arc = Arc::default(); + let done2 = done.clone(); + wgpu::util::DownloadBuffer::read_buffer(&device, &queue, &buffer.slice(..), move |result| { + assert_eq!(*result.unwrap(), [1, 2, 3, 4, 5, 6, 7, 8],); + done.store(true, Relaxed); + }); + device.poll(wgpu::Maintain::Wait); + assert!(done2.load(Relaxed)); +} diff --git a/tests/validation_tests/root.rs b/tests/validation_tests/root.rs new file mode 100644 index 0000000000..e2e090c5b3 --- /dev/null +++ b/tests/validation_tests/root.rs @@ -0,0 +1,3 @@ +//! Tests of the [`wgpu`] library API that are not run against a particular GPU. + +mod noop;