rafx_api/
shader_module.rs

1#[cfg(feature = "rafx-dx12")]
2use crate::dx12::RafxShaderModuleDx12;
3#[cfg(any(
4    feature = "rafx-empty",
5    not(any(
6        feature = "rafx-dx12",
7        feature = "rafx-metal",
8        feature = "rafx-vulkan",
9        feature = "rafx-gles2",
10        feature = "rafx-gles3"
11    ))
12))]
13use crate::empty::RafxShaderModuleEmpty;
14#[cfg(feature = "rafx-gles2")]
15use crate::gles2::RafxShaderModuleGles2;
16#[cfg(feature = "rafx-gles3")]
17use crate::gles3::RafxShaderModuleGles3;
18#[cfg(feature = "rafx-metal")]
19use crate::metal::RafxShaderModuleMetal;
20#[cfg(feature = "rafx-vulkan")]
21use crate::vulkan::RafxShaderModuleVulkan;
22
23/// Rrepresents loaded shader code that can be used to create a pipeline.
24///
25/// Different APIs require different forms of input. A shader module is created by a "loading"
26/// process that is API-specific. This form could be compiled binary or uncompiled shader code,
27/// depending on the backend in use.
28#[derive(Clone, Debug)]
29pub enum RafxShaderModule {
30    #[cfg(feature = "rafx-dx12")]
31    Dx12(RafxShaderModuleDx12),
32    #[cfg(feature = "rafx-vulkan")]
33    Vk(RafxShaderModuleVulkan),
34    #[cfg(feature = "rafx-metal")]
35    Metal(RafxShaderModuleMetal),
36    #[cfg(feature = "rafx-gles2")]
37    Gles2(RafxShaderModuleGles2),
38    #[cfg(feature = "rafx-gles3")]
39    Gles3(RafxShaderModuleGles3),
40    #[cfg(any(
41        feature = "rafx-empty",
42        not(any(
43            feature = "rafx-dx12",
44            feature = "rafx-metal",
45            feature = "rafx-vulkan",
46            feature = "rafx-gles2",
47            feature = "rafx-gles3"
48        ))
49    ))]
50    Empty(RafxShaderModuleEmpty),
51}
52
53impl RafxShaderModule {
54    /// Get the underlying vulkan API object. This provides access to any internally created
55    /// vulkan objects.
56    #[cfg(feature = "rafx-dx12")]
57    pub fn dx12_shader_module(&self) -> Option<&RafxShaderModuleDx12> {
58        match self {
59            #[cfg(feature = "rafx-dx12")]
60            RafxShaderModule::Dx12(inner) => Some(inner),
61            #[cfg(feature = "rafx-vulkan")]
62            RafxShaderModule::Vk(_) => None,
63            #[cfg(feature = "rafx-metal")]
64            RafxShaderModule::Metal(_) => None,
65            #[cfg(feature = "rafx-gles2")]
66            RafxShaderModule::Gles2(_) => None,
67            #[cfg(feature = "rafx-gles3")]
68            RafxShaderModule::Gles3(_) => None,
69            #[cfg(any(
70                feature = "rafx-empty",
71                not(any(
72                    feature = "rafx-dx12",
73                    feature = "rafx-metal",
74                    feature = "rafx-vulkan",
75                    feature = "rafx-gles2",
76                    feature = "rafx-gles3"
77                ))
78            ))]
79            RafxShaderModule::Empty(_) => None,
80        }
81    }
82
83    /// Get the underlying vulkan API object. This provides access to any internally created
84    /// vulkan objects.
85    #[cfg(feature = "rafx-vulkan")]
86    pub fn vk_shader_module(&self) -> Option<&RafxShaderModuleVulkan> {
87        match self {
88            #[cfg(feature = "rafx-dx12")]
89            RafxShaderModule::Dx12(_) => None,
90            #[cfg(feature = "rafx-vulkan")]
91            RafxShaderModule::Vk(inner) => Some(inner),
92            #[cfg(feature = "rafx-metal")]
93            RafxShaderModule::Metal(_) => None,
94            #[cfg(feature = "rafx-gles2")]
95            RafxShaderModule::Gles2(_) => None,
96            #[cfg(feature = "rafx-gles3")]
97            RafxShaderModule::Gles3(_) => None,
98            #[cfg(any(
99                feature = "rafx-empty",
100                not(any(
101                    feature = "rafx-dx12",
102                    feature = "rafx-metal",
103                    feature = "rafx-vulkan",
104                    feature = "rafx-gles2",
105                    feature = "rafx-gles3"
106                ))
107            ))]
108            RafxShaderModule::Empty(_) => None,
109        }
110    }
111
112    /// Get the underlying metal API object. This provides access to any internally created
113    /// metal objects.
114    #[cfg(feature = "rafx-metal")]
115    pub fn metal_shader_module(&self) -> Option<&RafxShaderModuleMetal> {
116        match self {
117            #[cfg(feature = "rafx-dx12")]
118            RafxShaderModule::Dx12(_) => None,
119            #[cfg(feature = "rafx-vulkan")]
120            RafxShaderModule::Vk(_) => None,
121            #[cfg(feature = "rafx-metal")]
122            RafxShaderModule::Metal(inner) => Some(inner),
123            #[cfg(feature = "rafx-gles2")]
124            RafxShaderModule::Gles2(_) => None,
125            #[cfg(feature = "rafx-gles3")]
126            RafxShaderModule::Gles3(_) => None,
127            #[cfg(any(
128                feature = "rafx-empty",
129                not(any(
130                    feature = "rafx-dx12",
131                    feature = "rafx-metal",
132                    feature = "rafx-vulkan",
133                    feature = "rafx-gles2",
134                    feature = "rafx-gles3"
135                ))
136            ))]
137            RafxShaderModule::Empty(_) => None,
138        }
139    }
140
141    /// Get the underlying metal API object. This provides access to any internally created
142    /// metal objects.
143    #[cfg(feature = "rafx-gles2")]
144    pub fn gles2_shader_module(&self) -> Option<&RafxShaderModuleGles2> {
145        match self {
146            #[cfg(feature = "rafx-dx12")]
147            RafxShaderModule::Dx12(_) => None,
148            #[cfg(feature = "rafx-vulkan")]
149            RafxShaderModule::Vk(_) => None,
150            #[cfg(feature = "rafx-metal")]
151            RafxShaderModule::Metal(_) => None,
152            #[cfg(feature = "rafx-gles2")]
153            RafxShaderModule::Gles2(inner) => Some(inner),
154            #[cfg(feature = "rafx-gles3")]
155            RafxShaderModule::Gles3(_) => None,
156            #[cfg(any(
157                feature = "rafx-empty",
158                not(any(
159                    feature = "rafx-dx12",
160                    feature = "rafx-metal",
161                    feature = "rafx-vulkan",
162                    feature = "rafx-gles2",
163                    feature = "rafx-gles3"
164                ))
165            ))]
166            RafxShaderModule::Empty(_) => None,
167        }
168    }
169
170    /// Get the underlying metal API object. This provides access to any internally created
171    /// metal objects.
172    #[cfg(feature = "rafx-gles3")]
173    pub fn gles3_shader_module(&self) -> Option<&RafxShaderModuleGles3> {
174        match self {
175            #[cfg(feature = "rafx-dx12")]
176            RafxShaderModule::Dx12(_) => None,
177            #[cfg(feature = "rafx-vulkan")]
178            RafxShaderModule::Vk(_) => None,
179            #[cfg(feature = "rafx-metal")]
180            RafxShaderModule::Metal(_) => None,
181            #[cfg(feature = "rafx-gles2")]
182            RafxShaderModule::Gles2(_) => None,
183            #[cfg(feature = "rafx-gles3")]
184            RafxShaderModule::Gles3(inner) => Some(inner),
185            #[cfg(any(
186                feature = "rafx-empty",
187                not(any(
188                    feature = "rafx-dx12",
189                    feature = "rafx-metal",
190                    feature = "rafx-vulkan",
191                    feature = "rafx-gles2",
192                    feature = "rafx-gles3"
193                ))
194            ))]
195            RafxShaderModule::Empty(_) => None,
196        }
197    }
198
199    /// Get the underlying metal API object. This provides access to any internally created
200    /// metal objects.
201    #[cfg(any(
202        feature = "rafx-empty",
203        not(any(
204            feature = "rafx-dx12",
205            feature = "rafx-metal",
206            feature = "rafx-vulkan",
207            feature = "rafx-gles2",
208            feature = "rafx-gles3"
209        ))
210    ))]
211    pub fn empty_shader_module(&self) -> Option<&RafxShaderModuleEmpty> {
212        match self {
213            #[cfg(feature = "rafx-dx12")]
214            RafxShaderModule::Dx12(_) => None,
215            #[cfg(feature = "rafx-vulkan")]
216            RafxShaderModule::Vk(_) => None,
217            #[cfg(feature = "rafx-metal")]
218            RafxShaderModule::Metal(_) => None,
219            #[cfg(feature = "rafx-gles2")]
220            RafxShaderModule::Gles2(_) => None,
221            #[cfg(feature = "rafx-gles3")]
222            RafxShaderModule::Gles3(_) => None,
223            #[cfg(any(
224                feature = "rafx-empty",
225                not(any(
226                    feature = "rafx-dx12",
227                    feature = "rafx-metal",
228                    feature = "rafx-vulkan",
229                    feature = "rafx-gles2",
230                    feature = "rafx-gles3"
231                ))
232            ))]
233            RafxShaderModule::Empty(inner) => Some(inner),
234        }
235    }
236}