Skip to main content

lgpu_hal/
backend.rs

1//! Unified HAL backend abstraction trait.
2
3use 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}