Skip to content
This repository was archived by the owner on Jun 18, 2021. It is now read-only.

Commit 289d8db

Browse files
committed
Return futures from request adapter/request device
1 parent 6238e85 commit 289d8db

File tree

6 files changed

+57
-66
lines changed

6 files changed

+57
-66
lines changed

examples/framework.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ pub trait Example: 'static + Sized {
5252
) -> wgpu::CommandBuffer;
5353
}
5454

55-
pub fn run<E: Example>(title: &str) {
55+
async fn run_async<E: Example>(title: &str) {
5656
use winit::{
5757
event,
5858
event_loop::{ControlFlow, EventLoop},
@@ -105,14 +105,16 @@ pub fn run<E: Example>(title: &str) {
105105
},
106106
wgpu::BackendBit::PRIMARY,
107107
)
108+
.await
108109
.unwrap();
109110

110111
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
111112
extensions: wgpu::Extensions {
112113
anisotropic_filtering: false,
113114
},
114115
limits: wgpu::Limits::default(),
115-
});
116+
})
117+
.await;
116118

117119
let mut sc_desc = wgpu::SwapChainDescriptor {
118120
usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT,
@@ -180,6 +182,10 @@ pub fn run<E: Example>(title: &str) {
180182
});
181183
}
182184

185+
pub fn run<E: Example>(title: &str) {
186+
futures::executor::block_on(run_async::<E>(title));
187+
}
188+
183189
// This allows treating the framework as a standalone example,
184190
// thus avoiding listing the example names in `Cargo.toml`.
185191
#[allow(dead_code)]

examples/hello-compute/main.rs

+15-12
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ use std::{convert::TryInto as _, str::FromStr};
22
use zerocopy::AsBytes as _;
33

44
async fn run() {
5-
env_logger::init();
6-
7-
// For now this just panics if you didn't pass numbers. Could add proper error handling.
8-
if std::env::args().len() == 1 {
9-
panic!("You must pass a list of positive integers!")
10-
}
11-
let numbers: Vec<u32> = std::env::args()
12-
.skip(1)
13-
.map(|s| u32::from_str(&s).expect("You must pass a list of positive integers!"))
14-
.collect();
5+
let numbers = if std::env::args().len() == 1 {
6+
let default = vec![1, 2, 3, 4];
7+
log::info!("No numbers were provided, defaulting to {:?}", default);
8+
default
9+
} else {
10+
std::env::args()
11+
.skip(1)
12+
.map(|s| u32::from_str(&s).expect("You must pass a list of positive integers!"))
13+
.collect()
14+
};
1515

16-
println!("Times: {:?}", execute_gpu(numbers).await);
16+
log::info!("Times: {:?}", execute_gpu(numbers).await);
1717
}
1818

1919
async fn execute_gpu(numbers: Vec<u32>) -> Vec<u32> {
@@ -26,14 +26,16 @@ async fn execute_gpu(numbers: Vec<u32>) -> Vec<u32> {
2626
},
2727
wgpu::BackendBit::PRIMARY,
2828
)
29+
.await
2930
.unwrap();
3031

3132
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
3233
extensions: wgpu::Extensions {
3334
anisotropic_filtering: false,
3435
},
3536
limits: wgpu::Limits::default(),
36-
});
37+
})
38+
.await;
3739

3840
let cs = include_bytes!("shader.comp.spv");
3941
let cs_module =
@@ -108,6 +110,7 @@ async fn execute_gpu(numbers: Vec<u32>) -> Vec<u32> {
108110
}
109111

110112
fn main() {
113+
env_logger::init();
111114
futures::executor::block_on(run());
112115
}
113116

examples/hello-triangle/main.rs

+22-41
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,29 @@
1-
fn main() {
2-
use winit::{
3-
event,
4-
event_loop::{ControlFlow, EventLoop},
5-
};
6-
7-
env_logger::init();
8-
let event_loop = EventLoop::new();
9-
10-
#[cfg(not(feature = "gl"))]
11-
let (window, size, surface) = {
12-
let window = winit::window::Window::new(&event_loop).unwrap();
13-
let size = window.inner_size();
14-
let surface = wgpu::Surface::create(&window);
15-
(window, size, surface)
16-
};
17-
18-
#[cfg(feature = "gl")]
19-
let (window, instance, size, surface) = {
20-
let wb = winit::WindowBuilder::new();
21-
let cb = wgpu::glutin::ContextBuilder::new().with_vsync(true);
22-
let context = cb.build_windowed(wb, &event_loop).unwrap();
23-
24-
let size = context
25-
.window()
26-
.get_inner_size()
27-
.unwrap()
28-
.to_physical(context.window().get_hidpi_factor());
1+
use winit::{
2+
event::{Event, WindowEvent},
3+
event_loop::{ControlFlow, EventLoop},
4+
window::Window
5+
};
296

30-
let (context, window) = unsafe { context.make_current().unwrap().split() };
31-
32-
let instance = wgpu::Instance::new(context);
33-
let surface = instance.get_surface();
34-
35-
(window, instance, size, surface)
36-
};
7+
async fn run(event_loop: EventLoop<()>, window: Window) {
8+
let size = window.inner_size();
9+
let surface = wgpu::Surface::create(&window);
3710

3811
let adapter = wgpu::Adapter::request(
3912
&wgpu::RequestAdapterOptions {
4013
power_preference: wgpu::PowerPreference::Default,
4114
},
4215
wgpu::BackendBit::PRIMARY,
4316
)
17+
.await
4418
.unwrap();
4519

4620
let (device, queue) = adapter.request_device(&wgpu::DeviceDescriptor {
4721
extensions: wgpu::Extensions {
4822
anisotropic_filtering: false,
4923
},
5024
limits: wgpu::Limits::default(),
51-
});
25+
})
26+
.await;
5227

