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#[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 #[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 #[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 #[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 #[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 #[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}