rafx_api/
shader.rs

1#[cfg(feature = "rafx-dx12")]
2use crate::dx12::RafxShaderDx12;
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::RafxShaderEmpty;
14#[cfg(feature = "rafx-gles2")]
15use crate::gles2::RafxShaderGles2;
16#[cfg(feature = "rafx-gles3")]
17use crate::gles3::RafxShaderGles3;
18#[cfg(feature = "rafx-metal")]
19use crate::metal::RafxShaderMetal;
20#[cfg(feature = "rafx-vulkan")]
21use crate::vulkan::RafxShaderVulkan;
22use crate::RafxPipelineReflection;
23
24/// Represents one or more shader stages, producing an entire "program" to execute on the GPU
25#[derive(Clone, Debug)]
26pub enum RafxShader {
27    #[cfg(feature = "rafx-dx12")]
28    Dx12(RafxShaderDx12),
29    #[cfg(feature = "rafx-vulkan")]
30    Vk(RafxShaderVulkan),
31    #[cfg(feature = "rafx-metal")]
32    Metal(RafxShaderMetal),
33    #[cfg(feature = "rafx-gles2")]
34    Gles2(RafxShaderGles2),
35    #[cfg(feature = "rafx-gles3")]
36    Gles3(RafxShaderGles3),
37    #[cfg(any(
38        feature = "rafx-empty",
39        not(any(
40            feature = "rafx-dx12",
41            feature = "rafx-metal",
42            feature = "rafx-vulkan",
43            feature = "rafx-gles2",
44            feature = "rafx-gles3"
45        ))
46    ))]
47    Empty(RafxShaderEmpty),
48}
49
50impl RafxShader {
51    pub fn pipeline_reflection(&self) -> &RafxPipelineReflection {
52        match self {
53            #[cfg(feature = "rafx-dx12")]
54            RafxShader::Dx12(inner) => inner.pipeline_reflection(),
55            #[cfg(feature = "rafx-vulkan")]
56            RafxShader::Vk(inner) => inner.pipeline_reflection(),
57            #[cfg(feature = "rafx-metal")]
58            RafxShader::Metal(inner) => inner.pipeline_reflection(),
59            #[cfg(feature = "rafx-gles2")]
60            RafxShader::Gles2(inner) => inner.pipeline_reflection(),
61            #[cfg(feature = "rafx-gles3")]
62            RafxShader::Gles3(inner) => inner.pipeline_reflection(),
63            #[cfg(any(
64                feature = "rafx-empty",
65                not(any(
66                    feature = "rafx-dx12",
67                    feature = "rafx-metal",
68                    feature = "rafx-vulkan",
69                    feature = "rafx-gles2",
70                    feature = "rafx-gles3"
71                ))
72            ))]
73            RafxShader::Empty(inner) => inner.pipeline_reflection(),
74        }
75    }
76
77    /// Get the underlying vulkan API object. This provides access to any internally created
78    /// vulkan objects.
79    #[cfg(feature = "rafx-dx12")]
80    pub fn dx12_shader(&self) -> Option<&RafxShaderDx12> {
81        match self {
82            #[cfg(feature = "rafx-dx12")]
83            RafxShader::Dx12(inner) => Some(inner),
84            #[cfg(feature = "rafx-vulkan")]
85            RafxShader::Vk(_) => None,
86            #[cfg(feature = "rafx-metal")]
87            RafxShader::Metal(_) => None,
88            #[cfg(feature = "rafx-gles2")]
89            RafxShader::Gles2(_) => None,
90            #[cfg(feature = "rafx-gles3")]
91            RafxShader::Gles3(_) => None,
92            #[cfg(any(
93                feature = "rafx-empty",
94                not(any(
95                    feature = "rafx-dx12",
96                    feature = "rafx-metal",
97                    feature = "rafx-vulkan",
98                    feature = "rafx-gles2",
99                    feature = "rafx-gles3"
100                ))
101            ))]
102            RafxShader::Empty(_) => None,
103        }
104    }
105
106    /// Get the underlying vulkan API object. This provides access to any internally created
107    /// vulkan objects.
108    #[cfg(feature = "rafx-vulkan")]
109    pub fn vk_shader(&self) -> Option<&RafxShaderVulkan> {
110        match self {
111            #[cfg(feature = "rafx-dx12")]
112            RafxShader::Dx12(_) => None,
113            #[cfg(feature = "rafx-vulkan")]
114            RafxShader::Vk(inner) => Some(inner),
115            #[cfg(feature = "rafx-metal")]
116            RafxShader::Metal(_) => None,
117            #[cfg(feature = "rafx-gles2")]
118            RafxShader::Gles2(_) => None,
119            #[cfg(feature = "rafx-gles3")]
120            RafxShader::Gles3(_) => None,
121            #[cfg(any(
122                feature = "rafx-empty",
123                not(any(
124                    feature = "rafx-dx12",
125                    feature = "rafx-metal",
126                    feature = "rafx-vulkan",
127                    feature = "rafx-gles2",
128                    feature = "rafx-gles3"
129                ))
130            ))]
131            RafxShader::Empty(_) => None,
132        }
133    }
134
135    /// Get the underlying metal API object. This provides access to any internally created
136    /// metal objects.
137    #[cfg(feature = "rafx-metal")]
138    pub fn metal_shader(&self) -> Option<&RafxShaderMetal> {
139        match self {
140            #[cfg(feature = "rafx-dx12")]
141            RafxShader::Dx12(_) => None,
142            #[cfg(feature = "rafx-vulkan")]
143            RafxShader::Vk(_) => None,
144            #[cfg(feature = "rafx-metal")]
145            RafxShader::Metal(inner) => Some(inner),
146            #[cfg(feature = "rafx-gles2")]
147            RafxShader::Gles2(_) => None,
148            #[cfg(feature = "rafx-gles3")]
149            RafxShader::Gles3(_) => None,
150            #[cfg(any(
151                feature = "rafx-empty",
152                not(any(
153                    feature = "rafx-dx12",
154                    feature = "rafx-metal",
155                    feature = "rafx-vulkan",
156                    feature = "rafx-gles2",
157                    feature = "rafx-gles3"
158                ))
159            ))]
160            RafxShader::Empty(_) => None,
161        }
162    }
163
164    /// Get the underlying gl API object. This provides access to any internally created
165    /// metal objects.
166    #[cfg(feature = "rafx-gles2")]
167    pub fn gles2_shader(&self) -> Option<&RafxShaderGles2> {
168        match self {
169            #[cfg(feature = "rafx-dx12")]
170            RafxShader::Dx12(_) => None,
171            #[cfg(feature = "rafx-vulkan")]
172            RafxShader::Vk(_) => None,
173            #[cfg(feature = "rafx-metal")]
174            RafxShader::Metal(_) => None,
175            #[cfg(feature = "rafx-gles2")]
176            RafxShader::Gles2(inner) => Some(inner),
177            #[cfg(feature = "rafx-gles3")]
178            RafxShader::Gles3(_) => None,
179            #[cfg(any(
180                feature = "rafx-empty",
181                not(any(
182                    feature = "rafx-dx12",
183                    feature = "rafx-metal",
184                    feature = "rafx-vulkan",
185                    feature = "rafx-gles2",
186                    feature = "rafx-gles3"
187                ))
188            ))]
189            RafxShader::Empty(_) => None,
190        }
191    }
192
193    /// Get the underlying gl API object. This provides access to any internally created
194    /// metal objects.
195    #[cfg(feature = "rafx-gles3")]
196    pub fn gles3_shader(&self) -> Option<&RafxShaderGles3> {
197        match self {
198            #[cfg(feature = "rafx-dx12")]
199            RafxShader::Dx12(_) => None,
200            #[cfg(feature = "rafx-vulkan")]
201            RafxShader::Vk(_) => None,
202            #[cfg(feature = "rafx-metal")]
203            RafxShader::Metal(_) => None,
204            #[cfg(feature = "rafx-gles2")]
205            RafxShader::Gles2(_) => None,
206            #[cfg(feature = "rafx-gles3")]
207            RafxShader::Gles3(inner) => Some(inner),
208            #[cfg(any(
209                feature = "rafx-empty",
210                not(any(
211                    feature = "rafx-dx12",
212                    feature = "rafx-metal",
213                    feature = "rafx-vulkan",
214                    feature = "rafx-gles2",
215                    feature = "rafx-gles3"
216                ))
217            ))]
218            RafxShader::Empty(_) => None,
219        }
220    }
221
222    #[cfg(feature = "rafx-metal")]
223    pub fn empty_shader(&self) -> Option<&RafxShaderMetal> {
224        match self {
225            #[cfg(feature = "rafx-dx12")]
226            RafxShader::Dx12(_) => None,
227            #[cfg(feature = "rafx-vulkan")]
228            RafxShader::Vk(_) => None,
229            #[cfg(feature = "rafx-metal")]
230            RafxShader::Metal(_) => None,
231            #[cfg(feature = "rafx-gles2")]
232            RafxShader::Gles2(_) => None,
233            #[cfg(feature = "rafx-gles3")]
234            RafxShader::Gles3(_) => None,
235            #[cfg(any(
236                feature = "rafx-empty",
237                not(any(
238                    feature = "rafx-dx12",
239                    feature = "rafx-metal",
240                    feature = "rafx-vulkan",
241                    feature = "rafx-gles2",
242                    feature = "rafx-gles3"
243                ))
244            ))]
245            RafxShader::Empty(inner) => Some(inner),
246        }
247    }
248}