1use std::{ops::Range, sync::Arc};
2
3use crate::{
4 GpuSamplerSet,
5 errors::GraphicsResult,
6 mesh::{Attribute, Mesh},
7 object::{MeshBuffer, Object},
8 shader::Shader,
9 vulkan,
10};
11
12pub trait GraphicsApi: Sync + Send {
14 fn dispatch_any(&self, objects: &[Arc<Object>]) -> GraphicsResult<()>;
16 fn dispatch_compute(&self, objects: &[Arc<Object>]) -> GraphicsResult<()>;
18
19 fn resize_resources(&self, width: u32, height: u32) -> GraphicsResult<()>;
21
22 fn get_presentation_render_target(&self) -> Arc<dyn RenderTarget>;
24 fn create_layout(
26 &self,
27 double_buffering: bool,
28 texture_num: usize,
29 sampler_num: usize,
30 uniform_num: usize,
31 storage_num: usize,
32 ) -> GraphicsResult<Arc<dyn Layout>>;
33 fn create_buffer(
35 &self,
36 size: u64,
37 uniform: bool,
38 transfer: bool,
39 enable_sync: bool,
40 ) -> GraphicsResult<Arc<dyn Buffer>>;
41 fn create_buffer_mesh(&self, mesh: Arc<Mesh>) -> GraphicsResult<Arc<MeshBuffer>>;
43 fn create_sampler_set(
45 &self,
46 textures: &[(u32, Arc<dyn Texture>)],
47 ) -> GraphicsResult<Arc<GpuSamplerSet>>;
48 fn create_texture(
50 &self,
51 buffer: Arc<dyn Buffer>,
52 data: [u32; 3],
53 anisotropy_texels: f32,
54 ) -> GraphicsResult<Arc<dyn Texture>>;
55
56 fn get_delta_time(&self) -> std::time::Duration;
58}
59
60pub trait RenderTarget: Sync + Send {
62 #[allow(missing_docs)]
63 fn as_vulkan(self: Arc<Self>) -> Option<Arc<vulkan::VulkanRenderTarget>> {
64 None
65 }
66}
67
68pub trait Layout: Sync + Send {
70 #[allow(missing_docs)]
71 fn as_vulkan(self: Arc<Self>) -> Option<Arc<vulkan::VulkanLayout>> {
72 None
73 }
74
75 fn create_graphics_pipeline(
77 self: Arc<Self>,
78 render_target: Arc<dyn RenderTarget>,
79 shaders: &[Shader],
80 attributes: &[Attribute],
81 ) -> GraphicsResult<Arc<dyn Pipeline>>;
82
83 fn create_compute_pipeline(
85 self: Arc<Self>,
86 shader: &Shader,
87 ) -> GraphicsResult<Arc<dyn Pipeline>>;
88
89 fn register_samplers(&self, samplers: &[Arc<GpuSamplerSet>]) -> GraphicsResult<()>;
92 fn add_buffer(&self, binding: u32, buffer: Arc<dyn Buffer>) -> GraphicsResult<()>;
94}
95
96pub trait Texture: Sync + Send {
98 #[allow(missing_docs)]
99 fn as_vulkan(self: Arc<Self>) -> Option<Arc<vulkan::VulkanTexture>> {
100 None
101 }
102}
103
104pub trait Pipeline: Sync + Send {
106 #[allow(missing_docs)]
107 fn as_vulkan(self: Arc<Self>) -> Option<Arc<vulkan::VulkanPipeline>> {
108 None
109 }
110}
111
112pub trait Buffer: Sync + Send {
114 #[allow(missing_docs)]
115 fn as_vulkan(self: Arc<Self>) -> Option<Arc<vulkan::BufferManager>> {
116 None
117 }
118
119 fn get_memory(&self, range: Range<usize>) -> &mut [u8];
121 fn get_memory_full(&self) -> &mut [u8];
123}