5328
let vs = include_bytes!("shader.vert.spv");
5429
let vs_module =
@@ -113,13 +88,13 @@ fn main() {
11388
event_loop.run(move |event, _, control_flow| {
11489
*control_flow = ControlFlow::Poll;
11590
match event {
116-
event::Event::MainEventsCleared => window.request_redraw(),
117-
event::Event::WindowEvent { event: event::WindowEvent::Resized(size), .. } => {
91+
Event::MainEventsCleared => window.request_redraw(),
92+
Event::WindowEvent { event: WindowEvent::Resized(size), .. } => {
11893
sc_desc.width = size.width;
11994
sc_desc.height = size.height;
12095
swap_chain = device.create_swap_chain(&surface, &sc_desc);
12196
}
122-
event::Event::RedrawRequested(_) => {
97+
Event::RedrawRequested(_) => {
12398
let frame = swap_chain
12499
.get_next_texture()
125100
.expect("Timeout when acquiring next swap chain texture");
@@ -143,11 +118,17 @@ fn main() {
143118

144119
queue.submit(&[encoder.finish()]);
145120
}
146-
event::Event::WindowEvent {
147-
event: event::WindowEvent::CloseRequested,
121+
Event::WindowEvent {
122+
event: WindowEvent::CloseRequested,
148123
..
149124
} => *control_flow = ControlFlow::Exit,
150125
_ => {}
151126
}
152127
});
153128
}
129+
fn main() {
130+
let event_loop = EventLoop::new();
131+
let window = winit::window::Window::new(&event_loop).unwrap();
132+
env_logger::init();
133+
futures::executor::block_on(run(event_loop, window));
134+
}

src/backend/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub(crate) mod native_gpu_future;
File renamed without changes.

src/lib.rs

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
//! A cross-platform graphics and compute library based on WebGPU.
22
3-
mod future;
4-
use future::GpuFutureCompletion;
5-
pub use future::GpuFuture;
3+
mod backend;
4+
use crate::backend::native_gpu_future;
65

76
#[macro_use]
87
mod macros;
@@ -12,6 +11,7 @@ use smallvec::SmallVec;
1211

1312
use std::{
1413
ffi::CString,
14+
future::Future,
1515
ops::Range,
1616
ptr,
1717
slice,
@@ -501,7 +501,7 @@ impl Adapter {
501501
/// Some options are "soft", so treated as non-mandatory. Others are "hard".
502502
///
503503
/// If no adapters are found that suffice all the "hard" options, `None` is returned.
504-
pub fn request(options: &RequestAdapterOptions, backends: BackendBit) -> Option<Self> {
504+
pub async fn request(options: &RequestAdapterOptions, backends: BackendBit) -> Option<Self> {
505505
unsafe extern "C" fn adapter_callback(
506506
id: wgc::id::AdapterId,
507507
user_data: *mut std::ffi::c_void,
@@ -527,7 +527,7 @@ impl Adapter {
527527
/// # Panics
528528
///
529529
/// Panics if the extensions specified by `desc` are not supported by this adapter.
530-
pub fn request_device(&self, desc: &DeviceDescriptor) -> (Device, Queue) {
530+
pub async fn request_device(&self, desc: &DeviceDescriptor) -> (Device, Queue) {
531531
let device = Device {
532532
id: wgn::wgpu_adapter_request_device(self.id, Some(desc)),
533533
temp: Temp::default(),
@@ -910,22 +910,22 @@ impl<T> Drop for BufferAsyncMapping<T> {
910910
struct BufferMapReadFutureUserData
911911
{
912912
size: BufferAddress,
913-
completion: GpuFutureCompletion<BufferMapReadResult>,
913+
completion: native_gpu_future::GpuFutureCompletion<BufferMapReadResult>,
914914
buffer_id: wgc::id::BufferId,
915915
}
916916

917917
struct BufferMapWriteFutureUserData
918918
{
919919
size: BufferAddress,
920-
completion: GpuFutureCompletion<BufferMapWriteResult>,
920+
completion: native_gpu_future::GpuFutureCompletion<BufferMapWriteResult>,
921921
buffer_id: wgc::id::BufferId,
922922
}
923923

924924
impl Buffer {
925925
/// Map the buffer for reading. The result is returned in a future.
926-
pub fn map_read(&self, start: BufferAddress, size: BufferAddress) -> GpuFuture<BufferMapReadResult>
926+
pub fn map_read(&self, start: BufferAddress, size: BufferAddress) -> impl Future<Output = crate::BufferMapReadResult>
927927
{
928-
let (future, completion) = future::new_gpu_future(self.device_id);
928+
let (future, completion) = native_gpu_future::new_gpu_future(self.device_id);
929929

930930
extern "C" fn buffer_map_read_future_wrapper(
931931
status: wgc::resource::BufferMapAsyncStatus,
@@ -963,9 +963,9 @@ impl Buffer {
963963
}
964964

965965
/// Map the buffer for writing. The result is returned in a future.
966-
pub fn map_write(&self, start: BufferAddress, size: BufferAddress) -> GpuFuture<BufferMapWriteResult>
966+
pub fn map_write(&self, start: BufferAddress, size: BufferAddress) -> impl Future<Output = crate::BufferMapWriteResult>
967967
{
968-
let (future, completion) = future::new_gpu_future(self.device_id);
968+
let (future, completion) = native_gpu_future::new_gpu_future(self.device_id);
969969

970970
extern "C" fn buffer_map_write_future_wrapper(
971971
status: wgc::resource::BufferMapAsyncStatus,

0 commit comments

Comments
 (0)