Skip to main content

dawn_wgpu/
compat.rs

1use crate::types::*;
2use dawn_rs::*;
3use std::fmt;
4
5#[derive(Debug)]
6pub enum WgpuCompatError {
7    NotCustomBackend,
8    NotDawnBackend,
9}
10
11impl fmt::Display for WgpuCompatError {
12    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
13        match self {
14            WgpuCompatError::NotCustomBackend => write!(f, "wgpu object is not a custom backend"),
15            WgpuCompatError::NotDawnBackend => write!(f, "wgpu custom backend is not dawn-rs"),
16        }
17    }
18}
19
20impl std::error::Error for WgpuCompatError {}
21
22pub fn to_wgpu_instance(instance: Instance) -> wgpu::Instance {
23    wgpu::Instance::from_custom(DawnInstance {
24        inner: SendSync::new(instance),
25    })
26}
27
28pub fn from_wgpu_instance(instance: &wgpu::Instance) -> Result<Instance, WgpuCompatError> {
29    instance
30        .as_custom::<DawnInstance>()
31        .map(|i| i.inner.get())
32        .ok_or(WgpuCompatError::NotDawnBackend)
33}
34
35pub fn to_wgpu_adapter(adapter: Adapter) -> wgpu::Adapter {
36    wgpu::Adapter::from_custom(DawnAdapter {
37        inner: SendSync::new(adapter),
38    })
39}
40
41pub fn from_wgpu_adapter(adapter: &wgpu::Adapter) -> Result<Adapter, WgpuCompatError> {
42    adapter
43        .as_custom::<DawnAdapter>()
44        .map(|a| a.inner.get())
45        .ok_or(WgpuCompatError::NotDawnBackend)
46}
47
48pub fn to_wgpu_device(device: Device) -> wgpu::Device {
49    wgpu::Device::from_custom(DawnDevice { inner: device })
50}
51
52pub fn from_wgpu_device(device: &wgpu::Device) -> Result<Device, WgpuCompatError> {
53    device
54        .as_custom::<DawnDevice>()
55        .map(|d| d.inner.clone())
56        .ok_or(WgpuCompatError::NotDawnBackend)
57}
58
59pub fn to_wgpu_queue(queue: Queue) -> wgpu::Queue {
60    wgpu::Queue::from_custom(DawnQueue { inner: queue })
61}
62
63pub fn from_wgpu_queue(queue: &wgpu::Queue) -> Result<Queue, WgpuCompatError> {
64    queue
65        .as_custom::<DawnQueue>()
66        .map(|q| q.inner.clone())
67        .ok_or(WgpuCompatError::NotDawnBackend)
68}
69
70pub fn from_wgpu_surface(surface: &wgpu::Surface) -> Result<Surface, WgpuCompatError> {
71    surface
72        .as_custom::<DawnSurface>()
73        .map(|s| s.inner.get())
74        .ok_or(WgpuCompatError::NotDawnBackend)
75}
76
77pub fn from_wgpu_buffer(buffer: &wgpu::Buffer) -> Result<Buffer, WgpuCompatError> {
78    buffer
79        .as_custom::<DawnBuffer>()
80        .map(|b| b.inner.clone())
81        .ok_or(WgpuCompatError::NotDawnBackend)
82}
83
84pub fn to_wgpu_texture(texture: Texture, desc: &wgpu::TextureDescriptor<'_>) -> wgpu::Texture {
85    wgpu::Texture::from_custom(DawnTexture { inner: texture }, desc)
86}
87
88pub fn from_wgpu_texture(texture: &wgpu::Texture) -> Result<Texture, WgpuCompatError> {
89    texture
90        .as_custom::<DawnTexture>()
91        .map(|t| t.inner.clone())
92        .ok_or(WgpuCompatError::NotDawnBackend)
93}
94
95pub fn from_wgpu_texture_view(view: &wgpu::TextureView) -> Result<TextureView, WgpuCompatError> {
96    view.as_custom::<DawnTextureView>()
97        .map(|v| v.inner.clone())
98        .ok_or(WgpuCompatError::NotDawnBackend)
99}
100
101pub fn from_wgpu_sampler(sampler: &wgpu::Sampler) -> Result<Sampler, WgpuCompatError> {
102    sampler
103        .as_custom::<DawnSampler>()
104        .map(|s| s.inner.clone())
105        .ok_or(WgpuCompatError::NotDawnBackend)
106}
107
108pub fn from_wgpu_bind_group_layout(
109    layout: &wgpu::BindGroupLayout,
110) -> Result<BindGroupLayout, WgpuCompatError> {
111    layout
112        .as_custom::<DawnBindGroupLayout>()
113        .map(|l| l.inner.clone())
114        .ok_or(WgpuCompatError::NotDawnBackend)
115}
116
117pub fn from_wgpu_bind_group(group: &wgpu::BindGroup) -> Result<BindGroup, WgpuCompatError> {
118    group
119        .as_custom::<DawnBindGroup>()
120        .map(|g| g.inner.clone())
121        .ok_or(WgpuCompatError::NotDawnBackend)
122}
123
124pub fn from_wgpu_pipeline_layout(
125    layout: &wgpu::PipelineLayout,
126) -> Result<PipelineLayout, WgpuCompatError> {
127    layout
128        .as_custom::<DawnPipelineLayout>()
129        .map(|l| l.inner.clone())
130        .ok_or(WgpuCompatError::NotDawnBackend)
131}
132
133pub fn from_wgpu_render_pipeline(
134    pipeline: &wgpu::RenderPipeline,
135) -> Result<RenderPipeline, WgpuCompatError> {
136    pipeline
137        .as_custom::<DawnRenderPipeline>()
138        .map(|p| p.inner.clone())
139        .ok_or(WgpuCompatError::NotDawnBackend)
140}
141
142pub fn from_wgpu_compute_pipeline(
143    pipeline: &wgpu::ComputePipeline,
144) -> Result<ComputePipeline, WgpuCompatError> {
145    pipeline
146        .as_custom::<DawnComputePipeline>()
147        .map(|p| p.inner.clone())
148        .ok_or(WgpuCompatError::NotDawnBackend)
149}
150
151pub fn from_wgpu_shader_module(
152    module: &wgpu::ShaderModule,
153) -> Result<ShaderModule, WgpuCompatError> {
154    module
155        .as_custom::<DawnShaderModule>()
156        .map(|m| m.inner.clone())
157        .ok_or(WgpuCompatError::NotDawnBackend)
158}
159
160pub fn from_wgpu_command_encoder(
161    encoder: &wgpu::CommandEncoder,
162) -> Result<CommandEncoder, WgpuCompatError> {
163    encoder
164        .as_custom::<DawnCommandEncoder>()
165        .map(|e| e.inner.get())
166        .ok_or(WgpuCompatError::NotDawnBackend)
167}
168
169pub fn from_wgpu_command_buffer(
170    buffer: &wgpu::CommandBuffer,
171) -> Result<CommandBuffer, WgpuCompatError> {
172    buffer
173        .as_custom::<DawnCommandBuffer>()
174        .map(|b| b.inner.clone())
175        .ok_or(WgpuCompatError::NotDawnBackend)
176}
177
178pub fn from_wgpu_render_bundle(
179    bundle: &wgpu::RenderBundle,
180) -> Result<RenderBundle, WgpuCompatError> {
181    bundle
182        .as_custom::<DawnRenderBundle>()
183        .map(|b| b.inner.clone())
184        .ok_or(WgpuCompatError::NotDawnBackend)
185}
186
187pub fn from_wgpu_query_set(query_set: &wgpu::QuerySet) -> Result<QuerySet, WgpuCompatError> {
188    query_set
189        .as_custom::<DawnQuerySet>()
190        .map(|q| q.inner.clone())
191        .ok_or(WgpuCompatError::NotDawnBackend)
192}