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}