1use crate::vk::*;
4
5pub trait AsFormat {
7 const FORMAT: VkFormat;
9}
10
11impl AsFormat for f32 {
12 const FORMAT: VkFormat = VK_FORMAT_R32_SFLOAT;
13}
14impl AsFormat for [f32; 2] {
15 const FORMAT: VkFormat = VK_FORMAT_R32G32_SFLOAT;
16}
17impl AsFormat for [f32; 3] {
18 const FORMAT: VkFormat = VK_FORMAT_R32G32B32_SFLOAT;
19}
20impl AsFormat for [f32; 4] {
21 const FORMAT: VkFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
22}
23impl AsFormat for VkExtent2D {
24 const FORMAT: VkFormat = VK_FORMAT_R32G32_SFLOAT;
25}
26impl AsFormat for VkExtent3D {
27 const FORMAT: VkFormat = VK_FORMAT_R32G32B32_SFLOAT;
28}
29impl AsFormat for VkOffset2D {
30 const FORMAT: VkFormat = VK_FORMAT_R32G32_SFLOAT;
31}
32impl AsFormat for VkOffset3D {
33 const FORMAT: VkFormat = VK_FORMAT_R32G32B32_SFLOAT;
34}
35
36pub trait PixelFormat {
38 fn bit_width(self) -> usize;
39 fn components(self) -> FormatComponents;
40 fn element_type(self) -> ElementType;
41}
42impl PixelFormat for VkFormat {
43 fn bit_width(self) -> usize {
44 match self {
45 VK_FORMAT_R4G4_UNORM_PACK8
46 | VK_FORMAT_R8_UNORM
47 | VK_FORMAT_R8_SNORM
48 | VK_FORMAT_R8_USCALED
49 | VK_FORMAT_R8_SSCALED
50 | VK_FORMAT_R8_UINT
51 | VK_FORMAT_R8_SINT
52 | VK_FORMAT_R8_SRGB
53 | VK_FORMAT_S8_UINT => 8,
54 VK_FORMAT_R4G4B4A4_UNORM_PACK16
55 | VK_FORMAT_B4G4R4A4_UNORM_PACK16
56 | VK_FORMAT_R5G6B5_UNORM_PACK16
57 | VK_FORMAT_B5G6R5_UNORM_PACK16
58 | VK_FORMAT_R5G5B5A1_UNORM_PACK16
59 | VK_FORMAT_B5G5R5A1_UNORM_PACK16
60 | VK_FORMAT_A1R5G5B5_UNORM_PACK16
61 | VK_FORMAT_R8G8_UNORM
62 | VK_FORMAT_R8G8_SNORM
63 | VK_FORMAT_R8G8_USCALED
64 | VK_FORMAT_R8G8_SSCALED
65 | VK_FORMAT_R8G8_UINT
66 | VK_FORMAT_R8G8_SINT
67 | VK_FORMAT_R8G8_SRGB
68 | VK_FORMAT_R16_UNORM
69 | VK_FORMAT_R16_SNORM
70 | VK_FORMAT_R16_USCALED
71 | VK_FORMAT_R16_SSCALED
72 | VK_FORMAT_R16_UINT
73 | VK_FORMAT_R16_SINT
74 | VK_FORMAT_R16_SFLOAT
75 | VK_FORMAT_D16_UNORM => 16,
76 VK_FORMAT_R8G8B8_UNORM
77 | VK_FORMAT_R8G8B8_SNORM
78 | VK_FORMAT_R8G8B8_USCALED
79 | VK_FORMAT_R8G8B8_SSCALED
80 | VK_FORMAT_R8G8B8_UINT
81 | VK_FORMAT_R8G8B8_SINT
82 | VK_FORMAT_R8G8B8_SRGB
83 | VK_FORMAT_B8G8R8_UNORM
84 | VK_FORMAT_B8G8R8_SNORM
85 | VK_FORMAT_B8G8R8_USCALED
86 | VK_FORMAT_B8G8R8_SSCALED
87 | VK_FORMAT_B8G8R8_UINT
88 | VK_FORMAT_B8G8R8_SINT
89 | VK_FORMAT_B8G8R8_SRGB
90 | VK_FORMAT_D16_UNORM_S8_UINT => 24,
91 VK_FORMAT_R8G8B8A8_UNORM
92 | VK_FORMAT_R8G8B8A8_SNORM
93 | VK_FORMAT_R8G8B8A8_USCALED
94 | VK_FORMAT_R8G8B8A8_SSCALED
95 | VK_FORMAT_R8G8B8A8_UINT
96 | VK_FORMAT_R8G8B8A8_SINT
97 | VK_FORMAT_R8G8B8A8_SRGB
98 | VK_FORMAT_B8G8R8A8_UNORM
99 | VK_FORMAT_B8G8R8A8_SNORM
100 | VK_FORMAT_B8G8R8A8_USCALED
101 | VK_FORMAT_B8G8R8A8_SSCALED
102 | VK_FORMAT_B8G8R8A8_UINT
103 | VK_FORMAT_B8G8R8A8_SINT
104 | VK_FORMAT_B8G8R8A8_SRGB
105 | VK_FORMAT_A8B8G8R8_UNORM_PACK32
106 | VK_FORMAT_A8B8G8R8_SNORM_PACK32
107 | VK_FORMAT_A8B8G8R8_USCALED_PACK32
108 | VK_FORMAT_A8B8G8R8_SSCALED_PACK32
109 | VK_FORMAT_A8B8G8R8_UINT_PACK32
110 | VK_FORMAT_A8B8G8R8_SINT_PACK32
111 | VK_FORMAT_A8B8G8R8_SRGB_PACK32
112 | VK_FORMAT_A2R10G10B10_UNORM_PACK32
113 | VK_FORMAT_A2R10G10B10_SNORM_PACK32
114 | VK_FORMAT_A2R10G10B10_USCALED_PACK32
115 | VK_FORMAT_A2R10G10B10_SSCALED_PACK32
116 | VK_FORMAT_A2R10G10B10_UINT_PACK32
117 | VK_FORMAT_A2R10G10B10_SINT_PACK32
118 | VK_FORMAT_R16G16_UNORM
119 | VK_FORMAT_R16G16_SNORM
120 | VK_FORMAT_R16G16_USCALED
121 | VK_FORMAT_R16G16_SSCALED
122 | VK_FORMAT_R16G16_UINT
123 | VK_FORMAT_R16G16_SINT
124 | VK_FORMAT_R16G16_SFLOAT
125 | VK_FORMAT_R32_UINT
126 | VK_FORMAT_R32_SINT
127 | VK_FORMAT_R32_SFLOAT
128 | VK_FORMAT_B10G11R11_UFLOAT_PACK32
129 | VK_FORMAT_E5B9G9R9_UFLOAT_PACK32
130 | VK_FORMAT_X8_D24_UNORM_PACK32
131 | VK_FORMAT_D32_SFLOAT
132 | VK_FORMAT_D24_UNORM_S8_UINT => 32,
133 VK_FORMAT_D32_SFLOAT_S8_UINT => 40,
134 VK_FORMAT_R16G16B16_UNORM
135 | VK_FORMAT_R16G16B16_SNORM
136 | VK_FORMAT_R16G16B16_USCALED
137 | VK_FORMAT_R16G16B16_SSCALED
138 | VK_FORMAT_R16G16B16_UINT
139 | VK_FORMAT_R16G16B16_SINT
140 | VK_FORMAT_R16G16B16_SFLOAT => 48,
141 VK_FORMAT_R16G16B16A16_UNORM
142 | VK_FORMAT_R16G16B16A16_SNORM
143 | VK_FORMAT_R16G16B16A16_USCALED
144 | VK_FORMAT_R16G16B16A16_SSCALED
145 | VK_FORMAT_R16G16B16A16_UINT
146 | VK_FORMAT_R16G16B16A16_SINT
147 | VK_FORMAT_R16G16B16A16_SFLOAT
148 | VK_FORMAT_R32G32_UINT
149 | VK_FORMAT_R32G32_SINT
150 | VK_FORMAT_R32G32_SFLOAT
151 | VK_FORMAT_R64_UINT
152 | VK_FORMAT_R64_SINT
153 | VK_FORMAT_R64_SFLOAT => 64,
154 VK_FORMAT_R32G32B32_UINT | VK_FORMAT_R32G32B32_SINT | VK_FORMAT_R32G32B32_SFLOAT => 96,
155 VK_FORMAT_R32G32B32A32_UINT
156 | VK_FORMAT_R32G32B32A32_SINT
157 | VK_FORMAT_R32G32B32A32_SFLOAT
158 | VK_FORMAT_R64G64_UINT
159 | VK_FORMAT_R64G64_SINT
160 | VK_FORMAT_R64G64_SFLOAT => 128,
161 VK_FORMAT_R64G64B64_UINT | VK_FORMAT_R64G64B64_SINT | VK_FORMAT_R64G64B64_SFLOAT => 192,
162 VK_FORMAT_R64G64B64A64_UINT | VK_FORMAT_R64G64B64A64_SINT | VK_FORMAT_R64G64B64A64_SFLOAT => 256,
163 _ => 0,
164 }
165 }
166 fn components(self) -> FormatComponents {
167 match self {
168 VK_FORMAT_UNDEFINED => FormatComponents::Undefined,
169 VK_FORMAT_R8_UNORM
170 | VK_FORMAT_R8_SNORM
171 | VK_FORMAT_R8_USCALED
172 | VK_FORMAT_R8_SSCALED
173 | VK_FORMAT_R8_UINT
174 | VK_FORMAT_R8_SINT
175 | VK_FORMAT_R8_SRGB
176 | VK_FORMAT_R16_UNORM
177 | VK_FORMAT_R16_SNORM
178 | VK_FORMAT_R16_USCALED
179 | VK_FORMAT_R16_SSCALED
180 | VK_FORMAT_R16_UINT
181 | VK_FORMAT_R16_SINT
182 | VK_FORMAT_R16_SFLOAT
183 | VK_FORMAT_R32_UINT
184 | VK_FORMAT_R32_SINT
185 | VK_FORMAT_R32_SFLOAT
186 | VK_FORMAT_R64_UINT
187 | VK_FORMAT_R64_SINT
188 | VK_FORMAT_R64_SFLOAT => FormatComponents::R,
189 VK_FORMAT_R4G4_UNORM_PACK8
190 | VK_FORMAT_R8G8_UNORM
191 | VK_FORMAT_R8G8_SNORM
192 | VK_FORMAT_R8G8_USCALED
193 | VK_FORMAT_R8G8_SSCALED
194 | VK_FORMAT_R8G8_UINT
195 | VK_FORMAT_R8G8_SINT
196 | VK_FORMAT_R8G8_SRGB
197 | VK_FORMAT_R16G16_UNORM
198 | VK_FORMAT_R16G16_SNORM
199 | VK_FORMAT_R16G16_USCALED
200 | VK_FORMAT_R16G16_SSCALED
201 | VK_FORMAT_R16G16_UINT
202 | VK_FORMAT_R16G16_SINT
203 | VK_FORMAT_R16G16_SFLOAT
204 | VK_FORMAT_R32G32_UINT
205 | VK_FORMAT_R32G32_SINT
206 | VK_FORMAT_R32G32_SFLOAT
207 | VK_FORMAT_R64G64_UINT
208 | VK_FORMAT_R64G64_SINT
209 | VK_FORMAT_R64G64_SFLOAT => FormatComponents::RG,
210 VK_FORMAT_R5G6B5_UNORM_PACK16
211 | VK_FORMAT_B5G6R5_UNORM_PACK16
212 | VK_FORMAT_R8G8B8_UNORM
213 | VK_FORMAT_R8G8B8_SNORM
214 | VK_FORMAT_R8G8B8_USCALED
215 | VK_FORMAT_R8G8B8_SSCALED
216 | VK_FORMAT_R8G8B8_UINT
217 | VK_FORMAT_R8G8B8_SINT
218 | VK_FORMAT_R8G8B8_SRGB
219 | VK_FORMAT_B8G8R8_UNORM
220 | VK_FORMAT_B8G8R8_SNORM
221 | VK_FORMAT_B8G8R8_USCALED
222 | VK_FORMAT_B8G8R8_SSCALED
223 | VK_FORMAT_B8G8R8_UINT
224 | VK_FORMAT_B8G8R8_SINT
225 | VK_FORMAT_B8G8R8_SRGB
226 | VK_FORMAT_R16G16B16_UNORM
227 | VK_FORMAT_R16G16B16_SNORM
228 | VK_FORMAT_R16G16B16_USCALED
229 | VK_FORMAT_R16G16B16_SSCALED
230 | VK_FORMAT_R16G16B16_UINT
231 | VK_FORMAT_R16G16B16_SINT
232 | VK_FORMAT_R16G16B16_SFLOAT
233 | VK_FORMAT_R32G32B32_UINT
234 | VK_FORMAT_R32G32B32_SINT
235 | VK_FORMAT_R32G32B32_SFLOAT
236 | VK_FORMAT_R64G64B64_UINT
237 | VK_FORMAT_R64G64B64_SINT
238 | VK_FORMAT_R64G64B64_SFLOAT
239 | VK_FORMAT_B10G11R11_UFLOAT_PACK32 => FormatComponents::RGB,
240 VK_FORMAT_R4G4B4A4_UNORM_PACK16
241 | VK_FORMAT_B4G4R4A4_UNORM_PACK16
242 | VK_FORMAT_R5G5B5A1_UNORM_PACK16
243 | VK_FORMAT_B5G5R5A1_UNORM_PACK16
244 | VK_FORMAT_A1R5G5B5_UNORM_PACK16
245 | VK_FORMAT_R8G8B8A8_UNORM
246 | VK_FORMAT_R8G8B8A8_SNORM
247 | VK_FORMAT_R8G8B8A8_USCALED
248 | VK_FORMAT_R8G8B8A8_SSCALED
249 | VK_FORMAT_R8G8B8A8_UINT
250 | VK_FORMAT_R8G8B8A8_SINT
251 | VK_FORMAT_R8G8B8A8_SRGB
252 | VK_FORMAT_B8G8R8A8_UNORM
253 | VK_FORMAT_B8G8R8A8_SNORM
254 | VK_FORMAT_B8G8R8A8_USCALED
255 | VK_FORMAT_B8G8R8A8_SSCALED
256 | VK_FORMAT_B8G8R8A8_UINT
257 | VK_FORMAT_B8G8R8A8_SINT
258 | VK_FORMAT_B8G8R8A8_SRGB
259 | VK_FORMAT_A8B8G8R8_UNORM_PACK32
260 | VK_FORMAT_A8B8G8R8_SNORM_PACK32
261 | VK_FORMAT_A8B8G8R8_USCALED_PACK32
262 | VK_FORMAT_A8B8G8R8_SSCALED_PACK32
263 | VK_FORMAT_A8B8G8R8_UINT_PACK32
264 | VK_FORMAT_A8B8G8R8_SINT_PACK32
265 | VK_FORMAT_A8B8G8R8_SRGB_PACK32
266 | VK_FORMAT_A2R10G10B10_UNORM_PACK32
267 | VK_FORMAT_A2R10G10B10_SNORM_PACK32
268 | VK_FORMAT_A2R10G10B10_USCALED_PACK32
269 | VK_FORMAT_A2R10G10B10_SSCALED_PACK32
270 | VK_FORMAT_A2R10G10B10_UINT_PACK32
271 | VK_FORMAT_A2R10G10B10_SINT_PACK32
272 | VK_FORMAT_A2B10G10R10_UNORM_PACK32
273 | VK_FORMAT_A2B10G10R10_SNORM_PACK32
274 | VK_FORMAT_A2B10G10R10_USCALED_PACK32
275 | VK_FORMAT_A2B10G10R10_SSCALED_PACK32
276 | VK_FORMAT_A2B10G10R10_UINT_PACK32
277 | VK_FORMAT_A2B10G10R10_SINT_PACK32
278 | VK_FORMAT_R16G16B16A16_UNORM
279 | VK_FORMAT_R16G16B16A16_SNORM
280 | VK_FORMAT_R16G16B16A16_USCALED
281 | VK_FORMAT_R16G16B16A16_SSCALED
282 | VK_FORMAT_R16G16B16A16_UINT
283 | VK_FORMAT_R16G16B16A16_SINT
284 | VK_FORMAT_R16G16B16A16_SFLOAT
285 | VK_FORMAT_R32G32B32A32_UINT
286 | VK_FORMAT_R32G32B32A32_SINT
287 | VK_FORMAT_R32G32B32A32_SFLOAT
288 | VK_FORMAT_R64G64B64A64_SINT
289 | VK_FORMAT_R64G64B64A64_UINT
290 | VK_FORMAT_R64G64B64A64_SFLOAT => FormatComponents::RGBA,
291 VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 => FormatComponents::EBGR,
292 VK_FORMAT_D16_UNORM | VK_FORMAT_X8_D24_UNORM_PACK32 | VK_FORMAT_D32_SFLOAT => FormatComponents::D,
293 VK_FORMAT_S8_UINT => FormatComponents::S,
294 VK_FORMAT_D16_UNORM_S8_UINT | VK_FORMAT_D24_UNORM_S8_UINT | VK_FORMAT_D32_SFLOAT_S8_UINT => {
295 FormatComponents::DS
296 }
297 _ => FormatComponents::Compressed,
298 }
299 }
300 #[allow(non_upper_case_globals)]
301 fn element_type(self) -> ElementType {
302 match self {
303 VK_FORMAT_UNDEFINED => ElementType::Undefined,
304 VK_FORMAT_R4G4_UNORM_PACK8
305 | VK_FORMAT_R4G4B4A4_UNORM_PACK16
306 | VK_FORMAT_B4G4R4A4_UNORM_PACK16
307 | VK_FORMAT_R5G6B5_UNORM_PACK16
308 | VK_FORMAT_B5G6R5_UNORM_PACK16
309 | VK_FORMAT_R5G5B5A1_UNORM_PACK16
310 | VK_FORMAT_B5G5R5A1_UNORM_PACK16
311 | VK_FORMAT_A1R5G5B5_UNORM_PACK16
312 | VK_FORMAT_R8_UNORM
313 | VK_FORMAT_R8G8_UNORM
314 | VK_FORMAT_R8G8B8_UNORM
315 | VK_FORMAT_B8G8R8_UNORM
316 | VK_FORMAT_R8G8B8A8_UNORM
317 | VK_FORMAT_B8G8R8A8_UNORM
318 | VK_FORMAT_A8B8G8R8_UNORM_PACK32
319 | VK_FORMAT_A2R10G10B10_UNORM_PACK32
320 | VK_FORMAT_A2B10G10R10_UNORM_PACK32
321 | VK_FORMAT_R16G16B16_UNORM
322 | VK_FORMAT_D16_UNORM
323 | VK_FORMAT_X8_D24_UNORM_PACK32
324 | VK_FORMAT_BC1_RGB_UNORM_BLOCK
325 | VK_FORMAT_BC1_RGBA_UNORM_BLOCK
326 | VK_FORMAT_BC2_UNORM_BLOCK
327 | VK_FORMAT_BC3_UNORM_BLOCK
328 | VK_FORMAT_BC4_UNORM_BLOCK
329 | VK_FORMAT_BC5_UNORM_BLOCK
330 | VK_FORMAT_BC7_UNORM_BLOCK
331 | VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK
332 | VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK
333 | VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK
334 | VK_FORMAT_EAC_R11_UNORM_BLOCK
335 | VK_FORMAT_EAC_R11G11_UNORM_BLOCK
336 | VK_FORMAT_ASTC_4x4_UNORM_BLOCK
337 | VK_FORMAT_ASTC_5x4_UNORM_BLOCK
338 | VK_FORMAT_ASTC_5x5_UNORM_BLOCK
339 | VK_FORMAT_ASTC_6x5_UNORM_BLOCK
340 | VK_FORMAT_ASTC_6x6_UNORM_BLOCK
341 | VK_FORMAT_ASTC_8x5_UNORM_BLOCK
342 | VK_FORMAT_ASTC_8x6_UNORM_BLOCK
343 | VK_FORMAT_ASTC_8x8_UNORM_BLOCK
344 | VK_FORMAT_ASTC_10x5_UNORM_BLOCK
345 | VK_FORMAT_ASTC_10x6_UNORM_BLOCK
346 | VK_FORMAT_ASTC_10x8_UNORM_BLOCK
347 | VK_FORMAT_ASTC_10x10_UNORM_BLOCK
348 | VK_FORMAT_ASTC_12x10_UNORM_BLOCK
349 | VK_FORMAT_ASTC_12x12_UNORM_BLOCK => ElementType::UNORM,
350 #[cfg(feature = "VK_IMG_format_pvrtc")]
351 VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG
352 | VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG
353 | VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG
354 | VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG => ElementType::UNORM,
355 VK_FORMAT_R8_SNORM
356 | VK_FORMAT_R8G8_SNORM
357 | VK_FORMAT_R8G8B8_SNORM
358 | VK_FORMAT_B8G8R8_SNORM
359 | VK_FORMAT_R8G8B8A8_SNORM
360 | VK_FORMAT_B8G8R8A8_SNORM
361 | VK_FORMAT_A8B8G8R8_SNORM_PACK32
362 | VK_FORMAT_A2R10G10B10_SNORM_PACK32
363 | VK_FORMAT_A2B10G10R10_SNORM_PACK32
364 | VK_FORMAT_R16_SNORM
365 | VK_FORMAT_R16G16_SNORM
366 | VK_FORMAT_R16G16B16_SNORM
367 | VK_FORMAT_R16G16B16A16_SNORM
368 | VK_FORMAT_BC4_SNORM_BLOCK
369 | VK_FORMAT_BC5_SNORM_BLOCK
370 | VK_FORMAT_EAC_R11_SNORM_BLOCK
371 | VK_FORMAT_EAC_R11G11_SNORM_BLOCK => ElementType::SNORM,
372 VK_FORMAT_R8_USCALED
373 | VK_FORMAT_R8G8_USCALED
374 | VK_FORMAT_R8G8B8_USCALED
375 | VK_FORMAT_B8G8R8_USCALED
376 | VK_FORMAT_R8G8B8A8_USCALED
377 | VK_FORMAT_B8G8R8A8_USCALED
378 | VK_FORMAT_A8B8G8R8_USCALED_PACK32
379 | VK_FORMAT_A2R10G10B10_USCALED_PACK32
380 | VK_FORMAT_A2B10G10R10_USCALED_PACK32
381 | VK_FORMAT_R16_USCALED
382 | VK_FORMAT_R16G16_USCALED
383 | VK_FORMAT_R16G16B16_USCALED
384 | VK_FORMAT_R16G16B16A16_USCALED => ElementType::USCALED,
385 VK_FORMAT_R8_SSCALED
386 | VK_FORMAT_R8G8_SSCALED
387 | VK_FORMAT_R8G8B8_SSCALED
388 | VK_FORMAT_B8G8R8_SSCALED
389 | VK_FORMAT_R8G8B8A8_SSCALED
390 | VK_FORMAT_B8G8R8A8_SSCALED
391 | VK_FORMAT_A8B8G8R8_SSCALED_PACK32
392 | VK_FORMAT_A2R10G10B10_SSCALED_PACK32
393 | VK_FORMAT_A2B10G10R10_SSCALED_PACK32
394 | VK_FORMAT_R16_SSCALED
395 | VK_FORMAT_R16G16_SSCALED
396 | VK_FORMAT_R16G16B16_SSCALED
397 | VK_FORMAT_R16G16B16A16_SSCALED => ElementType::SSCALED,
398 VK_FORMAT_R8_UINT
399 | VK_FORMAT_R8G8_UINT
400 | VK_FORMAT_R8G8B8_UINT
401 | VK_FORMAT_B8G8R8_UINT
402 | VK_FORMAT_R8G8B8A8_UINT
403 | VK_FORMAT_B8G8R8A8_UINT
404 | VK_FORMAT_A8B8G8R8_UINT_PACK32
405 | VK_FORMAT_A2R10G10B10_UINT_PACK32
406 | VK_FORMAT_A2B10G10R10_UINT_PACK32
407 | VK_FORMAT_R16_UINT
408 | VK_FORMAT_R16G16_UINT
409 | VK_FORMAT_R16G16B16_UINT
410 | VK_FORMAT_R16G16B16A16_UINT
411 | VK_FORMAT_R32_UINT
412 | VK_FORMAT_R32G32_UINT
413 | VK_FORMAT_R32G32B32_UINT
414 | VK_FORMAT_R32G32B32A32_UINT
415 | VK_FORMAT_R64_UINT
416 | VK_FORMAT_R64G64_UINT
417 | VK_FORMAT_R64G64B64_UINT
418 | VK_FORMAT_R64G64B64A64_UINT
419 | VK_FORMAT_S8_UINT => ElementType::UINT,
420 VK_FORMAT_R8_SINT
421 | VK_FORMAT_R8G8_SINT
422 | VK_FORMAT_R8G8B8_SINT
423 | VK_FORMAT_B8G8R8_SINT
424 | VK_FORMAT_R8G8B8A8_SINT
425 | VK_FORMAT_B8G8R8A8_SINT
426 | VK_FORMAT_A8B8G8R8_SINT_PACK32
427 | VK_FORMAT_A2R10G10B10_SINT_PACK32
428 | VK_FORMAT_A2B10G10R10_SINT_PACK32
429 | VK_FORMAT_R16_SINT
430 | VK_FORMAT_R16G16_SINT
431 | VK_FORMAT_R16G16B16_SINT
432 | VK_FORMAT_R16G16B16A16_SINT
433 | VK_FORMAT_R32_SINT
434 | VK_FORMAT_R32G32_SINT
435 | VK_FORMAT_R32G32B32_SINT
436 | VK_FORMAT_R32G32B32A32_SINT
437 | VK_FORMAT_R64_SINT
438 | VK_FORMAT_R64G64_SINT
439 | VK_FORMAT_R64G64B64_SINT
440 | VK_FORMAT_R64G64B64A64_SINT => ElementType::SINT,
441 VK_FORMAT_R8_SRGB
442 | VK_FORMAT_R8G8_SRGB
443 | VK_FORMAT_R8G8B8_SRGB
444 | VK_FORMAT_B8G8R8_SRGB
445 | VK_FORMAT_R8G8B8A8_SRGB
446 | VK_FORMAT_B8G8R8A8_SRGB
447 | VK_FORMAT_A8B8G8R8_SRGB_PACK32
448 | VK_FORMAT_BC1_RGB_SRGB_BLOCK
449 | VK_FORMAT_BC1_RGBA_SRGB_BLOCK
450 | VK_FORMAT_BC2_SRGB_BLOCK
451 | VK_FORMAT_BC3_SRGB_BLOCK
452 | VK_FORMAT_BC7_SRGB_BLOCK
453 | VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK
454 | VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK
455 | VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK
456 | VK_FORMAT_ASTC_4x4_SRGB_BLOCK
457 | VK_FORMAT_ASTC_5x4_SRGB_BLOCK
458 | VK_FORMAT_ASTC_5x5_SRGB_BLOCK
459 | VK_FORMAT_ASTC_6x5_SRGB_BLOCK
460 | VK_FORMAT_ASTC_6x6_SRGB_BLOCK
461 | VK_FORMAT_ASTC_8x5_SRGB_BLOCK
462 | VK_FORMAT_ASTC_8x6_SRGB_BLOCK
463 | VK_FORMAT_ASTC_8x8_SRGB_BLOCK
464 | VK_FORMAT_ASTC_10x5_SRGB_BLOCK
465 | VK_FORMAT_ASTC_10x6_SRGB_BLOCK
466 | VK_FORMAT_ASTC_10x8_SRGB_BLOCK
467 | VK_FORMAT_ASTC_10x10_SRGB_BLOCK
468 | VK_FORMAT_ASTC_12x10_SRGB_BLOCK
469 | VK_FORMAT_ASTC_12x12_SRGB_BLOCK => ElementType::SRGB,
470 #[cfg(feature = "VK_IMG_format_pvrtc")]
471 VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG
472 | VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG
473 | VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG
474 | VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG => ElementType::SRGB,
475 VK_FORMAT_R16_SFLOAT
476 | VK_FORMAT_R16G16_SFLOAT
477 | VK_FORMAT_R16G16B16_SFLOAT
478 | VK_FORMAT_R16G16B16A16_SFLOAT
479 | VK_FORMAT_R32_SFLOAT
480 | VK_FORMAT_R32G32_SFLOAT
481 | VK_FORMAT_R32G32B32_SFLOAT
482 | VK_FORMAT_R32G32B32A32_SFLOAT
483 | VK_FORMAT_R64_SFLOAT
484 | VK_FORMAT_R64G64_SFLOAT
485 | VK_FORMAT_R64G64B64_SFLOAT
486 | VK_FORMAT_R64G64B64A64_SFLOAT
487 | VK_FORMAT_D32_SFLOAT
488 | VK_FORMAT_BC6H_SFLOAT_BLOCK => ElementType::SFLOAT,
489 VK_FORMAT_B10G11R11_UFLOAT_PACK32 | VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 | VK_FORMAT_BC6H_UFLOAT_BLOCK => {
490 ElementType::UFLOAT
491 }
492 _ => ElementType::Compound,
493 }
494 }
495}
496
497#[derive(Clone, Copy, PartialEq, Eq)]
499pub struct FormatQuery(pub VkFormat);
500impl FormatQuery {
501 pub fn eq_bit_width(self, w: usize) -> Self {
502 if self.0.bit_width() == w {
503 self
504 } else {
505 FormatQuery(VK_FORMAT_UNDEFINED)
506 }
507 }
508 pub fn has_components(self, c: FormatComponents) -> Self {
509 if c.satisfy(self.0) {
510 self
511 } else {
512 FormatQuery(VK_FORMAT_UNDEFINED)
513 }
514 }
515 pub fn is_component_of(self, c: FormatComponents) -> Self {
516 if c.satisfy_eq(self.0) {
517 self
518 } else {
519 FormatQuery(VK_FORMAT_UNDEFINED)
520 }
521 }
522 pub fn has_element_of(self, e: ElementType) -> Self {
523 if self.0.element_type() == e {
524 self
525 } else {
526 FormatQuery(VK_FORMAT_UNDEFINED)
527 }
528 }
529 pub const fn passed(self) -> bool {
530 self.0 != VK_FORMAT_UNDEFINED
531 }
532
533 pub const fn srgb(self) -> Option<VkFormat> {
535 match self.0 {
536 VK_FORMAT_R8_UNORM => Some(VK_FORMAT_R8_SRGB),
537 VK_FORMAT_R8G8_UNORM => Some(VK_FORMAT_R8G8_SRGB),
538 VK_FORMAT_R8G8B8_UNORM => Some(VK_FORMAT_R8G8B8_SRGB),
539 VK_FORMAT_B8G8R8_UNORM => Some(VK_FORMAT_B8G8R8_SRGB),
540 VK_FORMAT_R8G8B8A8_UNORM => Some(VK_FORMAT_R8G8B8A8_SRGB),
541 VK_FORMAT_B8G8R8A8_UNORM => Some(VK_FORMAT_B8G8R8A8_SRGB),
542 VK_FORMAT_A8B8G8R8_UNORM_PACK32 => Some(VK_FORMAT_A8B8G8R8_SRGB_PACK32),
543 _ => None,
544 }
545 }
546 pub const fn unorm(self) -> Option<VkFormat> {
548 match self.0 {
549 VK_FORMAT_R8_SRGB | VK_FORMAT_R8_UNORM => Some(VK_FORMAT_R8_UNORM),
550 VK_FORMAT_R8G8_SRGB | VK_FORMAT_R8G8_UNORM => Some(VK_FORMAT_R8G8_UNORM),
551 VK_FORMAT_R8G8B8_SRGB | VK_FORMAT_R8G8B8_UNORM => Some(VK_FORMAT_R8G8B8_UNORM),
552 VK_FORMAT_B8G8R8_SRGB | VK_FORMAT_B8G8R8_UNORM => Some(VK_FORMAT_B8G8R8_UNORM),
553 VK_FORMAT_R8G8B8A8_SRGB | VK_FORMAT_R8G8B8A8_UNORM => Some(VK_FORMAT_R8G8B8A8_UNORM),
554 VK_FORMAT_B8G8R8A8_SRGB | VK_FORMAT_B8G8R8A8_UNORM => Some(VK_FORMAT_B8G8R8A8_UNORM),
555 VK_FORMAT_A8B8G8R8_SRGB_PACK32 | VK_FORMAT_A8B8G8R8_UNORM_PACK32 => Some(VK_FORMAT_A8B8G8R8_UNORM_PACK32),
556 _ => None,
557 }
558 }
559}
560#[derive(Clone)]
562pub struct FormatQueryPred {
563 bit_width: Option<usize>,
564 req_components: Option<FormatComponents>,
565 req_elements_of: Option<ElementType>,
566}
567impl Default for FormatQueryPred {
569 fn default() -> Self {
570 FormatQueryPred {
571 bit_width: None,
572 req_components: None,
573 req_elements_of: None,
574 }
575 }
576}
577impl FormatQueryPred {
578 pub fn bit(&mut self, b: usize) -> &mut Self {
579 self.bit_width = Some(b);
580 self
581 }
582 pub fn components(&mut self, c: FormatComponents) -> &mut Self {
583 self.req_components = Some(c);
584 self
585 }
586 pub fn elements(&mut self, e: ElementType) -> &mut Self {
587 self.req_elements_of = Some(e);
588 self
589 }
590
591 pub fn satisfy(&self, f: VkFormat) -> bool {
592 self.bit_width.map_or(true, |b| f.bit_width() == b)
593 && self.req_components.map_or(true, |c| c.satisfy(f))
594 && self.req_elements_of.map_or(true, |e| f.element_type() == e)
595 }
596}
597
598#[derive(Clone, Copy, PartialEq, Eq)]
600pub enum FormatComponents {
601 Undefined,
602 R,
603 RG,
604 RGB,
605 RGBA,
606 EBGR,
607 D,
608 S,
609 DS,
610 Compressed,
611}
612#[derive(Clone, Copy, PartialEq, Eq)]
614pub enum ElementType {
615 Undefined,
616 UNORM,
617 SNORM,
618 UINT,
619 SINT,
620 SFLOAT,
621 UFLOAT,
622 SRGB,
623 USCALED,
624 SSCALED,
625 Compound,
626}
627
628impl FormatComponents {
629 pub fn has(self, o: Self) -> bool {
630 use self::FormatComponents::*;
631 match self {
632 R => o == R || o == RG || o == RGB || o == RGBA,
633 RG => o == RG || o == RGB || o == RGBA,
634 RGB => o == RGB || o == RGBA,
635 D => o == D || o == DS,
636 S => o == S || o == DS,
637 t => t == o,
638 }
639 }
640
641 pub fn satisfy(self, f: VkFormat) -> bool {
642 self.has(f.components())
643 }
644
645 pub fn satisfy_eq(self, f: VkFormat) -> bool {
646 f.components() == self
647 }
648}