wgpu_async/lib.rs
1#![deny(missing_docs)]
2#![warn(clippy::cast_lossless)]
3#![deny(clippy::cast_possible_truncation)]
4#![deny(clippy::cast_possible_wrap)]
5#![deny(clippy::cast_sign_loss)]
6#![warn(clippy::cast_precision_loss)]
7#![deny(clippy::as_underscore)]
8#![deny(clippy::cast_ptr_alignment)]
9#![warn(clippy::checked_conversions)]
10#![warn(clippy::clone_on_ref_ptr)]
11#![warn(clippy::cloned_instead_of_copied)]
12#![warn(clippy::get_unwrap)]
13#![deny(clippy::fallible_impl_from)]
14#![warn(clippy::significant_drop_in_scrutinee)]
15#![deny(clippy::unwrap_used)]
16#![deny(clippy::as_ptr_cast_mut)]
17#![warn(clippy::case_sensitive_file_extension_comparisons)]
18#![doc=include_str!( "../README.md")]
19
20mod async_buffer;
21mod async_device;
22mod async_queue;
23mod wgpu_future;
24
25use std::sync::Arc;
26
27pub use async_buffer::AsyncBuffer;
28pub use async_buffer::AsyncBufferSlice;
29pub use async_device::AsyncDevice;
30pub use async_queue::AsyncQueue;
31pub use wgpu_future::WgpuFuture;
32
33/// Takes a regular `wgpu::Device` and `wgpu::Queue` and gives you the corresponding smart
34/// pointers, [`AsyncDevice`] and [`AsyncQueue`].
35///
36/// # Usage
37///
38/// ```
39/// # use std::sync::Arc;
40/// # pollster::block_on(async {
41/// let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor::default());
42/// let adapter = instance
43/// .request_adapter(&wgpu::RequestAdapterOptions {
44/// power_preference: wgpu::PowerPreference::HighPerformance,
45/// compatible_surface: None,
46/// force_fallback_adapter: true,
47/// })
48/// .await
49/// .expect("missing adapter");
50/// let (device, queue) = adapter
51/// .request_device(
52/// &wgpu::DeviceDescriptor {
53/// required_features: wgpu::Features::empty(),
54/// required_limits: adapter.limits(),
55/// label: None,
56/// memory_hints: wgpu::MemoryHints::Performance,
57/// },
58/// None,
59/// )
60/// .await
61/// .expect("missing device");
62///
63/// let (device, queue) = (Arc::new(device), Arc::new(queue));
64///
65/// let (async_device, async_queue) = wgpu_async::wrap(
66/// Arc::clone(&device),
67/// Arc::clone(&queue)
68/// );
69///
70/// // Then we can do some async-enabled things:
71/// let async_buffer = async_device.create_buffer(&wgpu::BufferDescriptor {
72/// label: None,
73/// size: 8192,
74/// usage: wgpu::BufferUsages::MAP_READ,
75/// mapped_at_creation: false,
76/// });
77/// async_buffer.slice(..).map_async(wgpu::MapMode::Read).await; // New await functionality!
78/// # })
79/// ```
80pub fn wrap(device: Arc<wgpu::Device>, queue: Arc<wgpu::Queue>) -> (AsyncDevice, AsyncQueue) {
81 let device = AsyncDevice::new(device);
82 let queue = AsyncQueue::new(device.clone(), queue);
83
84 (device, queue)
85}