1use crate::{AdapterInfo, BufferDesc, HalError, SamplerDesc, TextureDesc};
4
5pub trait HalInstance: Send + Sync + 'static {
6 type Adapter: HalAdapter;
7 type Device: HalDevice;
8
9 fn enumerate_adapters(&self) -> Result<Vec<Self::Adapter>, HalError>;
10 fn create_device(&self, adapter: &Self::Adapter) -> Result<Self::Device, HalError>;
11}
12
13pub trait HalAdapter: Send + Sync + 'static {
14 fn info(&self) -> &AdapterInfo;
15}
16
17pub trait HalDevice: Send + Sync + 'static {
18 type Buffer: Send + Sync + 'static;
19 type Texture: Send + Sync + 'static;
20 type Sampler: Send + Sync + 'static;
21 type CommandRecorder: Send + Sync + 'static;
22
23 fn create_buffer(&self, desc: &BufferDesc) -> Result<Self::Buffer, HalError>;
24 fn destroy_buffer(&self, buffer: Self::Buffer);
25 fn write_buffer(
26 &self,
27 buffer: &Self::Buffer,
28 offset: u64,
29 bytes: &[u8],
30 ) -> Result<(), HalError>;
31 fn read_buffer(
32 &self,
33 buffer: &Self::Buffer,
34 offset: u64,
35 dest: &mut [u8],
36 ) -> Result<(), HalError>;
37
38 fn create_texture(&self, desc: &TextureDesc) -> Result<Self::Texture, HalError>;
39 fn destroy_texture(&self, texture: Self::Texture);
40
41 fn create_sampler(&self, desc: &SamplerDesc) -> Result<Self::Sampler, HalError>;
42 fn destroy_sampler(&self, sampler: Self::Sampler);
43
44 fn create_command_recorder(&self) -> Result<Self::CommandRecorder, HalError>;
45
46 fn register_bindless_buffer(&self, buffer: &Self::Buffer) -> Result<u32, HalError>;
47 fn unregister_bindless_buffer(&self, slot: u32);
48
49 fn register_bindless_texture(&self, texture: &Self::Texture) -> Result<u32, HalError>;
50 fn unregister_bindless_texture(&self, slot: u32);
51
52 fn register_bindless_storage_image(&self, texture: &Self::Texture) -> Result<u32, HalError>;
53 fn unregister_bindless_storage_image(&self, slot: u32);
54
55 fn register_bindless_sampler(&self, sampler: &Self::Sampler) -> Result<u32, HalError>;
56 fn unregister_bindless_sampler(&self, slot: u32);
57}
58
59pub trait HalBackend: Send + Sync + 'static {
60 type Instance: HalInstance<Adapter = Self::Adapter, Device = Self::Device>;
61 type Adapter: HalAdapter;
62 type Device: HalDevice;
63}
64
65#[cfg(feature = "vulkan")]
66pub struct VulkanBackend;
67
68#[cfg(feature = "vulkan")]
69impl HalBackend for VulkanBackend {
70 type Instance = crate::vulkan::VulkanInstance;
71 type Adapter = crate::vulkan::VulkanAdapter;
72 type Device = crate::vulkan::VulkanDevice;
73}
74
75#[cfg(feature = "vulkan")]
76impl HalInstance for crate::vulkan::VulkanInstance {
77 type Adapter = crate::vulkan::VulkanAdapter;
78 type Device = crate::vulkan::VulkanDevice;
79
80 fn enumerate_adapters(&self) -> Result<Vec<Self::Adapter>, HalError> {
81 self.enumerate_adapters()
82 }
83
84 fn create_device(&self, adapter: &Self::Adapter) -> Result<Self::Device, HalError> {
85 self.create_device(adapter)
86 }
87}
88
89#[cfg(feature = "vulkan")]
90impl HalAdapter for crate::vulkan::VulkanAdapter {
91 fn info(&self) -> &AdapterInfo {
92 self.info()
93 }
94}
95
96#[cfg(feature = "vulkan")]
97impl HalDevice for crate::vulkan::VulkanDevice {
98 type Buffer = crate::vulkan::VulkanBuffer;
99 type Texture = crate::vulkan::VulkanTexture;
100 type Sampler = crate::vulkan::VulkanSampler;
101 type CommandRecorder = crate::vulkan::VulkanCommandRecorder;
102
103 fn create_buffer(&self, desc: &BufferDesc) -> Result<Self::Buffer, HalError> {
104 self.create_buffer(desc)
105 }
106
107 fn destroy_buffer(&self, buffer: Self::Buffer) {
108 self.destroy_buffer(buffer)
109 }
110
111 fn write_buffer(
112 &self,
113 buffer: &Self::Buffer,
114 offset: u64,
115 bytes: &[u8],
116 ) -> Result<(), HalError> {
117 self.write_buffer(buffer, offset, bytes)
118 }
119
120 fn read_buffer(
121 &self,
122 buffer: &Self::Buffer,
123 offset: u64,
124 dest: &mut [u8],
125 ) -> Result<(), HalError> {
126 self.read_buffer(buffer, offset, dest)
127 }
128
129 fn create_texture(&self, desc: &TextureDesc) -> Result<Self::Texture, HalError> {
130 self.create_texture(desc)
131 }
132
133 fn destroy_texture(&self, texture: Self::Texture) {
134 self.destroy_texture(texture)
135 }
136
137 fn create_sampler(&self, desc: &SamplerDesc) -> Result<Self::Sampler, HalError> {
138 self.create_sampler(desc)
139 }
140
141 fn destroy_sampler(&self, sampler: Self::Sampler) {
142 self.destroy_sampler(sampler)
143 }
144
145 fn create_command_recorder(&self) -> Result<Self::CommandRecorder, HalError> {
146 self.create_command_recorder()
147 }
148
149 fn register_bindless_buffer(&self, buffer: &Self::Buffer) -> Result<u32, HalError> {
150 self.register_bindless_buffer(buffer)
151 }
152
153 fn unregister_bindless_buffer(&self, slot: u32) {
154 self.unregister_bindless_buffer(slot)
155 }
156
157 fn register_bindless_texture(&self, texture: &Self::Texture) -> Result<u32, HalError> {
158 self.register_bindless_texture(texture)
159 }
160
161 fn unregister_bindless_texture(&self, slot: u32) {
162 self.unregister_bindless_texture(slot)
163 }
164
165 fn register_bindless_storage_image(&self, texture: &Self::Texture) -> Result<u32, HalError> {
166 self.register_bindless_storage_image(texture)
167 }
168
169 fn unregister_bindless_storage_image(&self, slot: u32) {
170 self.unregister_bindless_storage_image(slot)
171 }
172
173 fn register_bindless_sampler(&self, sampler: &Self::Sampler) -> Result<u32, HalError> {
174 self.register_bindless_sampler(sampler)
175 }
176
177 fn unregister_bindless_sampler(&self, slot: u32) {
178 self.unregister_bindless_sampler(slot)
179 }
180}