bedrock/
fmt.rs

1//! Format Helpers
2
3use crate::vk::*;
4
5/// Provides commonly used corresponding VkFormat for types
6pub trait AsFormat {
7    /// commonly used VkFormat for this type
8    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
36/// For testing format traits
37pub 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/// Arbitrary queries of Format
498#[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    /// convert UNORM to SRGB if exists
534    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    /// convert to UNORM if exists
547    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/// Predication style of Format Selection Query
561#[derive(Clone)]
562pub struct FormatQueryPred {
563    bit_width: Option<usize>,
564    req_components: Option<FormatComponents>,
565    req_elements_of: Option<ElementType>,
566}
567/// Empty data
568impl 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/// Containing Components in Format(Order is not considered)
599#[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/// Containing component element in format
613#[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}