• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // GENERATED FILE - DO NOT EDIT.
2 // Generated by gen_vk_format_table.py using data from vk_format_map.json
3 //
4 // Copyright 2020 The ANGLE Project Authors. All rights reserved.
5 // Use of this source code is governed by a BSD-style license that can be
6 // found in the LICENSE file.
7 //
8 // vk_format_table_autogen.cpp:
9 //   Queries for full Vulkan format information based on GL format.
10 
11 #include "libANGLE/renderer/vulkan/vk_format_utils.h"
12 
13 #include "image_util/copyimage.h"
14 #include "image_util/generatemip.h"
15 #include "image_util/loadimage.h"
16 
17 using namespace angle;
18 
19 namespace rx
20 {
21 
22 namespace vk
23 {
24 
initialize(RendererVk * renderer,const angle::Format & angleFormat)25 void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
26 {
27     switch (angleFormat.id)
28     {
29         case angle::FormatID::A16_FLOAT:
30             internalFormat           = GL_ALPHA16F_EXT;
31             actualImageFormatID      = angle::FormatID::R16_FLOAT;
32             vkImageFormat            = VK_FORMAT_R16_SFLOAT;
33             imageInitializerFunction = nullptr;
34 
35             break;
36 
37         case angle::FormatID::A1R5G5B5_UNORM:
38             internalFormat               = GL_A1RGB5_ANGLEX;
39             actualImageFormatID          = angle::FormatID::A1R5G5B5_UNORM;
40             vkImageFormat                = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
41             imageInitializerFunction     = nullptr;
42             actualBufferFormatID         = angle::FormatID::A1R5G5B5_UNORM;
43             vkBufferFormat               = VK_FORMAT_A1R5G5B5_UNORM_PACK16;
44             vkBufferFormatIsPacked       = true;
45             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
46             vertexLoadRequiresConversion = false;
47             break;
48 
49         case angle::FormatID::A2R10G10B10_SINT_VERTEX:
50             internalFormat               = GL_INT_10_10_10_2_OES;
51             actualImageFormatID          = angle::FormatID::NONE;
52             vkImageFormat                = VK_FORMAT_UNDEFINED;
53             imageInitializerFunction     = nullptr;
54             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
55             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
56             vkBufferFormatIsPacked       = false;
57             vertexLoadFunction           = CopyW2XYZ10ToXYZW32FVertexData<true, false>;
58             vertexLoadRequiresConversion = true;
59             break;
60 
61         case angle::FormatID::A2R10G10B10_SNORM_VERTEX:
62             internalFormat               = GL_A2_RGB10_SNORM_ANGLEX;
63             actualImageFormatID          = angle::FormatID::NONE;
64             vkImageFormat                = VK_FORMAT_UNDEFINED;
65             imageInitializerFunction     = nullptr;
66             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
67             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
68             vkBufferFormatIsPacked       = false;
69             vertexLoadFunction           = CopyW2XYZ10ToXYZW32FVertexData<true, true>;
70             vertexLoadRequiresConversion = true;
71             break;
72 
73         case angle::FormatID::A2R10G10B10_SSCALED_VERTEX:
74             internalFormat               = GL_A2_RGB10_SSCALED_ANGLEX;
75             actualImageFormatID          = angle::FormatID::NONE;
76             vkImageFormat                = VK_FORMAT_UNDEFINED;
77             imageInitializerFunction     = nullptr;
78             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
79             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
80             vkBufferFormatIsPacked       = false;
81             vertexLoadFunction           = CopyW2XYZ10ToXYZW32FVertexData<true, false>;
82             vertexLoadRequiresConversion = true;
83             break;
84 
85         case angle::FormatID::A2R10G10B10_UINT_VERTEX:
86             internalFormat               = GL_UNSIGNED_INT_10_10_10_2_OES;
87             actualImageFormatID          = angle::FormatID::NONE;
88             vkImageFormat                = VK_FORMAT_UNDEFINED;
89             imageInitializerFunction     = nullptr;
90             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
91             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
92             vkBufferFormatIsPacked       = false;
93             vertexLoadFunction           = CopyW2XYZ10ToXYZW32FVertexData<false, false>;
94             vertexLoadRequiresConversion = true;
95             break;
96 
97         case angle::FormatID::A2R10G10B10_UNORM_VERTEX:
98             internalFormat               = GL_A2_RGB10_UNORM_ANGLEX;
99             actualImageFormatID          = angle::FormatID::NONE;
100             vkImageFormat                = VK_FORMAT_UNDEFINED;
101             imageInitializerFunction     = nullptr;
102             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
103             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
104             vkBufferFormatIsPacked       = false;
105             vertexLoadFunction           = CopyW2XYZ10ToXYZW32FVertexData<false, true>;
106             vertexLoadRequiresConversion = true;
107             break;
108 
109         case angle::FormatID::A2R10G10B10_USCALED_VERTEX:
110             internalFormat               = GL_A2_RGB10_USCALED_ANGLEX;
111             actualImageFormatID          = angle::FormatID::NONE;
112             vkImageFormat                = VK_FORMAT_UNDEFINED;
113             imageInitializerFunction     = nullptr;
114             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
115             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
116             vkBufferFormatIsPacked       = false;
117             vertexLoadFunction           = CopyW2XYZ10ToXYZW32FVertexData<false, false>;
118             vertexLoadRequiresConversion = true;
119             break;
120 
121         case angle::FormatID::A32_FLOAT:
122             internalFormat           = GL_ALPHA32F_EXT;
123             actualImageFormatID      = angle::FormatID::R32_FLOAT;
124             vkImageFormat            = VK_FORMAT_R32_SFLOAT;
125             imageInitializerFunction = nullptr;
126 
127             break;
128 
129         case angle::FormatID::A8_UNORM:
130             internalFormat           = GL_ALPHA8_EXT;
131             actualImageFormatID      = angle::FormatID::R8_UNORM;
132             vkImageFormat            = VK_FORMAT_R8_UNORM;
133             imageInitializerFunction = nullptr;
134 
135             break;
136 
137         case angle::FormatID::ASTC_10x10_SRGB_BLOCK:
138             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR;
139             actualImageFormatID          = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
140             vkImageFormat                = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
141             imageInitializerFunction     = nullptr;
142             actualBufferFormatID         = angle::FormatID::ASTC_10x10_SRGB_BLOCK;
143             vkBufferFormat               = VK_FORMAT_ASTC_10x10_SRGB_BLOCK;
144             vkBufferFormatIsPacked       = false;
145             vertexLoadFunction           = nullptr;
146             vertexLoadRequiresConversion = false;
147             break;
148 
149         case angle::FormatID::ASTC_10x10_UNORM_BLOCK:
150             internalFormat               = GL_COMPRESSED_RGBA_ASTC_10x10_KHR;
151             actualImageFormatID          = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
152             vkImageFormat                = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
153             imageInitializerFunction     = nullptr;
154             actualBufferFormatID         = angle::FormatID::ASTC_10x10_UNORM_BLOCK;
155             vkBufferFormat               = VK_FORMAT_ASTC_10x10_UNORM_BLOCK;
156             vkBufferFormatIsPacked       = false;
157             vertexLoadFunction           = nullptr;
158             vertexLoadRequiresConversion = false;
159             break;
160 
161         case angle::FormatID::ASTC_10x5_SRGB_BLOCK:
162             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR;
163             actualImageFormatID          = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
164             vkImageFormat                = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
165             imageInitializerFunction     = nullptr;
166             actualBufferFormatID         = angle::FormatID::ASTC_10x5_SRGB_BLOCK;
167             vkBufferFormat               = VK_FORMAT_ASTC_10x5_SRGB_BLOCK;
168             vkBufferFormatIsPacked       = false;
169             vertexLoadFunction           = nullptr;
170             vertexLoadRequiresConversion = false;
171             break;
172 
173         case angle::FormatID::ASTC_10x5_UNORM_BLOCK:
174             internalFormat               = GL_COMPRESSED_RGBA_ASTC_10x5_KHR;
175             actualImageFormatID          = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
176             vkImageFormat                = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
177             imageInitializerFunction     = nullptr;
178             actualBufferFormatID         = angle::FormatID::ASTC_10x5_UNORM_BLOCK;
179             vkBufferFormat               = VK_FORMAT_ASTC_10x5_UNORM_BLOCK;
180             vkBufferFormatIsPacked       = false;
181             vertexLoadFunction           = nullptr;
182             vertexLoadRequiresConversion = false;
183             break;
184 
185         case angle::FormatID::ASTC_10x6_SRGB_BLOCK:
186             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR;
187             actualImageFormatID          = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
188             vkImageFormat                = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
189             imageInitializerFunction     = nullptr;
190             actualBufferFormatID         = angle::FormatID::ASTC_10x6_SRGB_BLOCK;
191             vkBufferFormat               = VK_FORMAT_ASTC_10x6_SRGB_BLOCK;
192             vkBufferFormatIsPacked       = false;
193             vertexLoadFunction           = nullptr;
194             vertexLoadRequiresConversion = false;
195             break;
196 
197         case angle::FormatID::ASTC_10x6_UNORM_BLOCK:
198             internalFormat               = GL_COMPRESSED_RGBA_ASTC_10x6_KHR;
199             actualImageFormatID          = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
200             vkImageFormat                = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
201             imageInitializerFunction     = nullptr;
202             actualBufferFormatID         = angle::FormatID::ASTC_10x6_UNORM_BLOCK;
203             vkBufferFormat               = VK_FORMAT_ASTC_10x6_UNORM_BLOCK;
204             vkBufferFormatIsPacked       = false;
205             vertexLoadFunction           = nullptr;
206             vertexLoadRequiresConversion = false;
207             break;
208 
209         case angle::FormatID::ASTC_10x8_SRGB_BLOCK:
210             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR;
211             actualImageFormatID          = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
212             vkImageFormat                = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
213             imageInitializerFunction     = nullptr;
214             actualBufferFormatID         = angle::FormatID::ASTC_10x8_SRGB_BLOCK;
215             vkBufferFormat               = VK_FORMAT_ASTC_10x8_SRGB_BLOCK;
216             vkBufferFormatIsPacked       = false;
217             vertexLoadFunction           = nullptr;
218             vertexLoadRequiresConversion = false;
219             break;
220 
221         case angle::FormatID::ASTC_10x8_UNORM_BLOCK:
222             internalFormat               = GL_COMPRESSED_RGBA_ASTC_10x8_KHR;
223             actualImageFormatID          = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
224             vkImageFormat                = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
225             imageInitializerFunction     = nullptr;
226             actualBufferFormatID         = angle::FormatID::ASTC_10x8_UNORM_BLOCK;
227             vkBufferFormat               = VK_FORMAT_ASTC_10x8_UNORM_BLOCK;
228             vkBufferFormatIsPacked       = false;
229             vertexLoadFunction           = nullptr;
230             vertexLoadRequiresConversion = false;
231             break;
232 
233         case angle::FormatID::ASTC_12x10_SRGB_BLOCK:
234             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR;
235             actualImageFormatID          = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
236             vkImageFormat                = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
237             imageInitializerFunction     = nullptr;
238             actualBufferFormatID         = angle::FormatID::ASTC_12x10_SRGB_BLOCK;
239             vkBufferFormat               = VK_FORMAT_ASTC_12x10_SRGB_BLOCK;
240             vkBufferFormatIsPacked       = false;
241             vertexLoadFunction           = nullptr;
242             vertexLoadRequiresConversion = false;
243             break;
244 
245         case angle::FormatID::ASTC_12x10_UNORM_BLOCK:
246             internalFormat               = GL_COMPRESSED_RGBA_ASTC_12x10_KHR;
247             actualImageFormatID          = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
248             vkImageFormat                = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
249             imageInitializerFunction     = nullptr;
250             actualBufferFormatID         = angle::FormatID::ASTC_12x10_UNORM_BLOCK;
251             vkBufferFormat               = VK_FORMAT_ASTC_12x10_UNORM_BLOCK;
252             vkBufferFormatIsPacked       = false;
253             vertexLoadFunction           = nullptr;
254             vertexLoadRequiresConversion = false;
255             break;
256 
257         case angle::FormatID::ASTC_12x12_SRGB_BLOCK:
258             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR;
259             actualImageFormatID          = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
260             vkImageFormat                = VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
261             imageInitializerFunction     = nullptr;
262             actualBufferFormatID         = angle::FormatID::ASTC_12x12_SRGB_BLOCK;
263             vkBufferFormat               = VK_FORMAT_ASTC_12x12_SRGB_BLOCK;
264             vkBufferFormatIsPacked       = false;
265             vertexLoadFunction           = nullptr;
266             vertexLoadRequiresConversion = false;
267             break;
268 
269         case angle::FormatID::ASTC_12x12_UNORM_BLOCK:
270             internalFormat               = GL_COMPRESSED_RGBA_ASTC_12x12_KHR;
271             actualImageFormatID          = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
272             vkImageFormat                = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
273             imageInitializerFunction     = nullptr;
274             actualBufferFormatID         = angle::FormatID::ASTC_12x12_UNORM_BLOCK;
275             vkBufferFormat               = VK_FORMAT_ASTC_12x12_UNORM_BLOCK;
276             vkBufferFormatIsPacked       = false;
277             vertexLoadFunction           = nullptr;
278             vertexLoadRequiresConversion = false;
279             break;
280 
281         case angle::FormatID::ASTC_3x3x3_UNORM_BLOCK:
282             // This format is not implemented in Vulkan.
283             break;
284 
285         case angle::FormatID::ASTC_3x3x3_UNORM_SRGB_BLOCK:
286             // This format is not implemented in Vulkan.
287             break;
288 
289         case angle::FormatID::ASTC_4x3x3_UNORM_BLOCK:
290             // This format is not implemented in Vulkan.
291             break;
292 
293         case angle::FormatID::ASTC_4x3x3_UNORM_SRGB_BLOCK:
294             // This format is not implemented in Vulkan.
295             break;
296 
297         case angle::FormatID::ASTC_4x4_SRGB_BLOCK:
298             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR;
299             actualImageFormatID          = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
300             vkImageFormat                = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
301             imageInitializerFunction     = nullptr;
302             actualBufferFormatID         = angle::FormatID::ASTC_4x4_SRGB_BLOCK;
303             vkBufferFormat               = VK_FORMAT_ASTC_4x4_SRGB_BLOCK;
304             vkBufferFormatIsPacked       = false;
305             vertexLoadFunction           = nullptr;
306             vertexLoadRequiresConversion = false;
307             break;
308 
309         case angle::FormatID::ASTC_4x4_UNORM_BLOCK:
310             internalFormat               = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
311             actualImageFormatID          = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
312             vkImageFormat                = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
313             imageInitializerFunction     = nullptr;
314             actualBufferFormatID         = angle::FormatID::ASTC_4x4_UNORM_BLOCK;
315             vkBufferFormat               = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
316             vkBufferFormatIsPacked       = false;
317             vertexLoadFunction           = nullptr;
318             vertexLoadRequiresConversion = false;
319             break;
320 
321         case angle::FormatID::ASTC_4x4x3_UNORM_BLOCK:
322             // This format is not implemented in Vulkan.
323             break;
324 
325         case angle::FormatID::ASTC_4x4x3_UNORM_SRGB_BLOCK:
326             // This format is not implemented in Vulkan.
327             break;
328 
329         case angle::FormatID::ASTC_4x4x4_UNORM_BLOCK:
330             // This format is not implemented in Vulkan.
331             break;
332 
333         case angle::FormatID::ASTC_4x4x4_UNORM_SRGB_BLOCK:
334             // This format is not implemented in Vulkan.
335             break;
336 
337         case angle::FormatID::ASTC_5x4_SRGB_BLOCK:
338             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR;
339             actualImageFormatID          = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
340             vkImageFormat                = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
341             imageInitializerFunction     = nullptr;
342             actualBufferFormatID         = angle::FormatID::ASTC_5x4_SRGB_BLOCK;
343             vkBufferFormat               = VK_FORMAT_ASTC_5x4_SRGB_BLOCK;
344             vkBufferFormatIsPacked       = false;
345             vertexLoadFunction           = nullptr;
346             vertexLoadRequiresConversion = false;
347             break;
348 
349         case angle::FormatID::ASTC_5x4_UNORM_BLOCK:
350             internalFormat               = GL_COMPRESSED_RGBA_ASTC_5x4_KHR;
351             actualImageFormatID          = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
352             vkImageFormat                = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
353             imageInitializerFunction     = nullptr;
354             actualBufferFormatID         = angle::FormatID::ASTC_5x4_UNORM_BLOCK;
355             vkBufferFormat               = VK_FORMAT_ASTC_5x4_UNORM_BLOCK;
356             vkBufferFormatIsPacked       = false;
357             vertexLoadFunction           = nullptr;
358             vertexLoadRequiresConversion = false;
359             break;
360 
361         case angle::FormatID::ASTC_5x4x4_UNORM_BLOCK:
362             // This format is not implemented in Vulkan.
363             break;
364 
365         case angle::FormatID::ASTC_5x4x4_UNORM_SRGB_BLOCK:
366             // This format is not implemented in Vulkan.
367             break;
368 
369         case angle::FormatID::ASTC_5x5_SRGB_BLOCK:
370             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR;
371             actualImageFormatID          = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
372             vkImageFormat                = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
373             imageInitializerFunction     = nullptr;
374             actualBufferFormatID         = angle::FormatID::ASTC_5x5_SRGB_BLOCK;
375             vkBufferFormat               = VK_FORMAT_ASTC_5x5_SRGB_BLOCK;
376             vkBufferFormatIsPacked       = false;
377             vertexLoadFunction           = nullptr;
378             vertexLoadRequiresConversion = false;
379             break;
380 
381         case angle::FormatID::ASTC_5x5_UNORM_BLOCK:
382             internalFormat               = GL_COMPRESSED_RGBA_ASTC_5x5_KHR;
383             actualImageFormatID          = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
384             vkImageFormat                = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
385             imageInitializerFunction     = nullptr;
386             actualBufferFormatID         = angle::FormatID::ASTC_5x5_UNORM_BLOCK;
387             vkBufferFormat               = VK_FORMAT_ASTC_5x5_UNORM_BLOCK;
388             vkBufferFormatIsPacked       = false;
389             vertexLoadFunction           = nullptr;
390             vertexLoadRequiresConversion = false;
391             break;
392 
393         case angle::FormatID::ASTC_5x5x4_UNORM_BLOCK:
394             // This format is not implemented in Vulkan.
395             break;
396 
397         case angle::FormatID::ASTC_5x5x4_UNORM_SRGB_BLOCK:
398             // This format is not implemented in Vulkan.
399             break;
400 
401         case angle::FormatID::ASTC_5x5x5_UNORM_BLOCK:
402             // This format is not implemented in Vulkan.
403             break;
404 
405         case angle::FormatID::ASTC_5x5x5_UNORM_SRGB_BLOCK:
406             // This format is not implemented in Vulkan.
407             break;
408 
409         case angle::FormatID::ASTC_6x5_SRGB_BLOCK:
410             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR;
411             actualImageFormatID          = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
412             vkImageFormat                = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
413             imageInitializerFunction     = nullptr;
414             actualBufferFormatID         = angle::FormatID::ASTC_6x5_SRGB_BLOCK;
415             vkBufferFormat               = VK_FORMAT_ASTC_6x5_SRGB_BLOCK;
416             vkBufferFormatIsPacked       = false;
417             vertexLoadFunction           = nullptr;
418             vertexLoadRequiresConversion = false;
419             break;
420 
421         case angle::FormatID::ASTC_6x5_UNORM_BLOCK:
422             internalFormat               = GL_COMPRESSED_RGBA_ASTC_6x5_KHR;
423             actualImageFormatID          = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
424             vkImageFormat                = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
425             imageInitializerFunction     = nullptr;
426             actualBufferFormatID         = angle::FormatID::ASTC_6x5_UNORM_BLOCK;
427             vkBufferFormat               = VK_FORMAT_ASTC_6x5_UNORM_BLOCK;
428             vkBufferFormatIsPacked       = false;
429             vertexLoadFunction           = nullptr;
430             vertexLoadRequiresConversion = false;
431             break;
432 
433         case angle::FormatID::ASTC_6x5x5_UNORM_BLOCK:
434             // This format is not implemented in Vulkan.
435             break;
436 
437         case angle::FormatID::ASTC_6x5x5_UNORM_SRGB_BLOCK:
438             // This format is not implemented in Vulkan.
439             break;
440 
441         case angle::FormatID::ASTC_6x6_SRGB_BLOCK:
442             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR;
443             actualImageFormatID          = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
444             vkImageFormat                = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
445             imageInitializerFunction     = nullptr;
446             actualBufferFormatID         = angle::FormatID::ASTC_6x6_SRGB_BLOCK;
447             vkBufferFormat               = VK_FORMAT_ASTC_6x6_SRGB_BLOCK;
448             vkBufferFormatIsPacked       = false;
449             vertexLoadFunction           = nullptr;
450             vertexLoadRequiresConversion = false;
451             break;
452 
453         case angle::FormatID::ASTC_6x6_UNORM_BLOCK:
454             internalFormat               = GL_COMPRESSED_RGBA_ASTC_6x6_KHR;
455             actualImageFormatID          = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
456             vkImageFormat                = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
457             imageInitializerFunction     = nullptr;
458             actualBufferFormatID         = angle::FormatID::ASTC_6x6_UNORM_BLOCK;
459             vkBufferFormat               = VK_FORMAT_ASTC_6x6_UNORM_BLOCK;
460             vkBufferFormatIsPacked       = false;
461             vertexLoadFunction           = nullptr;
462             vertexLoadRequiresConversion = false;
463             break;
464 
465         case angle::FormatID::ASTC_6x6x5_UNORM_BLOCK:
466             // This format is not implemented in Vulkan.
467             break;
468 
469         case angle::FormatID::ASTC_6x6x5_UNORM_SRGB_BLOCK:
470             // This format is not implemented in Vulkan.
471             break;
472 
473         case angle::FormatID::ASTC_6x6x6_UNORM_BLOCK:
474             // This format is not implemented in Vulkan.
475             break;
476 
477         case angle::FormatID::ASTC_6x6x6_UNORM_SRGB_BLOCK:
478             // This format is not implemented in Vulkan.
479             break;
480 
481         case angle::FormatID::ASTC_8x5_SRGB_BLOCK:
482             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR;
483             actualImageFormatID          = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
484             vkImageFormat                = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
485             imageInitializerFunction     = nullptr;
486             actualBufferFormatID         = angle::FormatID::ASTC_8x5_SRGB_BLOCK;
487             vkBufferFormat               = VK_FORMAT_ASTC_8x5_SRGB_BLOCK;
488             vkBufferFormatIsPacked       = false;
489             vertexLoadFunction           = nullptr;
490             vertexLoadRequiresConversion = false;
491             break;
492 
493         case angle::FormatID::ASTC_8x5_UNORM_BLOCK:
494             internalFormat               = GL_COMPRESSED_RGBA_ASTC_8x5_KHR;
495             actualImageFormatID          = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
496             vkImageFormat                = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
497             imageInitializerFunction     = nullptr;
498             actualBufferFormatID         = angle::FormatID::ASTC_8x5_UNORM_BLOCK;
499             vkBufferFormat               = VK_FORMAT_ASTC_8x5_UNORM_BLOCK;
500             vkBufferFormatIsPacked       = false;
501             vertexLoadFunction           = nullptr;
502             vertexLoadRequiresConversion = false;
503             break;
504 
505         case angle::FormatID::ASTC_8x6_SRGB_BLOCK:
506             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR;
507             actualImageFormatID          = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
508             vkImageFormat                = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
509             imageInitializerFunction     = nullptr;
510             actualBufferFormatID         = angle::FormatID::ASTC_8x6_SRGB_BLOCK;
511             vkBufferFormat               = VK_FORMAT_ASTC_8x6_SRGB_BLOCK;
512             vkBufferFormatIsPacked       = false;
513             vertexLoadFunction           = nullptr;
514             vertexLoadRequiresConversion = false;
515             break;
516 
517         case angle::FormatID::ASTC_8x6_UNORM_BLOCK:
518             internalFormat               = GL_COMPRESSED_RGBA_ASTC_8x6_KHR;
519             actualImageFormatID          = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
520             vkImageFormat                = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
521             imageInitializerFunction     = nullptr;
522             actualBufferFormatID         = angle::FormatID::ASTC_8x6_UNORM_BLOCK;
523             vkBufferFormat               = VK_FORMAT_ASTC_8x6_UNORM_BLOCK;
524             vkBufferFormatIsPacked       = false;
525             vertexLoadFunction           = nullptr;
526             vertexLoadRequiresConversion = false;
527             break;
528 
529         case angle::FormatID::ASTC_8x8_SRGB_BLOCK:
530             internalFormat               = GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR;
531             actualImageFormatID          = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
532             vkImageFormat                = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
533             imageInitializerFunction     = nullptr;
534             actualBufferFormatID         = angle::FormatID::ASTC_8x8_SRGB_BLOCK;
535             vkBufferFormat               = VK_FORMAT_ASTC_8x8_SRGB_BLOCK;
536             vkBufferFormatIsPacked       = false;
537             vertexLoadFunction           = nullptr;
538             vertexLoadRequiresConversion = false;
539             break;
540 
541         case angle::FormatID::ASTC_8x8_UNORM_BLOCK:
542             internalFormat               = GL_COMPRESSED_RGBA_ASTC_8x8_KHR;
543             actualImageFormatID          = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
544             vkImageFormat                = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
545             imageInitializerFunction     = nullptr;
546             actualBufferFormatID         = angle::FormatID::ASTC_8x8_UNORM_BLOCK;
547             vkBufferFormat               = VK_FORMAT_ASTC_8x8_UNORM_BLOCK;
548             vkBufferFormatIsPacked       = false;
549             vertexLoadFunction           = nullptr;
550             vertexLoadRequiresConversion = false;
551             break;
552 
553         case angle::FormatID::B4G4R4A4_UNORM:
554             internalFormat               = GL_BGRA4_ANGLEX;
555             actualImageFormatID          = angle::FormatID::B4G4R4A4_UNORM;
556             vkImageFormat                = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
557             imageInitializerFunction     = nullptr;
558             actualBufferFormatID         = angle::FormatID::B4G4R4A4_UNORM;
559             vkBufferFormat               = VK_FORMAT_B4G4R4A4_UNORM_PACK16;
560             vkBufferFormatIsPacked       = true;
561             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
562             vertexLoadRequiresConversion = false;
563             break;
564 
565         case angle::FormatID::B5G5R5A1_UNORM:
566             internalFormat               = GL_BGR5_A1_ANGLEX;
567             actualImageFormatID          = angle::FormatID::B5G5R5A1_UNORM;
568             vkImageFormat                = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
569             imageInitializerFunction     = nullptr;
570             actualBufferFormatID         = angle::FormatID::B5G5R5A1_UNORM;
571             vkBufferFormat               = VK_FORMAT_B5G5R5A1_UNORM_PACK16;
572             vkBufferFormatIsPacked       = true;
573             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
574             vertexLoadRequiresConversion = false;
575             break;
576 
577         case angle::FormatID::B5G6R5_UNORM:
578             internalFormat               = GL_BGR565_ANGLEX;
579             actualImageFormatID          = angle::FormatID::B5G6R5_UNORM;
580             vkImageFormat                = VK_FORMAT_B5G6R5_UNORM_PACK16;
581             imageInitializerFunction     = nullptr;
582             actualBufferFormatID         = angle::FormatID::B5G6R5_UNORM;
583             vkBufferFormat               = VK_FORMAT_B5G6R5_UNORM_PACK16;
584             vkBufferFormatIsPacked       = true;
585             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
586             vertexLoadRequiresConversion = false;
587             break;
588 
589         case angle::FormatID::B8G8R8A8_TYPELESS:
590             // This format is not implemented in Vulkan.
591             break;
592 
593         case angle::FormatID::B8G8R8A8_TYPELESS_SRGB:
594             // This format is not implemented in Vulkan.
595             break;
596 
597         case angle::FormatID::B8G8R8A8_UNORM:
598             internalFormat               = GL_BGRA8_EXT;
599             actualImageFormatID          = angle::FormatID::B8G8R8A8_UNORM;
600             vkImageFormat                = VK_FORMAT_B8G8R8A8_UNORM;
601             imageInitializerFunction     = nullptr;
602             actualBufferFormatID         = angle::FormatID::B8G8R8A8_UNORM;
603             vkBufferFormat               = VK_FORMAT_B8G8R8A8_UNORM;
604             vkBufferFormatIsPacked       = false;
605             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
606             vertexLoadRequiresConversion = false;
607             break;
608 
609         case angle::FormatID::B8G8R8A8_UNORM_SRGB:
610             internalFormat               = GL_BGRA8_SRGB_ANGLEX;
611             actualImageFormatID          = angle::FormatID::B8G8R8A8_UNORM_SRGB;
612             vkImageFormat                = VK_FORMAT_B8G8R8A8_SRGB;
613             imageInitializerFunction     = nullptr;
614             actualBufferFormatID         = angle::FormatID::B8G8R8A8_UNORM_SRGB;
615             vkBufferFormat               = VK_FORMAT_B8G8R8A8_SRGB;
616             vkBufferFormatIsPacked       = false;
617             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
618             vertexLoadRequiresConversion = false;
619             break;
620 
621         case angle::FormatID::B8G8R8X8_UNORM:
622             internalFormat               = GL_BGRX8_ANGLEX;
623             actualImageFormatID          = angle::FormatID::B8G8R8A8_UNORM;
624             vkImageFormat                = VK_FORMAT_B8G8R8A8_UNORM;
625             imageInitializerFunction     = nullptr;
626             actualBufferFormatID         = angle::FormatID::NONE;
627             vkBufferFormat               = VK_FORMAT_UNDEFINED;
628             vkBufferFormatIsPacked       = false;
629             vertexLoadFunction           = nullptr;
630             vertexLoadRequiresConversion = true;
631             break;
632 
633         case angle::FormatID::BC1_RGBA_UNORM_BLOCK:
634             internalFormat               = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
635             actualImageFormatID          = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
636             vkImageFormat                = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
637             imageInitializerFunction     = nullptr;
638             actualBufferFormatID         = angle::FormatID::BC1_RGBA_UNORM_BLOCK;
639             vkBufferFormat               = VK_FORMAT_BC1_RGBA_UNORM_BLOCK;
640             vkBufferFormatIsPacked       = false;
641             vertexLoadFunction           = nullptr;
642             vertexLoadRequiresConversion = false;
643             break;
644 
645         case angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK:
646             internalFormat               = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
647             actualImageFormatID          = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
648             vkImageFormat                = VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
649             imageInitializerFunction     = nullptr;
650             actualBufferFormatID         = angle::FormatID::BC1_RGBA_UNORM_SRGB_BLOCK;
651             vkBufferFormat               = VK_FORMAT_BC1_RGBA_SRGB_BLOCK;
652             vkBufferFormatIsPacked       = false;
653             vertexLoadFunction           = nullptr;
654             vertexLoadRequiresConversion = false;
655             break;
656 
657         case angle::FormatID::BC1_RGB_UNORM_BLOCK:
658             internalFormat               = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
659             actualImageFormatID          = angle::FormatID::BC1_RGB_UNORM_BLOCK;
660             vkImageFormat                = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
661             imageInitializerFunction     = nullptr;
662             actualBufferFormatID         = angle::FormatID::BC1_RGB_UNORM_BLOCK;
663             vkBufferFormat               = VK_FORMAT_BC1_RGB_UNORM_BLOCK;
664             vkBufferFormatIsPacked       = false;
665             vertexLoadFunction           = nullptr;
666             vertexLoadRequiresConversion = false;
667             break;
668 
669         case angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK:
670             internalFormat               = GL_COMPRESSED_SRGB_S3TC_DXT1_EXT;
671             actualImageFormatID          = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
672             vkImageFormat                = VK_FORMAT_BC1_RGB_SRGB_BLOCK;
673             imageInitializerFunction     = nullptr;
674             actualBufferFormatID         = angle::FormatID::BC1_RGB_UNORM_SRGB_BLOCK;
675             vkBufferFormat               = VK_FORMAT_BC1_RGB_SRGB_BLOCK;
676             vkBufferFormatIsPacked       = false;
677             vertexLoadFunction           = nullptr;
678             vertexLoadRequiresConversion = false;
679             break;
680 
681         case angle::FormatID::BC2_RGBA_UNORM_BLOCK:
682             internalFormat               = GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
683             actualImageFormatID          = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
684             vkImageFormat                = VK_FORMAT_BC2_UNORM_BLOCK;
685             imageInitializerFunction     = nullptr;
686             actualBufferFormatID         = angle::FormatID::BC2_RGBA_UNORM_BLOCK;
687             vkBufferFormat               = VK_FORMAT_BC2_UNORM_BLOCK;
688             vkBufferFormatIsPacked       = false;
689             vertexLoadFunction           = nullptr;
690             vertexLoadRequiresConversion = false;
691             break;
692 
693         case angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK:
694             internalFormat               = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
695             actualImageFormatID          = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
696             vkImageFormat                = VK_FORMAT_BC2_SRGB_BLOCK;
697             imageInitializerFunction     = nullptr;
698             actualBufferFormatID         = angle::FormatID::BC2_RGBA_UNORM_SRGB_BLOCK;
699             vkBufferFormat               = VK_FORMAT_BC2_SRGB_BLOCK;
700             vkBufferFormatIsPacked       = false;
701             vertexLoadFunction           = nullptr;
702             vertexLoadRequiresConversion = false;
703             break;
704 
705         case angle::FormatID::BC3_RGBA_UNORM_BLOCK:
706             internalFormat               = GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
707             actualImageFormatID          = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
708             vkImageFormat                = VK_FORMAT_BC3_UNORM_BLOCK;
709             imageInitializerFunction     = nullptr;
710             actualBufferFormatID         = angle::FormatID::BC3_RGBA_UNORM_BLOCK;
711             vkBufferFormat               = VK_FORMAT_BC3_UNORM_BLOCK;
712             vkBufferFormatIsPacked       = false;
713             vertexLoadFunction           = nullptr;
714             vertexLoadRequiresConversion = false;
715             break;
716 
717         case angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK:
718             internalFormat               = GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
719             actualImageFormatID          = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
720             vkImageFormat                = VK_FORMAT_BC3_SRGB_BLOCK;
721             imageInitializerFunction     = nullptr;
722             actualBufferFormatID         = angle::FormatID::BC3_RGBA_UNORM_SRGB_BLOCK;
723             vkBufferFormat               = VK_FORMAT_BC3_SRGB_BLOCK;
724             vkBufferFormatIsPacked       = false;
725             vertexLoadFunction           = nullptr;
726             vertexLoadRequiresConversion = false;
727             break;
728 
729         case angle::FormatID::BC4_RED_SNORM_BLOCK:
730             internalFormat               = GL_COMPRESSED_SIGNED_RED_RGTC1_EXT;
731             actualImageFormatID          = angle::FormatID::BC4_RED_SNORM_BLOCK;
732             vkImageFormat                = VK_FORMAT_BC4_SNORM_BLOCK;
733             imageInitializerFunction     = nullptr;
734             actualBufferFormatID         = angle::FormatID::BC4_RED_SNORM_BLOCK;
735             vkBufferFormat               = VK_FORMAT_BC4_SNORM_BLOCK;
736             vkBufferFormatIsPacked       = false;
737             vertexLoadFunction           = nullptr;
738             vertexLoadRequiresConversion = false;
739             break;
740 
741         case angle::FormatID::BC4_RED_UNORM_BLOCK:
742             internalFormat               = GL_COMPRESSED_RED_RGTC1_EXT;
743             actualImageFormatID          = angle::FormatID::BC4_RED_UNORM_BLOCK;
744             vkImageFormat                = VK_FORMAT_BC4_UNORM_BLOCK;
745             imageInitializerFunction     = nullptr;
746             actualBufferFormatID         = angle::FormatID::BC4_RED_UNORM_BLOCK;
747             vkBufferFormat               = VK_FORMAT_BC4_UNORM_BLOCK;
748             vkBufferFormatIsPacked       = false;
749             vertexLoadFunction           = nullptr;
750             vertexLoadRequiresConversion = false;
751             break;
752 
753         case angle::FormatID::BC5_RG_SNORM_BLOCK:
754             internalFormat               = GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;
755             actualImageFormatID          = angle::FormatID::BC5_RG_SNORM_BLOCK;
756             vkImageFormat                = VK_FORMAT_BC5_SNORM_BLOCK;
757             imageInitializerFunction     = nullptr;
758             actualBufferFormatID         = angle::FormatID::BC5_RG_SNORM_BLOCK;
759             vkBufferFormat               = VK_FORMAT_BC5_SNORM_BLOCK;
760             vkBufferFormatIsPacked       = false;
761             vertexLoadFunction           = nullptr;
762             vertexLoadRequiresConversion = false;
763             break;
764 
765         case angle::FormatID::BC5_RG_UNORM_BLOCK:
766             internalFormat               = GL_COMPRESSED_RED_GREEN_RGTC2_EXT;
767             actualImageFormatID          = angle::FormatID::BC5_RG_UNORM_BLOCK;
768             vkImageFormat                = VK_FORMAT_BC5_UNORM_BLOCK;
769             imageInitializerFunction     = nullptr;
770             actualBufferFormatID         = angle::FormatID::BC5_RG_UNORM_BLOCK;
771             vkBufferFormat               = VK_FORMAT_BC5_UNORM_BLOCK;
772             vkBufferFormatIsPacked       = false;
773             vertexLoadFunction           = nullptr;
774             vertexLoadRequiresConversion = false;
775             break;
776 
777         case angle::FormatID::BPTC_RGBA_UNORM_BLOCK:
778             internalFormat               = GL_COMPRESSED_RGBA_BPTC_UNORM_EXT;
779             actualImageFormatID          = angle::FormatID::BPTC_RGBA_UNORM_BLOCK;
780             vkImageFormat                = VK_FORMAT_BC7_UNORM_BLOCK;
781             imageInitializerFunction     = nullptr;
782             actualBufferFormatID         = angle::FormatID::BPTC_RGBA_UNORM_BLOCK;
783             vkBufferFormat               = VK_FORMAT_BC7_UNORM_BLOCK;
784             vkBufferFormatIsPacked       = false;
785             vertexLoadFunction           = nullptr;
786             vertexLoadRequiresConversion = false;
787             break;
788 
789         case angle::FormatID::BPTC_RGB_SIGNED_FLOAT_BLOCK:
790             internalFormat               = GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;
791             actualImageFormatID          = angle::FormatID::BPTC_RGB_SIGNED_FLOAT_BLOCK;
792             vkImageFormat                = VK_FORMAT_BC6H_SFLOAT_BLOCK;
793             imageInitializerFunction     = nullptr;
794             actualBufferFormatID         = angle::FormatID::BPTC_RGB_SIGNED_FLOAT_BLOCK;
795             vkBufferFormat               = VK_FORMAT_BC6H_SFLOAT_BLOCK;
796             vkBufferFormatIsPacked       = false;
797             vertexLoadFunction           = nullptr;
798             vertexLoadRequiresConversion = false;
799             break;
800 
801         case angle::FormatID::BPTC_RGB_UNSIGNED_FLOAT_BLOCK:
802             internalFormat               = GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;
803             actualImageFormatID          = angle::FormatID::BPTC_RGB_UNSIGNED_FLOAT_BLOCK;
804             vkImageFormat                = VK_FORMAT_BC6H_UFLOAT_BLOCK;
805             imageInitializerFunction     = nullptr;
806             actualBufferFormatID         = angle::FormatID::BPTC_RGB_UNSIGNED_FLOAT_BLOCK;
807             vkBufferFormat               = VK_FORMAT_BC6H_UFLOAT_BLOCK;
808             vkBufferFormatIsPacked       = false;
809             vertexLoadFunction           = nullptr;
810             vertexLoadRequiresConversion = false;
811             break;
812 
813         case angle::FormatID::BPTC_SRGB_ALPHA_UNORM_BLOCK:
814             internalFormat               = GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT;
815             actualImageFormatID          = angle::FormatID::BPTC_SRGB_ALPHA_UNORM_BLOCK;
816             vkImageFormat                = VK_FORMAT_BC7_SRGB_BLOCK;
817             imageInitializerFunction     = nullptr;
818             actualBufferFormatID         = angle::FormatID::BPTC_SRGB_ALPHA_UNORM_BLOCK;
819             vkBufferFormat               = VK_FORMAT_BC7_SRGB_BLOCK;
820             vkBufferFormatIsPacked       = false;
821             vertexLoadFunction           = nullptr;
822             vertexLoadRequiresConversion = false;
823             break;
824 
825         case angle::FormatID::D16_UNORM:
826             internalFormat               = GL_DEPTH_COMPONENT16;
827             actualImageFormatID          = angle::FormatID::D16_UNORM;
828             vkImageFormat                = VK_FORMAT_D16_UNORM;
829             imageInitializerFunction     = nullptr;
830             actualBufferFormatID         = angle::FormatID::D16_UNORM;
831             vkBufferFormat               = VK_FORMAT_D16_UNORM;
832             vkBufferFormatIsPacked       = false;
833             vertexLoadFunction           = nullptr;
834             vertexLoadRequiresConversion = false;
835             break;
836 
837         case angle::FormatID::D24_UNORM_S8_UINT:
838             internalFormat = GL_DEPTH24_STENCIL8;
839             {
840                 static constexpr ImageFormatInitInfo kInfo[] = {
841                     {angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
842                     {angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr},
843                     {angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr}};
844                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
845             }
846             actualBufferFormatID         = angle::FormatID::D24_UNORM_S8_UINT;
847             vkBufferFormat               = VK_FORMAT_D24_UNORM_S8_UINT;
848             vkBufferFormatIsPacked       = false;
849             vertexLoadFunction           = nullptr;
850             vertexLoadRequiresConversion = false;
851             break;
852 
853         case angle::FormatID::D24_UNORM_X8_UINT:
854             internalFormat = GL_DEPTH_COMPONENT24;
855             {
856                 static constexpr ImageFormatInitInfo kInfo[] = {
857                     {angle::FormatID::D24_UNORM_X8_UINT, VK_FORMAT_X8_D24_UNORM_PACK32, nullptr},
858                     {angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
859                     {angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr}};
860                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
861             }
862             actualBufferFormatID         = angle::FormatID::D24_UNORM_X8_UINT;
863             vkBufferFormat               = VK_FORMAT_X8_D24_UNORM_PACK32;
864             vkBufferFormatIsPacked       = true;
865             vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
866             vertexLoadRequiresConversion = false;
867             break;
868 
869         case angle::FormatID::D32_FLOAT:
870             internalFormat               = GL_DEPTH_COMPONENT32F;
871             actualImageFormatID          = angle::FormatID::D32_FLOAT;
872             vkImageFormat                = VK_FORMAT_D32_SFLOAT;
873             imageInitializerFunction     = nullptr;
874             actualBufferFormatID         = angle::FormatID::D32_FLOAT;
875             vkBufferFormat               = VK_FORMAT_D32_SFLOAT;
876             vkBufferFormatIsPacked       = false;
877             vertexLoadFunction           = CopyNativeVertexData<GLfloat, 1, 1, 0>;
878             vertexLoadRequiresConversion = false;
879             break;
880 
881         case angle::FormatID::D32_FLOAT_S8X24_UINT:
882             internalFormat = GL_DEPTH32F_STENCIL8;
883             {
884                 static constexpr ImageFormatInitInfo kInfo[] = {
885                     {angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr},
886                     {angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
887                     {angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr}};
888                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
889             }
890             actualBufferFormatID         = angle::FormatID::D32_FLOAT_S8X24_UINT;
891             vkBufferFormat               = VK_FORMAT_D32_SFLOAT_S8_UINT;
892             vkBufferFormatIsPacked       = false;
893             vertexLoadFunction           = CopyNativeVertexData<GLfloat, 3, 3, 0>;
894             vertexLoadRequiresConversion = false;
895             break;
896 
897         case angle::FormatID::D32_UNORM:
898             internalFormat = GL_DEPTH_COMPONENT32_OES;
899             {
900                 static constexpr ImageFormatInitInfo kInfo[] = {
901                     {angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
902                     {angle::FormatID::D32_FLOAT, VK_FORMAT_D32_SFLOAT, nullptr}};
903                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
904             }
905             actualBufferFormatID         = angle::FormatID::NONE;
906             vkBufferFormat               = VK_FORMAT_UNDEFINED;
907             vkBufferFormatIsPacked       = false;
908             vertexLoadFunction           = nullptr;
909             vertexLoadRequiresConversion = true;
910             break;
911 
912         case angle::FormatID::EAC_R11G11_SNORM_BLOCK:
913             internalFormat = GL_COMPRESSED_SIGNED_RG11_EAC;
914             {
915                 static constexpr ImageFormatInitInfo kInfo[] = {
916                     {angle::FormatID::EAC_R11G11_SNORM_BLOCK, VK_FORMAT_EAC_R11G11_SNORM_BLOCK,
917                      nullptr},
918                     {angle::FormatID::R16G16_SNORM, VK_FORMAT_R16G16_SNORM, nullptr},
919                     {angle::FormatID::R16G16_FLOAT, VK_FORMAT_R16G16_SFLOAT, nullptr}};
920                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
921             }
922             actualBufferFormatID         = angle::FormatID::EAC_R11G11_SNORM_BLOCK;
923             vkBufferFormat               = VK_FORMAT_EAC_R11G11_SNORM_BLOCK;
924             vkBufferFormatIsPacked       = false;
925             vertexLoadFunction           = nullptr;
926             vertexLoadRequiresConversion = false;
927             break;
928 
929         case angle::FormatID::EAC_R11G11_UNORM_BLOCK:
930             internalFormat = GL_COMPRESSED_RG11_EAC;
931             {
932                 static constexpr ImageFormatInitInfo kInfo[] = {
933                     {angle::FormatID::EAC_R11G11_UNORM_BLOCK, VK_FORMAT_EAC_R11G11_UNORM_BLOCK,
934                      nullptr},
935                     {angle::FormatID::R16G16_UNORM, VK_FORMAT_R16G16_UNORM, nullptr},
936                     {angle::FormatID::R16G16_FLOAT, VK_FORMAT_R16G16_SFLOAT, nullptr}};
937                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
938             }
939             actualBufferFormatID         = angle::FormatID::EAC_R11G11_UNORM_BLOCK;
940             vkBufferFormat               = VK_FORMAT_EAC_R11G11_UNORM_BLOCK;
941             vkBufferFormatIsPacked       = false;
942             vertexLoadFunction           = nullptr;
943             vertexLoadRequiresConversion = false;
944             break;
945 
946         case angle::FormatID::EAC_R11_SNORM_BLOCK:
947             internalFormat = GL_COMPRESSED_SIGNED_R11_EAC;
948             {
949                 static constexpr ImageFormatInitInfo kInfo[] = {
950                     {angle::FormatID::EAC_R11_SNORM_BLOCK, VK_FORMAT_EAC_R11_SNORM_BLOCK, nullptr},
951                     {angle::FormatID::R16_SNORM, VK_FORMAT_R16_SNORM, nullptr},
952                     {angle::FormatID::R16_FLOAT, VK_FORMAT_R16_SFLOAT, nullptr}};
953                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
954             }
955             actualBufferFormatID         = angle::FormatID::EAC_R11_SNORM_BLOCK;
956             vkBufferFormat               = VK_FORMAT_EAC_R11_SNORM_BLOCK;
957             vkBufferFormatIsPacked       = false;
958             vertexLoadFunction           = nullptr;
959             vertexLoadRequiresConversion = false;
960             break;
961 
962         case angle::FormatID::EAC_R11_UNORM_BLOCK:
963             internalFormat = GL_COMPRESSED_R11_EAC;
964             {
965                 static constexpr ImageFormatInitInfo kInfo[] = {
966                     {angle::FormatID::EAC_R11_UNORM_BLOCK, VK_FORMAT_EAC_R11_UNORM_BLOCK, nullptr},
967                     {angle::FormatID::R16_UNORM, VK_FORMAT_R16_UNORM, nullptr},
968                     {angle::FormatID::R16_FLOAT, VK_FORMAT_R16_SFLOAT, nullptr}};
969                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
970             }
971             actualBufferFormatID         = angle::FormatID::EAC_R11_UNORM_BLOCK;
972             vkBufferFormat               = VK_FORMAT_EAC_R11_UNORM_BLOCK;
973             vkBufferFormatIsPacked       = false;
974             vertexLoadFunction           = nullptr;
975             vertexLoadRequiresConversion = false;
976             break;
977 
978         case angle::FormatID::ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK:
979             // This format is not implemented in Vulkan.
980             break;
981 
982         case angle::FormatID::ETC1_R8G8B8_UNORM_BLOCK:
983             internalFormat = GL_ETC1_RGB8_OES;
984             {
985                 static constexpr ImageFormatInitInfo kInfo[] = {
986                     {angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
987                      nullptr},
988                     {angle::FormatID::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM,
989                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
990                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
991             }
992             actualBufferFormatID         = angle::FormatID::NONE;
993             vkBufferFormat               = VK_FORMAT_UNDEFINED;
994             vkBufferFormatIsPacked       = false;
995             vertexLoadFunction           = nullptr;
996             vertexLoadRequiresConversion = true;
997             break;
998 
999         case angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK:
1000             internalFormat = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
1001             {
1002                 static constexpr ImageFormatInitInfo kInfo[] = {
1003                     {angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,
1004                      nullptr},
1005                     {angle::FormatID::R8G8B8A8_UNORM_SRGB, VK_FORMAT_R8G8B8A8_SRGB, nullptr}};
1006                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1007             }
1008             actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A1_SRGB_BLOCK;
1009             vkBufferFormat               = VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK;
1010             vkBufferFormatIsPacked       = false;
1011             vertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
1012             vertexLoadRequiresConversion = false;
1013             break;
1014 
1015         case angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK:
1016             internalFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
1017             {
1018                 static constexpr ImageFormatInitInfo kInfo[] = {
1019                     {angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK,
1020                      VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,
1021                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>},
1022                     {angle::FormatID::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM,
1023                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
1024                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1025             }
1026             actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A1_UNORM_BLOCK;
1027             vkBufferFormat               = VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK;
1028             vkBufferFormatIsPacked       = false;
1029             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
1030             vertexLoadRequiresConversion = false;
1031             break;
1032 
1033         case angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK:
1034             internalFormat = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
1035             {
1036                 static constexpr ImageFormatInitInfo kInfo[] = {
1037                     {angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,
1038                      nullptr},
1039                     {angle::FormatID::R8G8B8A8_UNORM_SRGB, VK_FORMAT_R8G8B8A8_SRGB, nullptr}};
1040                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1041             }
1042             actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A8_SRGB_BLOCK;
1043             vkBufferFormat               = VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK;
1044             vkBufferFormatIsPacked       = false;
1045             vertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
1046             vertexLoadRequiresConversion = false;
1047             break;
1048 
1049         case angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK:
1050             internalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
1051             {
1052                 static constexpr ImageFormatInitInfo kInfo[] = {
1053                     {angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK,
1054                      VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, nullptr},
1055                     {angle::FormatID::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, nullptr}};
1056                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1057             }
1058             actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8A8_UNORM_BLOCK;
1059             vkBufferFormat               = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1060             vkBufferFormatIsPacked       = false;
1061             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
1062             vertexLoadRequiresConversion = false;
1063             break;
1064 
1065         case angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK:
1066             internalFormat = GL_COMPRESSED_SRGB8_ETC2;
1067             {
1068                 static constexpr ImageFormatInitInfo kInfo[] = {
1069                     {angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK, VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,
1070                      nullptr},
1071                     {angle::FormatID::R8G8B8A8_UNORM_SRGB, VK_FORMAT_R8G8B8A8_SRGB,
1072                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
1073                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1074             }
1075             actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8_SRGB_BLOCK;
1076             vkBufferFormat               = VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK;
1077             vkBufferFormatIsPacked       = false;
1078             vertexLoadFunction           = CopyNativeVertexData<GLbyte, 3, 3, 0>;
1079             vertexLoadRequiresConversion = false;
1080             break;
1081 
1082         case angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK:
1083             internalFormat = GL_COMPRESSED_RGB8_ETC2;
1084             {
1085                 static constexpr ImageFormatInitInfo kInfo[] = {
1086                     {angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,
1087                      nullptr},
1088                     {angle::FormatID::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM,
1089                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
1090                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1091             }
1092             actualBufferFormatID         = angle::FormatID::ETC2_R8G8B8_UNORM_BLOCK;
1093             vkBufferFormat               = VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK;
1094             vkBufferFormatIsPacked       = false;
1095             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
1096             vertexLoadRequiresConversion = false;
1097             break;
1098 
1099         case angle::FormatID::L16A16_FLOAT:
1100             internalFormat           = GL_LUMINANCE_ALPHA16F_EXT;
1101             actualImageFormatID      = angle::FormatID::R16G16_FLOAT;
1102             vkImageFormat            = VK_FORMAT_R16G16_SFLOAT;
1103             imageInitializerFunction = nullptr;
1104 
1105             break;
1106 
1107         case angle::FormatID::L16_FLOAT:
1108             internalFormat           = GL_LUMINANCE16F_EXT;
1109             actualImageFormatID      = angle::FormatID::R16_FLOAT;
1110             vkImageFormat            = VK_FORMAT_R16_SFLOAT;
1111             imageInitializerFunction = nullptr;
1112 
1113             break;
1114 
1115         case angle::FormatID::L32A32_FLOAT:
1116             internalFormat           = GL_LUMINANCE_ALPHA32F_EXT;
1117             actualImageFormatID      = angle::FormatID::R32G32_FLOAT;
1118             vkImageFormat            = VK_FORMAT_R32G32_SFLOAT;
1119             imageInitializerFunction = nullptr;
1120 
1121             break;
1122 
1123         case angle::FormatID::L32_FLOAT:
1124             internalFormat           = GL_LUMINANCE32F_EXT;
1125             actualImageFormatID      = angle::FormatID::R32_FLOAT;
1126             vkImageFormat            = VK_FORMAT_R32_SFLOAT;
1127             imageInitializerFunction = nullptr;
1128 
1129             break;
1130 
1131         case angle::FormatID::L8A8_UNORM:
1132             internalFormat           = GL_LUMINANCE8_ALPHA8_EXT;
1133             actualImageFormatID      = angle::FormatID::R8G8_UNORM;
1134             vkImageFormat            = VK_FORMAT_R8G8_UNORM;
1135             imageInitializerFunction = nullptr;
1136 
1137             break;
1138 
1139         case angle::FormatID::L8_UNORM:
1140             internalFormat           = GL_LUMINANCE8_EXT;
1141             actualImageFormatID      = angle::FormatID::R8_UNORM;
1142             vkImageFormat            = VK_FORMAT_R8_UNORM;
1143             imageInitializerFunction = nullptr;
1144 
1145             break;
1146 
1147         case angle::FormatID::NONE:
1148             // This format is not implemented in Vulkan.
1149             break;
1150 
1151         case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_BLOCK:
1152             // This format is not implemented in Vulkan.
1153             break;
1154 
1155         case angle::FormatID::PVRTC1_RGBA_2BPP_UNORM_SRGB_BLOCK:
1156             // This format is not implemented in Vulkan.
1157             break;
1158 
1159         case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_BLOCK:
1160             // This format is not implemented in Vulkan.
1161             break;
1162 
1163         case angle::FormatID::PVRTC1_RGBA_4BPP_UNORM_SRGB_BLOCK:
1164             // This format is not implemented in Vulkan.
1165             break;
1166 
1167         case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_BLOCK:
1168             // This format is not implemented in Vulkan.
1169             break;
1170 
1171         case angle::FormatID::PVRTC1_RGB_2BPP_UNORM_SRGB_BLOCK:
1172             // This format is not implemented in Vulkan.
1173             break;
1174 
1175         case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_BLOCK:
1176             // This format is not implemented in Vulkan.
1177             break;
1178 
1179         case angle::FormatID::PVRTC1_RGB_4BPP_UNORM_SRGB_BLOCK:
1180             // This format is not implemented in Vulkan.
1181             break;
1182 
1183         case angle::FormatID::R10G10B10A2_SINT:
1184             internalFormat           = GL_RGB10_A2_SINT_ANGLEX;
1185             actualImageFormatID      = angle::FormatID::R10G10B10A2_SINT;
1186             vkImageFormat            = VK_FORMAT_A2B10G10R10_SINT_PACK32;
1187             imageInitializerFunction = nullptr;
1188             {
1189                 static constexpr BufferFormatInitInfo kInfo[] = {
1190                     {angle::FormatID::R10G10B10A2_SINT, VK_FORMAT_A2B10G10R10_SINT_PACK32, true,
1191                      CopyNativeVertexData<GLuint, 1, 1, 0>, false},
1192                     {angle::FormatID::R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT, false,
1193                      CopyXYZ10W2ToXYZW32FVertexData<true, false, false>, true}};
1194                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1195             }
1196             break;
1197 
1198         case angle::FormatID::R10G10B10A2_SNORM:
1199             internalFormat           = GL_RGB10_A2_SNORM_ANGLEX;
1200             actualImageFormatID      = angle::FormatID::R10G10B10A2_SNORM;
1201             vkImageFormat            = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
1202             imageInitializerFunction = nullptr;
1203             {
1204                 static constexpr BufferFormatInitInfo kInfo[] = {
1205                     {angle::FormatID::R10G10B10A2_SNORM, VK_FORMAT_A2B10G10R10_SNORM_PACK32, true,
1206                      CopyNativeVertexData<GLuint, 1, 1, 0>, false},
1207                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
1208                      CopyXYZ10W2ToXYZW32FVertexData<true, true, true>, true}};
1209                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1210             }
1211             break;
1212 
1213         case angle::FormatID::R10G10B10A2_SSCALED:
1214             internalFormat           = GL_RGB10_A2_SSCALED_ANGLEX;
1215             actualImageFormatID      = angle::FormatID::R10G10B10A2_SSCALED;
1216             vkImageFormat            = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
1217             imageInitializerFunction = nullptr;
1218             {
1219                 static constexpr BufferFormatInitInfo kInfo[] = {
1220                     {angle::FormatID::R10G10B10A2_SSCALED, VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
1221                      true, CopyNativeVertexData<GLuint, 1, 1, 0>, false},
1222                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
1223                      CopyXYZ10W2ToXYZW32FVertexData<true, false, true>, true}};
1224                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1225             }
1226             break;
1227 
1228         case angle::FormatID::R10G10B10A2_UINT:
1229             internalFormat           = GL_RGB10_A2UI;
1230             actualImageFormatID      = angle::FormatID::R10G10B10A2_UINT;
1231             vkImageFormat            = VK_FORMAT_A2B10G10R10_UINT_PACK32;
1232             imageInitializerFunction = nullptr;
1233             {
1234                 static constexpr BufferFormatInitInfo kInfo[] = {
1235                     {angle::FormatID::R10G10B10A2_UINT, VK_FORMAT_A2B10G10R10_UINT_PACK32, true,
1236                      CopyNativeVertexData<GLuint, 1, 1, 0>, false},
1237                     {angle::FormatID::R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT, false,
1238                      CopyXYZ10W2ToXYZW32FVertexData<false, false, false>, true}};
1239                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1240             }
1241             break;
1242 
1243         case angle::FormatID::R10G10B10A2_UNORM:
1244             internalFormat               = GL_RGB10_A2;
1245             actualImageFormatID          = angle::FormatID::R10G10B10A2_UNORM;
1246             vkImageFormat                = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
1247             imageInitializerFunction     = nullptr;
1248             actualBufferFormatID         = angle::FormatID::R10G10B10A2_UNORM;
1249             vkBufferFormat               = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
1250             vkBufferFormatIsPacked       = true;
1251             vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
1252             vertexLoadRequiresConversion = false;
1253             break;
1254 
1255         case angle::FormatID::R10G10B10A2_USCALED:
1256             internalFormat           = GL_RGB10_A2_USCALED_ANGLEX;
1257             actualImageFormatID      = angle::FormatID::R10G10B10A2_USCALED;
1258             vkImageFormat            = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
1259             imageInitializerFunction = nullptr;
1260             {
1261                 static constexpr BufferFormatInitInfo kInfo[] = {
1262                     {angle::FormatID::R10G10B10A2_USCALED, VK_FORMAT_A2B10G10R10_USCALED_PACK32,
1263                      true, CopyNativeVertexData<GLuint, 1, 1, 0>, false},
1264                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
1265                      CopyXYZ10W2ToXYZW32FVertexData<false, false, true>, true}};
1266                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1267             }
1268             break;
1269 
1270         case angle::FormatID::R10G10B10X2_UNORM:
1271             internalFormat               = GL_RGB10_UNORM_ANGLEX;
1272             actualImageFormatID          = angle::FormatID::R10G10B10A2_UNORM;
1273             vkImageFormat                = VK_FORMAT_A2B10G10R10_UNORM_PACK32;
1274             imageInitializerFunction     = nullptr;
1275             actualBufferFormatID         = angle::FormatID::NONE;
1276             vkBufferFormat               = VK_FORMAT_UNDEFINED;
1277             vkBufferFormatIsPacked       = false;
1278             vertexLoadFunction           = nullptr;
1279             vertexLoadRequiresConversion = true;
1280             break;
1281 
1282         case angle::FormatID::R11G11B10_FLOAT:
1283             internalFormat               = GL_R11F_G11F_B10F;
1284             actualImageFormatID          = angle::FormatID::R11G11B10_FLOAT;
1285             vkImageFormat                = VK_FORMAT_B10G11R11_UFLOAT_PACK32;
1286             imageInitializerFunction     = nullptr;
1287             actualBufferFormatID         = angle::FormatID::R11G11B10_FLOAT;
1288             vkBufferFormat               = VK_FORMAT_B10G11R11_UFLOAT_PACK32;
1289             vkBufferFormatIsPacked       = true;
1290             vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
1291             vertexLoadRequiresConversion = false;
1292             break;
1293 
1294         case angle::FormatID::R16G16B16A16_FLOAT:
1295             internalFormat               = GL_RGBA16F;
1296             actualImageFormatID          = angle::FormatID::R16G16B16A16_FLOAT;
1297             vkImageFormat                = VK_FORMAT_R16G16B16A16_SFLOAT;
1298             imageInitializerFunction     = nullptr;
1299             actualBufferFormatID         = angle::FormatID::R16G16B16A16_FLOAT;
1300             vkBufferFormat               = VK_FORMAT_R16G16B16A16_SFLOAT;
1301             vkBufferFormatIsPacked       = false;
1302             vertexLoadFunction           = CopyNativeVertexData<GLhalf, 4, 4, 0>;
1303             vertexLoadRequiresConversion = false;
1304             break;
1305 
1306         case angle::FormatID::R16G16B16A16_SINT:
1307             internalFormat               = GL_RGBA16I;
1308             actualImageFormatID          = angle::FormatID::R16G16B16A16_SINT;
1309             vkImageFormat                = VK_FORMAT_R16G16B16A16_SINT;
1310             imageInitializerFunction     = nullptr;
1311             actualBufferFormatID         = angle::FormatID::R16G16B16A16_SINT;
1312             vkBufferFormat               = VK_FORMAT_R16G16B16A16_SINT;
1313             vkBufferFormatIsPacked       = false;
1314             vertexLoadFunction           = CopyNativeVertexData<GLshort, 4, 4, 0>;
1315             vertexLoadRequiresConversion = false;
1316             break;
1317 
1318         case angle::FormatID::R16G16B16A16_SNORM:
1319             internalFormat           = GL_RGBA16_SNORM_EXT;
1320             actualImageFormatID      = angle::FormatID::R16G16B16A16_SNORM;
1321             vkImageFormat            = VK_FORMAT_R16G16B16A16_SNORM;
1322             imageInitializerFunction = nullptr;
1323             {
1324                 static constexpr BufferFormatInitInfo kInfo[] = {
1325                     {angle::FormatID::R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_SNORM, false,
1326                      CopyNativeVertexData<GLshort, 4, 4, 0>, false},
1327                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
1328                      CopyTo32FVertexData<GLshort, 4, 4, true>, true}};
1329                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1330             }
1331             break;
1332 
1333         case angle::FormatID::R16G16B16A16_SSCALED:
1334             internalFormat           = GL_RGBA16_SSCALED_ANGLEX;
1335             actualImageFormatID      = angle::FormatID::R16G16B16A16_SSCALED;
1336             vkImageFormat            = VK_FORMAT_R16G16B16A16_SSCALED;
1337             imageInitializerFunction = nullptr;
1338             {
1339                 static constexpr BufferFormatInitInfo kInfo[] = {
1340                     {angle::FormatID::R16G16B16A16_SSCALED, VK_FORMAT_R16G16B16A16_SSCALED, false,
1341                      CopyNativeVertexData<GLshort, 4, 4, 0>, false},
1342                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
1343                      CopyTo32FVertexData<GLshort, 4, 4, false>, true}};
1344                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1345             }
1346             break;
1347 
1348         case angle::FormatID::R16G16B16A16_UINT:
1349             internalFormat               = GL_RGBA16UI;
1350             actualImageFormatID          = angle::FormatID::R16G16B16A16_UINT;
1351             vkImageFormat                = VK_FORMAT_R16G16B16A16_UINT;
1352             imageInitializerFunction     = nullptr;
1353             actualBufferFormatID         = angle::FormatID::R16G16B16A16_UINT;
1354             vkBufferFormat               = VK_FORMAT_R16G16B16A16_UINT;
1355             vkBufferFormatIsPacked       = false;
1356             vertexLoadFunction           = CopyNativeVertexData<GLushort, 4, 4, 0>;
1357             vertexLoadRequiresConversion = false;
1358             break;
1359 
1360         case angle::FormatID::R16G16B16A16_UNORM:
1361             internalFormat           = GL_RGBA16_EXT;
1362             actualImageFormatID      = angle::FormatID::R16G16B16A16_UNORM;
1363             vkImageFormat            = VK_FORMAT_R16G16B16A16_UNORM;
1364             imageInitializerFunction = nullptr;
1365             {
1366                 static constexpr BufferFormatInitInfo kInfo[] = {
1367                     {angle::FormatID::R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_UNORM, false,
1368                      CopyNativeVertexData<GLushort, 4, 4, 0>, false},
1369                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
1370                      CopyTo32FVertexData<GLushort, 4, 4, true>, true}};
1371                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1372             }
1373             break;
1374 
1375         case angle::FormatID::R16G16B16A16_USCALED:
1376             internalFormat           = GL_RGBA16_USCALED_ANGLEX;
1377             actualImageFormatID      = angle::FormatID::R16G16B16A16_USCALED;
1378             vkImageFormat            = VK_FORMAT_R16G16B16A16_USCALED;
1379             imageInitializerFunction = nullptr;
1380             {
1381                 static constexpr BufferFormatInitInfo kInfo[] = {
1382                     {angle::FormatID::R16G16B16A16_USCALED, VK_FORMAT_R16G16B16A16_USCALED, false,
1383                      CopyNativeVertexData<GLushort, 4, 4, 0>, false},
1384                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
1385                      CopyTo32FVertexData<GLushort, 4, 4, false>, true}};
1386                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1387             }
1388             break;
1389 
1390         case angle::FormatID::R16G16B16_FLOAT:
1391             internalFormat = GL_RGB16F;
1392             {
1393                 static constexpr ImageFormatInitInfo kInfo[] = {
1394                     {angle::FormatID::R16G16B16_FLOAT, VK_FORMAT_R16G16B16_SFLOAT, nullptr},
1395                     {angle::FormatID::R16G16B16A16_FLOAT, VK_FORMAT_R16G16B16A16_SFLOAT,
1396                      Initialize4ComponentData<GLhalf, 0x0000, 0x0000, 0x0000, gl::Float16One>}};
1397                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1398             }
1399             {
1400                 static constexpr BufferFormatInitInfo kInfo[] = {
1401                     {angle::FormatID::R16G16B16_FLOAT, VK_FORMAT_R16G16B16_SFLOAT, false,
1402                      CopyNativeVertexData<GLhalf, 3, 3, 0>, false},
1403                     {angle::FormatID::R16G16B16A16_FLOAT, VK_FORMAT_R16G16B16A16_SFLOAT, false,
1404                      CopyNativeVertexData<GLhalf, 3, 4, 0>, true}};
1405                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1406             }
1407             break;
1408 
1409         case angle::FormatID::R16G16B16_SINT:
1410             internalFormat = GL_RGB16I;
1411             {
1412                 static constexpr ImageFormatInitInfo kInfo[] = {
1413                     {angle::FormatID::R16G16B16_SINT, VK_FORMAT_R16G16B16_SINT, nullptr},
1414                     {angle::FormatID::R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT,
1415                      Initialize4ComponentData<GLshort, 0x0000, 0x0000, 0x0000, 0x0001>}};
1416                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1417             }
1418             {
1419                 static constexpr BufferFormatInitInfo kInfo[] = {
1420                     {angle::FormatID::R16G16B16_SINT, VK_FORMAT_R16G16B16_SINT, false,
1421                      CopyNativeVertexData<GLshort, 3, 3, 0>, false},
1422                     {angle::FormatID::R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT, false,
1423                      CopyNativeVertexData<GLshort, 3, 4, 0>, true}};
1424                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1425             }
1426             break;
1427 
1428         case angle::FormatID::R16G16B16_SNORM:
1429             internalFormat           = GL_RGB16_SNORM_EXT;
1430             actualImageFormatID      = angle::FormatID::R16G16B16_SNORM;
1431             vkImageFormat            = VK_FORMAT_R16G16B16_SNORM;
1432             imageInitializerFunction = nullptr;
1433             {
1434                 static constexpr BufferFormatInitInfo kInfo[] = {
1435                     {angle::FormatID::R16G16B16_SNORM, VK_FORMAT_R16G16B16_SNORM, false,
1436                      CopyNativeVertexData<GLshort, 3, 3, 0>, false},
1437                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, false,
1438                      CopyTo32FVertexData<GLshort, 3, 3, true>, true}};
1439                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1440             }
1441             break;
1442 
1443         case angle::FormatID::R16G16B16_SSCALED:
1444             internalFormat           = GL_RGB16_SSCALED_ANGLEX;
1445             actualImageFormatID      = angle::FormatID::R16G16B16_SSCALED;
1446             vkImageFormat            = VK_FORMAT_R16G16B16_SSCALED;
1447             imageInitializerFunction = nullptr;
1448             {
1449                 static constexpr BufferFormatInitInfo kInfo[] = {
1450                     {angle::FormatID::R16G16B16_SSCALED, VK_FORMAT_R16G16B16_SSCALED, false,
1451                      CopyNativeVertexData<GLshort, 3, 3, 0>, false},
1452                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, false,
1453                      CopyTo32FVertexData<GLshort, 3, 3, false>, true}};
1454                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1455             }
1456             break;
1457 
1458         case angle::FormatID::R16G16B16_UINT:
1459             internalFormat = GL_RGB16UI;
1460             {
1461                 static constexpr ImageFormatInitInfo kInfo[] = {
1462                     {angle::FormatID::R16G16B16_UINT, VK_FORMAT_R16G16B16_UINT, nullptr},
1463                     {angle::FormatID::R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT,
1464                      Initialize4ComponentData<GLushort, 0x0000, 0x0000, 0x0000, 0x0001>}};
1465                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1466             }
1467             {
1468                 static constexpr BufferFormatInitInfo kInfo[] = {
1469                     {angle::FormatID::R16G16B16_UINT, VK_FORMAT_R16G16B16_UINT, false,
1470                      CopyNativeVertexData<GLushort, 3, 3, 0>, false},
1471                     {angle::FormatID::R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT, false,
1472                      CopyNativeVertexData<GLushort, 3, 4, 0>, true}};
1473                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1474             }
1475             break;
1476 
1477         case angle::FormatID::R16G16B16_UNORM:
1478             internalFormat           = GL_RGB16_EXT;
1479             actualImageFormatID      = angle::FormatID::R16G16B16_UNORM;
1480             vkImageFormat            = VK_FORMAT_R16G16B16_UNORM;
1481             imageInitializerFunction = nullptr;
1482             {
1483                 static constexpr BufferFormatInitInfo kInfo[] = {
1484                     {angle::FormatID::R16G16B16_UNORM, VK_FORMAT_R16G16B16_UNORM, false,
1485                      CopyNativeVertexData<GLushort, 3, 3, 0>, false},
1486                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, false,
1487                      CopyTo32FVertexData<GLushort, 3, 3, true>, true}};
1488                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1489             }
1490             break;
1491 
1492         case angle::FormatID::R16G16B16_USCALED:
1493             internalFormat           = GL_RGB16_USCALED_ANGLEX;
1494             actualImageFormatID      = angle::FormatID::R16G16B16_USCALED;
1495             vkImageFormat            = VK_FORMAT_R16G16B16_USCALED;
1496             imageInitializerFunction = nullptr;
1497             {
1498                 static constexpr BufferFormatInitInfo kInfo[] = {
1499                     {angle::FormatID::R16G16B16_USCALED, VK_FORMAT_R16G16B16_USCALED, false,
1500                      CopyNativeVertexData<GLushort, 3, 3, 0>, false},
1501                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, false,
1502                      CopyTo32FVertexData<GLushort, 3, 3, false>, true}};
1503                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1504             }
1505             break;
1506 
1507         case angle::FormatID::R16G16_FLOAT:
1508             internalFormat               = GL_RG16F;
1509             actualImageFormatID          = angle::FormatID::R16G16_FLOAT;
1510             vkImageFormat                = VK_FORMAT_R16G16_SFLOAT;
1511             imageInitializerFunction     = nullptr;
1512             actualBufferFormatID         = angle::FormatID::R16G16_FLOAT;
1513             vkBufferFormat               = VK_FORMAT_R16G16_SFLOAT;
1514             vkBufferFormatIsPacked       = false;
1515             vertexLoadFunction           = CopyNativeVertexData<GLhalf, 2, 2, 0>;
1516             vertexLoadRequiresConversion = false;
1517             break;
1518 
1519         case angle::FormatID::R16G16_SINT:
1520             internalFormat               = GL_RG16I;
1521             actualImageFormatID          = angle::FormatID::R16G16_SINT;
1522             vkImageFormat                = VK_FORMAT_R16G16_SINT;
1523             imageInitializerFunction     = nullptr;
1524             actualBufferFormatID         = angle::FormatID::R16G16_SINT;
1525             vkBufferFormat               = VK_FORMAT_R16G16_SINT;
1526             vkBufferFormatIsPacked       = false;
1527             vertexLoadFunction           = CopyNativeVertexData<GLshort, 2, 2, 0>;
1528             vertexLoadRequiresConversion = false;
1529             break;
1530 
1531         case angle::FormatID::R16G16_SNORM:
1532             internalFormat           = GL_RG16_SNORM_EXT;
1533             actualImageFormatID      = angle::FormatID::R16G16_SNORM;
1534             vkImageFormat            = VK_FORMAT_R16G16_SNORM;
1535             imageInitializerFunction = nullptr;
1536             {
1537                 static constexpr BufferFormatInitInfo kInfo[] = {
1538                     {angle::FormatID::R16G16_SNORM, VK_FORMAT_R16G16_SNORM, false,
1539                      CopyNativeVertexData<GLshort, 2, 2, 0>, false},
1540                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
1541                      CopyTo32FVertexData<GLshort, 2, 2, true>, true}};
1542                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1543             }
1544             break;
1545 
1546         case angle::FormatID::R16G16_SSCALED:
1547             internalFormat           = GL_RG16_SSCALED_ANGLEX;
1548             actualImageFormatID      = angle::FormatID::R16G16_SSCALED;
1549             vkImageFormat            = VK_FORMAT_R16G16_SSCALED;
1550             imageInitializerFunction = nullptr;
1551             {
1552                 static constexpr BufferFormatInitInfo kInfo[] = {
1553                     {angle::FormatID::R16G16_SSCALED, VK_FORMAT_R16G16_SSCALED, false,
1554                      CopyNativeVertexData<GLshort, 2, 2, 0>, false},
1555                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
1556                      CopyTo32FVertexData<GLshort, 2, 2, false>, true}};
1557                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1558             }
1559             break;
1560 
1561         case angle::FormatID::R16G16_UINT:
1562             internalFormat               = GL_RG16UI;
1563             actualImageFormatID          = angle::FormatID::R16G16_UINT;
1564             vkImageFormat                = VK_FORMAT_R16G16_UINT;
1565             imageInitializerFunction     = nullptr;
1566             actualBufferFormatID         = angle::FormatID::R16G16_UINT;
1567             vkBufferFormat               = VK_FORMAT_R16G16_UINT;
1568             vkBufferFormatIsPacked       = false;
1569             vertexLoadFunction           = CopyNativeVertexData<GLushort, 2, 2, 0>;
1570             vertexLoadRequiresConversion = false;
1571             break;
1572 
1573         case angle::FormatID::R16G16_UNORM:
1574             internalFormat           = GL_RG16_EXT;
1575             actualImageFormatID      = angle::FormatID::R16G16_UNORM;
1576             vkImageFormat            = VK_FORMAT_R16G16_UNORM;
1577             imageInitializerFunction = nullptr;
1578             {
1579                 static constexpr BufferFormatInitInfo kInfo[] = {
1580                     {angle::FormatID::R16G16_UNORM, VK_FORMAT_R16G16_UNORM, false,
1581                      CopyNativeVertexData<GLushort, 2, 2, 0>, false},
1582                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
1583                      CopyTo32FVertexData<GLushort, 2, 2, true>, true}};
1584                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1585             }
1586             break;
1587 
1588         case angle::FormatID::R16G16_USCALED:
1589             internalFormat           = GL_RG16_USCALED_ANGLEX;
1590             actualImageFormatID      = angle::FormatID::R16G16_USCALED;
1591             vkImageFormat            = VK_FORMAT_R16G16_USCALED;
1592             imageInitializerFunction = nullptr;
1593             {
1594                 static constexpr BufferFormatInitInfo kInfo[] = {
1595                     {angle::FormatID::R16G16_USCALED, VK_FORMAT_R16G16_USCALED, false,
1596                      CopyNativeVertexData<GLushort, 2, 2, 0>, false},
1597                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
1598                      CopyTo32FVertexData<GLushort, 2, 2, false>, true}};
1599                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1600             }
1601             break;
1602 
1603         case angle::FormatID::R16_FLOAT:
1604             internalFormat               = GL_R16F;
1605             actualImageFormatID          = angle::FormatID::R16_FLOAT;
1606             vkImageFormat                = VK_FORMAT_R16_SFLOAT;
1607             imageInitializerFunction     = nullptr;
1608             actualBufferFormatID         = angle::FormatID::R16_FLOAT;
1609             vkBufferFormat               = VK_FORMAT_R16_SFLOAT;
1610             vkBufferFormatIsPacked       = false;
1611             vertexLoadFunction           = CopyNativeVertexData<GLhalf, 1, 1, 0>;
1612             vertexLoadRequiresConversion = false;
1613             break;
1614 
1615         case angle::FormatID::R16_SINT:
1616             internalFormat               = GL_R16I;
1617             actualImageFormatID          = angle::FormatID::R16_SINT;
1618             vkImageFormat                = VK_FORMAT_R16_SINT;
1619             imageInitializerFunction     = nullptr;
1620             actualBufferFormatID         = angle::FormatID::R16_SINT;
1621             vkBufferFormat               = VK_FORMAT_R16_SINT;
1622             vkBufferFormatIsPacked       = false;
1623             vertexLoadFunction           = CopyNativeVertexData<GLshort, 1, 1, 0>;
1624             vertexLoadRequiresConversion = false;
1625             break;
1626 
1627         case angle::FormatID::R16_SNORM:
1628             internalFormat           = GL_R16_SNORM_EXT;
1629             actualImageFormatID      = angle::FormatID::R16_SNORM;
1630             vkImageFormat            = VK_FORMAT_R16_SNORM;
1631             imageInitializerFunction = nullptr;
1632             {
1633                 static constexpr BufferFormatInitInfo kInfo[] = {
1634                     {angle::FormatID::R16_SNORM, VK_FORMAT_R16_SNORM, false,
1635                      CopyNativeVertexData<GLshort, 1, 1, 0>, false},
1636                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
1637                      CopyTo32FVertexData<GLshort, 1, 1, true>, true}};
1638                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1639             }
1640             break;
1641 
1642         case angle::FormatID::R16_SSCALED:
1643             internalFormat           = GL_R16_SSCALED_ANGLEX;
1644             actualImageFormatID      = angle::FormatID::R16_SSCALED;
1645             vkImageFormat            = VK_FORMAT_R16_SSCALED;
1646             imageInitializerFunction = nullptr;
1647             {
1648                 static constexpr BufferFormatInitInfo kInfo[] = {
1649                     {angle::FormatID::R16_SSCALED, VK_FORMAT_R16_SSCALED, false,
1650                      CopyNativeVertexData<GLshort, 1, 1, 0>, false},
1651                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
1652                      CopyTo32FVertexData<GLshort, 1, 1, false>, true}};
1653                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1654             }
1655             break;
1656 
1657         case angle::FormatID::R16_UINT:
1658             internalFormat               = GL_R16UI;
1659             actualImageFormatID          = angle::FormatID::R16_UINT;
1660             vkImageFormat                = VK_FORMAT_R16_UINT;
1661             imageInitializerFunction     = nullptr;
1662             actualBufferFormatID         = angle::FormatID::R16_UINT;
1663             vkBufferFormat               = VK_FORMAT_R16_UINT;
1664             vkBufferFormatIsPacked       = false;
1665             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
1666             vertexLoadRequiresConversion = false;
1667             break;
1668 
1669         case angle::FormatID::R16_UNORM:
1670             internalFormat           = GL_R16_EXT;
1671             actualImageFormatID      = angle::FormatID::R16_UNORM;
1672             vkImageFormat            = VK_FORMAT_R16_UNORM;
1673             imageInitializerFunction = nullptr;
1674             {
1675                 static constexpr BufferFormatInitInfo kInfo[] = {
1676                     {angle::FormatID::R16_UNORM, VK_FORMAT_R16_UNORM, false,
1677                      CopyNativeVertexData<GLushort, 1, 1, 0>, false},
1678                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
1679                      CopyTo32FVertexData<GLushort, 1, 1, true>, true}};
1680                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1681             }
1682             break;
1683 
1684         case angle::FormatID::R16_USCALED:
1685             internalFormat           = GL_R16_USCALED_ANGLEX;
1686             actualImageFormatID      = angle::FormatID::R16_USCALED;
1687             vkImageFormat            = VK_FORMAT_R16_USCALED;
1688             imageInitializerFunction = nullptr;
1689             {
1690                 static constexpr BufferFormatInitInfo kInfo[] = {
1691                     {angle::FormatID::R16_USCALED, VK_FORMAT_R16_USCALED, false,
1692                      CopyNativeVertexData<GLushort, 1, 1, 0>, false},
1693                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
1694                      CopyTo32FVertexData<GLushort, 1, 1, false>, true}};
1695                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
1696             }
1697             break;
1698 
1699         case angle::FormatID::R32G32B32A32_FIXED:
1700             internalFormat = GL_RGBA32_FIXED_ANGLEX;
1701 
1702             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
1703             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
1704             vkBufferFormatIsPacked       = false;
1705             vertexLoadFunction           = Copy32FixedTo32FVertexData<4, 4>;
1706             vertexLoadRequiresConversion = true;
1707             break;
1708 
1709         case angle::FormatID::R32G32B32A32_FLOAT:
1710             internalFormat               = GL_RGBA32F;
1711             actualImageFormatID          = angle::FormatID::R32G32B32A32_FLOAT;
1712             vkImageFormat                = VK_FORMAT_R32G32B32A32_SFLOAT;
1713             imageInitializerFunction     = nullptr;
1714             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
1715             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
1716             vkBufferFormatIsPacked       = false;
1717             vertexLoadFunction           = CopyNativeVertexData<GLfloat, 4, 4, 0>;
1718             vertexLoadRequiresConversion = false;
1719             break;
1720 
1721         case angle::FormatID::R32G32B32A32_SINT:
1722             internalFormat               = GL_RGBA32I;
1723             actualImageFormatID          = angle::FormatID::R32G32B32A32_SINT;
1724             vkImageFormat                = VK_FORMAT_R32G32B32A32_SINT;
1725             imageInitializerFunction     = nullptr;
1726             actualBufferFormatID         = angle::FormatID::R32G32B32A32_SINT;
1727             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SINT;
1728             vkBufferFormatIsPacked       = false;
1729             vertexLoadFunction           = CopyNativeVertexData<GLint, 4, 4, 0>;
1730             vertexLoadRequiresConversion = false;
1731             break;
1732 
1733         case angle::FormatID::R32G32B32A32_SNORM:
1734             internalFormat = GL_RGBA32_SNORM_ANGLEX;
1735 
1736             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
1737             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
1738             vkBufferFormatIsPacked       = false;
1739             vertexLoadFunction           = CopyTo32FVertexData<GLint, 4, 4, true>;
1740             vertexLoadRequiresConversion = true;
1741             break;
1742 
1743         case angle::FormatID::R32G32B32A32_SSCALED:
1744             internalFormat = GL_RGBA32_SSCALED_ANGLEX;
1745 
1746             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
1747             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
1748             vkBufferFormatIsPacked       = false;
1749             vertexLoadFunction           = CopyTo32FVertexData<GLint, 4, 4, false>;
1750             vertexLoadRequiresConversion = true;
1751             break;
1752 
1753         case angle::FormatID::R32G32B32A32_UINT:
1754             internalFormat               = GL_RGBA32UI;
1755             actualImageFormatID          = angle::FormatID::R32G32B32A32_UINT;
1756             vkImageFormat                = VK_FORMAT_R32G32B32A32_UINT;
1757             imageInitializerFunction     = nullptr;
1758             actualBufferFormatID         = angle::FormatID::R32G32B32A32_UINT;
1759             vkBufferFormat               = VK_FORMAT_R32G32B32A32_UINT;
1760             vkBufferFormatIsPacked       = false;
1761             vertexLoadFunction           = CopyNativeVertexData<GLuint, 4, 4, 0>;
1762             vertexLoadRequiresConversion = false;
1763             break;
1764 
1765         case angle::FormatID::R32G32B32A32_UNORM:
1766             internalFormat = GL_RGBA32_UNORM_ANGLEX;
1767 
1768             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
1769             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
1770             vkBufferFormatIsPacked       = false;
1771             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 4, 4, true>;
1772             vertexLoadRequiresConversion = true;
1773             break;
1774 
1775         case angle::FormatID::R32G32B32A32_USCALED:
1776             internalFormat = GL_RGBA32_USCALED_ANGLEX;
1777 
1778             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
1779             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
1780             vkBufferFormatIsPacked       = false;
1781             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 4, 4, false>;
1782             vertexLoadRequiresConversion = true;
1783             break;
1784 
1785         case angle::FormatID::R32G32B32_FIXED:
1786             internalFormat = GL_RGB32_FIXED_ANGLEX;
1787 
1788             actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
1789             vkBufferFormat               = VK_FORMAT_R32G32B32_SFLOAT;
1790             vkBufferFormatIsPacked       = false;
1791             vertexLoadFunction           = Copy32FixedTo32FVertexData<3, 3>;
1792             vertexLoadRequiresConversion = true;
1793             break;
1794 
1795         case angle::FormatID::R32G32B32_FLOAT:
1796             internalFormat = GL_RGB32F;
1797             {
1798                 static constexpr ImageFormatInitInfo kInfo[] = {
1799                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, nullptr},
1800                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT,
1801                      Initialize4ComponentData<GLfloat, 0x00000000, 0x00000000, 0x00000000,
1802                                               gl::Float32One>}};
1803                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1804             }
1805             actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
1806             vkBufferFormat               = VK_FORMAT_R32G32B32_SFLOAT;
1807             vkBufferFormatIsPacked       = false;
1808             vertexLoadFunction           = CopyNativeVertexData<GLfloat, 3, 3, 0>;
1809             vertexLoadRequiresConversion = false;
1810             break;
1811 
1812         case angle::FormatID::R32G32B32_SINT:
1813             internalFormat = GL_RGB32I;
1814             {
1815                 static constexpr ImageFormatInitInfo kInfo[] = {
1816                     {angle::FormatID::R32G32B32_SINT, VK_FORMAT_R32G32B32_SINT, nullptr},
1817                     {angle::FormatID::R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_SINT,
1818                      Initialize4ComponentData<GLint, 0x00000000, 0x00000000, 0x00000000,
1819                                               0x00000001>}};
1820                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1821             }
1822             actualBufferFormatID         = angle::FormatID::R32G32B32_SINT;
1823             vkBufferFormat               = VK_FORMAT_R32G32B32_SINT;
1824             vkBufferFormatIsPacked       = false;
1825             vertexLoadFunction           = CopyNativeVertexData<GLint, 3, 3, 0>;
1826             vertexLoadRequiresConversion = false;
1827             break;
1828 
1829         case angle::FormatID::R32G32B32_SNORM:
1830             internalFormat = GL_RGB32_SNORM_ANGLEX;
1831 
1832             actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
1833             vkBufferFormat               = VK_FORMAT_R32G32B32_SFLOAT;
1834             vkBufferFormatIsPacked       = false;
1835             vertexLoadFunction           = CopyTo32FVertexData<GLint, 3, 3, true>;
1836             vertexLoadRequiresConversion = true;
1837             break;
1838 
1839         case angle::FormatID::R32G32B32_SSCALED:
1840             internalFormat = GL_RGB32_SSCALED_ANGLEX;
1841 
1842             actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
1843             vkBufferFormat               = VK_FORMAT_R32G32B32_SFLOAT;
1844             vkBufferFormatIsPacked       = false;
1845             vertexLoadFunction           = CopyTo32FVertexData<GLint, 3, 3, false>;
1846             vertexLoadRequiresConversion = true;
1847             break;
1848 
1849         case angle::FormatID::R32G32B32_UINT:
1850             internalFormat = GL_RGB32UI;
1851             {
1852                 static constexpr ImageFormatInitInfo kInfo[] = {
1853                     {angle::FormatID::R32G32B32_UINT, VK_FORMAT_R32G32B32_UINT, nullptr},
1854                     {angle::FormatID::R32G32B32A32_UINT, VK_FORMAT_R32G32B32A32_UINT,
1855                      Initialize4ComponentData<GLuint, 0x00000000, 0x00000000, 0x00000000,
1856                                               0x00000001>}};
1857                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
1858             }
1859             actualBufferFormatID         = angle::FormatID::R32G32B32_UINT;
1860             vkBufferFormat               = VK_FORMAT_R32G32B32_UINT;
1861             vkBufferFormatIsPacked       = false;
1862             vertexLoadFunction           = CopyNativeVertexData<GLuint, 3, 3, 0>;
1863             vertexLoadRequiresConversion = false;
1864             break;
1865 
1866         case angle::FormatID::R32G32B32_UNORM:
1867             internalFormat = GL_RGB32_UNORM_ANGLEX;
1868 
1869             actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
1870             vkBufferFormat               = VK_FORMAT_R32G32B32_SFLOAT;
1871             vkBufferFormatIsPacked       = false;
1872             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 3, 3, true>;
1873             vertexLoadRequiresConversion = true;
1874             break;
1875 
1876         case angle::FormatID::R32G32B32_USCALED:
1877             internalFormat = GL_RGB32_USCALED_ANGLEX;
1878 
1879             actualBufferFormatID         = angle::FormatID::R32G32B32_FLOAT;
1880             vkBufferFormat               = VK_FORMAT_R32G32B32_SFLOAT;
1881             vkBufferFormatIsPacked       = false;
1882             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 3, 3, false>;
1883             vertexLoadRequiresConversion = true;
1884             break;
1885 
1886         case angle::FormatID::R32G32_FIXED:
1887             internalFormat = GL_RG32_FIXED_ANGLEX;
1888 
1889             actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
1890             vkBufferFormat               = VK_FORMAT_R32G32_SFLOAT;
1891             vkBufferFormatIsPacked       = false;
1892             vertexLoadFunction           = Copy32FixedTo32FVertexData<2, 2>;
1893             vertexLoadRequiresConversion = true;
1894             break;
1895 
1896         case angle::FormatID::R32G32_FLOAT:
1897             internalFormat               = GL_RG32F;
1898             actualImageFormatID          = angle::FormatID::R32G32_FLOAT;
1899             vkImageFormat                = VK_FORMAT_R32G32_SFLOAT;
1900             imageInitializerFunction     = nullptr;
1901             actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
1902             vkBufferFormat               = VK_FORMAT_R32G32_SFLOAT;
1903             vkBufferFormatIsPacked       = false;
1904             vertexLoadFunction           = CopyNativeVertexData<GLfloat, 2, 2, 0>;
1905             vertexLoadRequiresConversion = false;
1906             break;
1907 
1908         case angle::FormatID::R32G32_SINT:
1909             internalFormat               = GL_RG32I;
1910             actualImageFormatID          = angle::FormatID::R32G32_SINT;
1911             vkImageFormat                = VK_FORMAT_R32G32_SINT;
1912             imageInitializerFunction     = nullptr;
1913             actualBufferFormatID         = angle::FormatID::R32G32_SINT;
1914             vkBufferFormat               = VK_FORMAT_R32G32_SINT;
1915             vkBufferFormatIsPacked       = false;
1916             vertexLoadFunction           = CopyNativeVertexData<GLint, 2, 2, 0>;
1917             vertexLoadRequiresConversion = false;
1918             break;
1919 
1920         case angle::FormatID::R32G32_SNORM:
1921             internalFormat = GL_RG32_SNORM_ANGLEX;
1922 
1923             actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
1924             vkBufferFormat               = VK_FORMAT_R32G32_SFLOAT;
1925             vkBufferFormatIsPacked       = false;
1926             vertexLoadFunction           = CopyTo32FVertexData<GLint, 2, 2, true>;
1927             vertexLoadRequiresConversion = true;
1928             break;
1929 
1930         case angle::FormatID::R32G32_SSCALED:
1931             internalFormat = GL_RG32_SSCALED_ANGLEX;
1932 
1933             actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
1934             vkBufferFormat               = VK_FORMAT_R32G32_SFLOAT;
1935             vkBufferFormatIsPacked       = false;
1936             vertexLoadFunction           = CopyTo32FVertexData<GLint, 2, 2, false>;
1937             vertexLoadRequiresConversion = true;
1938             break;
1939 
1940         case angle::FormatID::R32G32_UINT:
1941             internalFormat               = GL_RG32UI;
1942             actualImageFormatID          = angle::FormatID::R32G32_UINT;
1943             vkImageFormat                = VK_FORMAT_R32G32_UINT;
1944             imageInitializerFunction     = nullptr;
1945             actualBufferFormatID         = angle::FormatID::R32G32_UINT;
1946             vkBufferFormat               = VK_FORMAT_R32G32_UINT;
1947             vkBufferFormatIsPacked       = false;
1948             vertexLoadFunction           = CopyNativeVertexData<GLuint, 2, 2, 0>;
1949             vertexLoadRequiresConversion = false;
1950             break;
1951 
1952         case angle::FormatID::R32G32_UNORM:
1953             internalFormat = GL_RG32_UNORM_ANGLEX;
1954 
1955             actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
1956             vkBufferFormat               = VK_FORMAT_R32G32_SFLOAT;
1957             vkBufferFormatIsPacked       = false;
1958             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 2, 2, true>;
1959             vertexLoadRequiresConversion = true;
1960             break;
1961 
1962         case angle::FormatID::R32G32_USCALED:
1963             internalFormat = GL_RG32_USCALED_ANGLEX;
1964 
1965             actualBufferFormatID         = angle::FormatID::R32G32_FLOAT;
1966             vkBufferFormat               = VK_FORMAT_R32G32_SFLOAT;
1967             vkBufferFormatIsPacked       = false;
1968             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 2, 2, false>;
1969             vertexLoadRequiresConversion = true;
1970             break;
1971 
1972         case angle::FormatID::R32_FIXED:
1973             internalFormat = GL_R32_FIXED_ANGLEX;
1974 
1975             actualBufferFormatID         = angle::FormatID::R32_FLOAT;
1976             vkBufferFormat               = VK_FORMAT_R32_SFLOAT;
1977             vkBufferFormatIsPacked       = false;
1978             vertexLoadFunction           = Copy32FixedTo32FVertexData<1, 1>;
1979             vertexLoadRequiresConversion = true;
1980             break;
1981 
1982         case angle::FormatID::R32_FLOAT:
1983             internalFormat               = GL_R32F;
1984             actualImageFormatID          = angle::FormatID::R32_FLOAT;
1985             vkImageFormat                = VK_FORMAT_R32_SFLOAT;
1986             imageInitializerFunction     = nullptr;
1987             actualBufferFormatID         = angle::FormatID::R32_FLOAT;
1988             vkBufferFormat               = VK_FORMAT_R32_SFLOAT;
1989             vkBufferFormatIsPacked       = false;
1990             vertexLoadFunction           = CopyNativeVertexData<GLfloat, 1, 1, 0>;
1991             vertexLoadRequiresConversion = false;
1992             break;
1993 
1994         case angle::FormatID::R32_SINT:
1995             internalFormat               = GL_R32I;
1996             actualImageFormatID          = angle::FormatID::R32_SINT;
1997             vkImageFormat                = VK_FORMAT_R32_SINT;
1998             imageInitializerFunction     = nullptr;
1999             actualBufferFormatID         = angle::FormatID::R32_SINT;
2000             vkBufferFormat               = VK_FORMAT_R32_SINT;
2001             vkBufferFormatIsPacked       = false;
2002             vertexLoadFunction           = CopyNativeVertexData<GLint, 1, 1, 0>;
2003             vertexLoadRequiresConversion = false;
2004             break;
2005 
2006         case angle::FormatID::R32_SNORM:
2007             internalFormat = GL_R32_SNORM_ANGLEX;
2008 
2009             actualBufferFormatID         = angle::FormatID::R32_FLOAT;
2010             vkBufferFormat               = VK_FORMAT_R32_SFLOAT;
2011             vkBufferFormatIsPacked       = false;
2012             vertexLoadFunction           = CopyTo32FVertexData<GLint, 1, 1, true>;
2013             vertexLoadRequiresConversion = true;
2014             break;
2015 
2016         case angle::FormatID::R32_SSCALED:
2017             internalFormat = GL_R32_SSCALED_ANGLEX;
2018 
2019             actualBufferFormatID         = angle::FormatID::R32_FLOAT;
2020             vkBufferFormat               = VK_FORMAT_R32_SFLOAT;
2021             vkBufferFormatIsPacked       = false;
2022             vertexLoadFunction           = CopyTo32FVertexData<GLint, 1, 1, false>;
2023             vertexLoadRequiresConversion = true;
2024             break;
2025 
2026         case angle::FormatID::R32_UINT:
2027             internalFormat               = GL_R32UI;
2028             actualImageFormatID          = angle::FormatID::R32_UINT;
2029             vkImageFormat                = VK_FORMAT_R32_UINT;
2030             imageInitializerFunction     = nullptr;
2031             actualBufferFormatID         = angle::FormatID::R32_UINT;
2032             vkBufferFormat               = VK_FORMAT_R32_UINT;
2033             vkBufferFormatIsPacked       = false;
2034             vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
2035             vertexLoadRequiresConversion = false;
2036             break;
2037 
2038         case angle::FormatID::R32_UNORM:
2039             internalFormat = GL_R32_UNORM_ANGLEX;
2040 
2041             actualBufferFormatID         = angle::FormatID::R32_FLOAT;
2042             vkBufferFormat               = VK_FORMAT_R32_SFLOAT;
2043             vkBufferFormatIsPacked       = false;
2044             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 1, 1, true>;
2045             vertexLoadRequiresConversion = true;
2046             break;
2047 
2048         case angle::FormatID::R32_USCALED:
2049             internalFormat = GL_R32_USCALED_ANGLEX;
2050 
2051             actualBufferFormatID         = angle::FormatID::R32_FLOAT;
2052             vkBufferFormat               = VK_FORMAT_R32_SFLOAT;
2053             vkBufferFormatIsPacked       = false;
2054             vertexLoadFunction           = CopyTo32FVertexData<GLuint, 1, 1, false>;
2055             vertexLoadRequiresConversion = true;
2056             break;
2057 
2058         case angle::FormatID::R4G4B4A4_UNORM:
2059             internalFormat = GL_RGBA4;
2060             {
2061                 static constexpr ImageFormatInitInfo kInfo[] = {
2062                     {angle::FormatID::R4G4B4A4_UNORM, VK_FORMAT_R4G4B4A4_UNORM_PACK16, nullptr},
2063                     {angle::FormatID::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, nullptr}};
2064                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
2065             }
2066             actualBufferFormatID         = angle::FormatID::R4G4B4A4_UNORM;
2067             vkBufferFormat               = VK_FORMAT_R4G4B4A4_UNORM_PACK16;
2068             vkBufferFormatIsPacked       = true;
2069             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
2070             vertexLoadRequiresConversion = false;
2071             break;
2072 
2073         case angle::FormatID::R5G5B5A1_UNORM:
2074             internalFormat = GL_RGB5_A1;
2075             {
2076                 static constexpr ImageFormatInitInfo kInfo[] = {
2077                     {angle::FormatID::R5G5B5A1_UNORM, VK_FORMAT_R5G5B5A1_UNORM_PACK16, nullptr},
2078                     {angle::FormatID::A1R5G5B5_UNORM, VK_FORMAT_A1R5G5B5_UNORM_PACK16, nullptr}};
2079                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
2080             }
2081             actualBufferFormatID         = angle::FormatID::R5G5B5A1_UNORM;
2082             vkBufferFormat               = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
2083             vkBufferFormatIsPacked       = true;
2084             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
2085             vertexLoadRequiresConversion = false;
2086             break;
2087 
2088         case angle::FormatID::R5G6B5_UNORM:
2089             internalFormat               = GL_RGB565;
2090             actualImageFormatID          = angle::FormatID::R5G6B5_UNORM;
2091             vkImageFormat                = VK_FORMAT_R5G6B5_UNORM_PACK16;
2092             imageInitializerFunction     = nullptr;
2093             actualBufferFormatID         = angle::FormatID::R5G6B5_UNORM;
2094             vkBufferFormat               = VK_FORMAT_R5G6B5_UNORM_PACK16;
2095             vkBufferFormatIsPacked       = true;
2096             vertexLoadFunction           = CopyNativeVertexData<GLushort, 1, 1, 0>;
2097             vertexLoadRequiresConversion = false;
2098             break;
2099 
2100         case angle::FormatID::R8G8B8A8_SINT:
2101             internalFormat               = GL_RGBA8I;
2102             actualImageFormatID          = angle::FormatID::R8G8B8A8_SINT;
2103             vkImageFormat                = VK_FORMAT_R8G8B8A8_SINT;
2104             imageInitializerFunction     = nullptr;
2105             actualBufferFormatID         = angle::FormatID::R8G8B8A8_SINT;
2106             vkBufferFormat               = VK_FORMAT_R8G8B8A8_SINT;
2107             vkBufferFormatIsPacked       = false;
2108             vertexLoadFunction           = CopyNativeVertexData<GLbyte, 4, 4, 0>;
2109             vertexLoadRequiresConversion = false;
2110             break;
2111 
2112         case angle::FormatID::R8G8B8A8_SNORM:
2113             internalFormat           = GL_RGBA8_SNORM;
2114             actualImageFormatID      = angle::FormatID::R8G8B8A8_SNORM;
2115             vkImageFormat            = VK_FORMAT_R8G8B8A8_SNORM;
2116             imageInitializerFunction = nullptr;
2117             {
2118                 static constexpr BufferFormatInitInfo kInfo[] = {
2119                     {angle::FormatID::R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SNORM, false,
2120                      CopyNativeVertexData<GLbyte, 4, 4, 0>, false},
2121                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
2122                      CopyTo32FVertexData<GLbyte, 4, 4, true>, true}};
2123                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2124             }
2125             break;
2126 
2127         case angle::FormatID::R8G8B8A8_SSCALED:
2128             internalFormat           = GL_RGBA8_SSCALED_ANGLEX;
2129             actualImageFormatID      = angle::FormatID::R8G8B8A8_SSCALED;
2130             vkImageFormat            = VK_FORMAT_R8G8B8A8_SSCALED;
2131             imageInitializerFunction = nullptr;
2132             {
2133                 static constexpr BufferFormatInitInfo kInfo[] = {
2134                     {angle::FormatID::R8G8B8A8_SSCALED, VK_FORMAT_R8G8B8A8_SSCALED, false,
2135                      CopyNativeVertexData<GLbyte, 4, 4, 0>, false},
2136                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
2137                      CopyTo32FVertexData<GLbyte, 4, 4, false>, true}};
2138                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2139             }
2140             break;
2141 
2142         case angle::FormatID::R8G8B8A8_TYPELESS:
2143             // This format is not implemented in Vulkan.
2144             break;
2145 
2146         case angle::FormatID::R8G8B8A8_TYPELESS_SRGB:
2147             // This format is not implemented in Vulkan.
2148             break;
2149 
2150         case angle::FormatID::R8G8B8A8_UINT:
2151             internalFormat               = GL_RGBA8UI;
2152             actualImageFormatID          = angle::FormatID::R8G8B8A8_UINT;
2153             vkImageFormat                = VK_FORMAT_R8G8B8A8_UINT;
2154             imageInitializerFunction     = nullptr;
2155             actualBufferFormatID         = angle::FormatID::R8G8B8A8_UINT;
2156             vkBufferFormat               = VK_FORMAT_R8G8B8A8_UINT;
2157             vkBufferFormatIsPacked       = false;
2158             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
2159             vertexLoadRequiresConversion = false;
2160             break;
2161 
2162         case angle::FormatID::R8G8B8A8_UNORM:
2163             internalFormat           = GL_RGBA8;
2164             actualImageFormatID      = angle::FormatID::R8G8B8A8_UNORM;
2165             vkImageFormat            = VK_FORMAT_R8G8B8A8_UNORM;
2166             imageInitializerFunction = nullptr;
2167             {
2168                 static constexpr BufferFormatInitInfo kInfo[] = {
2169                     {angle::FormatID::R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, false,
2170                      CopyNativeVertexData<GLubyte, 4, 4, 0>, false},
2171                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
2172                      CopyTo32FVertexData<GLubyte, 4, 4, true>, true}};
2173                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2174             }
2175             break;
2176 
2177         case angle::FormatID::R8G8B8A8_UNORM_SRGB:
2178             internalFormat               = GL_SRGB8_ALPHA8;
2179             actualImageFormatID          = angle::FormatID::R8G8B8A8_UNORM_SRGB;
2180             vkImageFormat                = VK_FORMAT_R8G8B8A8_SRGB;
2181             imageInitializerFunction     = nullptr;
2182             actualBufferFormatID         = angle::FormatID::R8G8B8A8_UNORM_SRGB;
2183             vkBufferFormat               = VK_FORMAT_R8G8B8A8_SRGB;
2184             vkBufferFormatIsPacked       = false;
2185             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 4, 4, 0>;
2186             vertexLoadRequiresConversion = false;
2187             break;
2188 
2189         case angle::FormatID::R8G8B8A8_USCALED:
2190             internalFormat           = GL_RGBA8_USCALED_ANGLEX;
2191             actualImageFormatID      = angle::FormatID::R8G8B8A8_USCALED;
2192             vkImageFormat            = VK_FORMAT_R8G8B8A8_USCALED;
2193             imageInitializerFunction = nullptr;
2194             {
2195                 static constexpr BufferFormatInitInfo kInfo[] = {
2196                     {angle::FormatID::R8G8B8A8_USCALED, VK_FORMAT_R8G8B8A8_USCALED, false,
2197                      CopyNativeVertexData<GLubyte, 4, 4, 0>, false},
2198                     {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
2199                      CopyTo32FVertexData<GLubyte, 4, 4, false>, true}};
2200                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2201             }
2202             break;
2203 
2204         case angle::FormatID::R8G8B8_SINT:
2205             internalFormat = GL_RGB8I;
2206             {
2207                 static constexpr ImageFormatInitInfo kInfo[] = {
2208                     {angle::FormatID::R8G8B8_SINT, VK_FORMAT_R8G8B8_SINT, nullptr},
2209                     {angle::FormatID::R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SINT,
2210                      Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x01>}};
2211                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
2212             }
2213             {
2214                 static constexpr BufferFormatInitInfo kInfo[] = {
2215                     {angle::FormatID::R8G8B8_SINT, VK_FORMAT_R8G8B8_SINT, false,
2216                      CopyNativeVertexData<GLbyte, 3, 3, 0>, false},
2217                     {angle::FormatID::R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SINT, false,
2218                      CopyNativeVertexData<GLbyte, 3, 4, 0>, true}};
2219                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2220             }
2221             break;
2222 
2223         case angle::FormatID::R8G8B8_SNORM:
2224             internalFormat = GL_RGB8_SNORM;
2225             {
2226                 static constexpr ImageFormatInitInfo kInfo[] = {
2227                     {angle::FormatID::R8G8B8_SNORM, VK_FORMAT_R8G8B8_SNORM, nullptr},
2228                     {angle::FormatID::R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SNORM,
2229                      Initialize4ComponentData<GLbyte, 0x00, 0x00, 0x00, 0x7F>}};
2230                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
2231             }
2232             {
2233                 static constexpr BufferFormatInitInfo kInfo[] = {
2234                     {angle::FormatID::R8G8B8_SNORM, VK_FORMAT_R8G8B8_SNORM, false,
2235                      CopyNativeVertexData<GLbyte, 3, 3, 0>, false},
2236                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, false,
2237                      CopyTo32FVertexData<GLbyte, 3, 3, true>, true}};
2238                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2239             }
2240             break;
2241 
2242         case angle::FormatID::R8G8B8_SSCALED:
2243             internalFormat           = GL_RGB8_SSCALED_ANGLEX;
2244             actualImageFormatID      = angle::FormatID::R8G8B8_SSCALED;
2245             vkImageFormat            = VK_FORMAT_R8G8B8_SSCALED;
2246             imageInitializerFunction = nullptr;
2247             {
2248                 static constexpr BufferFormatInitInfo kInfo[] = {
2249                     {angle::FormatID::R8G8B8_SSCALED, VK_FORMAT_R8G8B8_SSCALED, false,
2250                      CopyNativeVertexData<GLbyte, 3, 3, 0>, false},
2251                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, false,
2252                      CopyTo32FVertexData<GLbyte, 3, 3, false>, true}};
2253                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2254             }
2255             break;
2256 
2257         case angle::FormatID::R8G8B8_UINT:
2258             internalFormat = GL_RGB8UI;
2259             {
2260                 static constexpr ImageFormatInitInfo kInfo[] = {
2261                     {angle::FormatID::R8G8B8_UINT, VK_FORMAT_R8G8B8_UINT, nullptr},
2262                     {angle::FormatID::R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UINT,
2263                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0x01>}};
2264                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
2265             }
2266             {
2267                 static constexpr BufferFormatInitInfo kInfo[] = {
2268                     {angle::FormatID::R8G8B8_UINT, VK_FORMAT_R8G8B8_UINT, false,
2269                      CopyNativeVertexData<GLubyte, 3, 3, 0>, false},
2270                     {angle::FormatID::R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UINT, false,
2271                      CopyNativeVertexData<GLubyte, 3, 4, 0>, true}};
2272                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2273             }
2274             break;
2275 
2276         case angle::FormatID::R8G8B8_UNORM:
2277             internalFormat           = GL_RGB8;
2278             actualImageFormatID      = angle::FormatID::R8G8B8A8_UNORM;
2279             vkImageFormat            = VK_FORMAT_R8G8B8A8_UNORM;
2280             imageInitializerFunction = Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>;
2281             actualBufferFormatID     = angle::FormatID::R32G32B32_FLOAT;
2282             vkBufferFormat           = VK_FORMAT_R32G32B32_SFLOAT;
2283             vkBufferFormatIsPacked   = false;
2284             vertexLoadFunction       = CopyTo32FVertexData<GLubyte, 3, 3, true>;
2285             vertexLoadRequiresConversion = true;
2286             break;
2287 
2288         case angle::FormatID::R8G8B8_UNORM_SRGB:
2289             internalFormat = GL_SRGB8;
2290             {
2291                 static constexpr ImageFormatInitInfo kInfo[] = {
2292                     {angle::FormatID::R8G8B8_UNORM_SRGB, VK_FORMAT_R8G8B8_SRGB, nullptr},
2293                     {angle::FormatID::R8G8B8A8_UNORM_SRGB, VK_FORMAT_R8G8B8A8_SRGB,
2294                      Initialize4ComponentData<GLubyte, 0x00, 0x00, 0x00, 0xFF>}};
2295                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
2296             }
2297             actualBufferFormatID         = angle::FormatID::R8G8B8_UNORM_SRGB;
2298             vkBufferFormat               = VK_FORMAT_R8G8B8_SRGB;
2299             vkBufferFormatIsPacked       = false;
2300             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 3, 3, 0>;
2301             vertexLoadRequiresConversion = false;
2302             break;
2303 
2304         case angle::FormatID::R8G8B8_USCALED:
2305             internalFormat           = GL_RGB8_USCALED_ANGLEX;
2306             actualImageFormatID      = angle::FormatID::R8G8B8_USCALED;
2307             vkImageFormat            = VK_FORMAT_R8G8B8_USCALED;
2308             imageInitializerFunction = nullptr;
2309             {
2310                 static constexpr BufferFormatInitInfo kInfo[] = {
2311                     {angle::FormatID::R8G8B8_USCALED, VK_FORMAT_R8G8B8_USCALED, false,
2312                      CopyNativeVertexData<GLubyte, 3, 3, 0>, false},
2313                     {angle::FormatID::R32G32B32_FLOAT, VK_FORMAT_R32G32B32_SFLOAT, false,
2314                      CopyTo32FVertexData<GLubyte, 3, 3, false>, true}};
2315                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2316             }
2317             break;
2318 
2319         case angle::FormatID::R8G8_SINT:
2320             internalFormat               = GL_RG8I;
2321             actualImageFormatID          = angle::FormatID::R8G8_SINT;
2322             vkImageFormat                = VK_FORMAT_R8G8_SINT;
2323             imageInitializerFunction     = nullptr;
2324             actualBufferFormatID         = angle::FormatID::R8G8_SINT;
2325             vkBufferFormat               = VK_FORMAT_R8G8_SINT;
2326             vkBufferFormatIsPacked       = false;
2327             vertexLoadFunction           = CopyNativeVertexData<GLbyte, 2, 2, 0>;
2328             vertexLoadRequiresConversion = false;
2329             break;
2330 
2331         case angle::FormatID::R8G8_SNORM:
2332             internalFormat           = GL_RG8_SNORM;
2333             actualImageFormatID      = angle::FormatID::R8G8_SNORM;
2334             vkImageFormat            = VK_FORMAT_R8G8_SNORM;
2335             imageInitializerFunction = nullptr;
2336             {
2337                 static constexpr BufferFormatInitInfo kInfo[] = {
2338                     {angle::FormatID::R8G8_SNORM, VK_FORMAT_R8G8_SNORM, false,
2339                      CopyNativeVertexData<GLbyte, 2, 2, 0>, false},
2340                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
2341                      CopyTo32FVertexData<GLbyte, 2, 2, true>, true}};
2342                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2343             }
2344             break;
2345 
2346         case angle::FormatID::R8G8_SSCALED:
2347             internalFormat           = GL_RG8_SSCALED_ANGLEX;
2348             actualImageFormatID      = angle::FormatID::R8G8_SSCALED;
2349             vkImageFormat            = VK_FORMAT_R8G8_SSCALED;
2350             imageInitializerFunction = nullptr;
2351             {
2352                 static constexpr BufferFormatInitInfo kInfo[] = {
2353                     {angle::FormatID::R8G8_SSCALED, VK_FORMAT_R8G8_SSCALED, false,
2354                      CopyNativeVertexData<GLbyte, 2, 2, 0>, false},
2355                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
2356                      CopyTo32FVertexData<GLbyte, 2, 2, false>, true}};
2357                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2358             }
2359             break;
2360 
2361         case angle::FormatID::R8G8_UINT:
2362             internalFormat               = GL_RG8UI;
2363             actualImageFormatID          = angle::FormatID::R8G8_UINT;
2364             vkImageFormat                = VK_FORMAT_R8G8_UINT;
2365             imageInitializerFunction     = nullptr;
2366             actualBufferFormatID         = angle::FormatID::R8G8_UINT;
2367             vkBufferFormat               = VK_FORMAT_R8G8_UINT;
2368             vkBufferFormatIsPacked       = false;
2369             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 2, 2, 0>;
2370             vertexLoadRequiresConversion = false;
2371             break;
2372 
2373         case angle::FormatID::R8G8_UNORM:
2374             internalFormat           = GL_RG8;
2375             actualImageFormatID      = angle::FormatID::R8G8_UNORM;
2376             vkImageFormat            = VK_FORMAT_R8G8_UNORM;
2377             imageInitializerFunction = nullptr;
2378             {
2379                 static constexpr BufferFormatInitInfo kInfo[] = {
2380                     {angle::FormatID::R8G8_UNORM, VK_FORMAT_R8G8_UNORM, false,
2381                      CopyNativeVertexData<GLubyte, 2, 2, 0>, false},
2382                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
2383                      CopyTo32FVertexData<GLubyte, 2, 2, true>, true}};
2384                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2385             }
2386             break;
2387 
2388         case angle::FormatID::R8G8_USCALED:
2389             internalFormat           = GL_RG8_USCALED_ANGLEX;
2390             actualImageFormatID      = angle::FormatID::R8G8_USCALED;
2391             vkImageFormat            = VK_FORMAT_R8G8_USCALED;
2392             imageInitializerFunction = nullptr;
2393             {
2394                 static constexpr BufferFormatInitInfo kInfo[] = {
2395                     {angle::FormatID::R8G8_USCALED, VK_FORMAT_R8G8_USCALED, false,
2396                      CopyNativeVertexData<GLubyte, 2, 2, 0>, false},
2397                     {angle::FormatID::R32G32_FLOAT, VK_FORMAT_R32G32_SFLOAT, false,
2398                      CopyTo32FVertexData<GLubyte, 2, 2, false>, true}};
2399                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2400             }
2401             break;
2402 
2403         case angle::FormatID::R8_SINT:
2404             internalFormat               = GL_R8I;
2405             actualImageFormatID          = angle::FormatID::R8_SINT;
2406             vkImageFormat                = VK_FORMAT_R8_SINT;
2407             imageInitializerFunction     = nullptr;
2408             actualBufferFormatID         = angle::FormatID::R8_SINT;
2409             vkBufferFormat               = VK_FORMAT_R8_SINT;
2410             vkBufferFormatIsPacked       = false;
2411             vertexLoadFunction           = CopyNativeVertexData<GLbyte, 1, 1, 0>;
2412             vertexLoadRequiresConversion = false;
2413             break;
2414 
2415         case angle::FormatID::R8_SNORM:
2416             internalFormat           = GL_R8_SNORM;
2417             actualImageFormatID      = angle::FormatID::R8_SNORM;
2418             vkImageFormat            = VK_FORMAT_R8_SNORM;
2419             imageInitializerFunction = nullptr;
2420             {
2421                 static constexpr BufferFormatInitInfo kInfo[] = {
2422                     {angle::FormatID::R8_SNORM, VK_FORMAT_R8_SNORM, false,
2423                      CopyNativeVertexData<GLbyte, 1, 1, 0>, false},
2424                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
2425                      CopyTo32FVertexData<GLbyte, 1, 1, true>, true}};
2426                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2427             }
2428             break;
2429 
2430         case angle::FormatID::R8_SSCALED:
2431             internalFormat           = GL_R8_SSCALED_ANGLEX;
2432             actualImageFormatID      = angle::FormatID::R8_SSCALED;
2433             vkImageFormat            = VK_FORMAT_R8_SSCALED;
2434             imageInitializerFunction = nullptr;
2435             {
2436                 static constexpr BufferFormatInitInfo kInfo[] = {
2437                     {angle::FormatID::R8_SSCALED, VK_FORMAT_R8_SSCALED, false,
2438                      CopyNativeVertexData<GLbyte, 1, 1, 0>, false},
2439                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
2440                      CopyTo32FVertexData<GLbyte, 1, 1, false>, true}};
2441                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2442             }
2443             break;
2444 
2445         case angle::FormatID::R8_UINT:
2446             internalFormat               = GL_R8UI;
2447             actualImageFormatID          = angle::FormatID::R8_UINT;
2448             vkImageFormat                = VK_FORMAT_R8_UINT;
2449             imageInitializerFunction     = nullptr;
2450             actualBufferFormatID         = angle::FormatID::R8_UINT;
2451             vkBufferFormat               = VK_FORMAT_R8_UINT;
2452             vkBufferFormatIsPacked       = false;
2453             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 1, 1, 0>;
2454             vertexLoadRequiresConversion = false;
2455             break;
2456 
2457         case angle::FormatID::R8_UNORM:
2458             internalFormat           = GL_R8;
2459             actualImageFormatID      = angle::FormatID::R8_UNORM;
2460             vkImageFormat            = VK_FORMAT_R8_UNORM;
2461             imageInitializerFunction = nullptr;
2462             {
2463                 static constexpr BufferFormatInitInfo kInfo[] = {
2464                     {angle::FormatID::R8_UNORM, VK_FORMAT_R8_UNORM, false,
2465                      CopyNativeVertexData<GLubyte, 1, 1, 0>, false},
2466                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
2467                      CopyTo32FVertexData<GLubyte, 1, 1, true>, true}};
2468                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2469             }
2470             break;
2471 
2472         case angle::FormatID::R8_UNORM_SRGB:
2473             internalFormat               = GL_SR8_EXT;
2474             actualImageFormatID          = angle::FormatID::R8_UNORM_SRGB;
2475             vkImageFormat                = VK_FORMAT_R8_SRGB;
2476             imageInitializerFunction     = nullptr;
2477             actualBufferFormatID         = angle::FormatID::R8_UNORM_SRGB;
2478             vkBufferFormat               = VK_FORMAT_R8_SRGB;
2479             vkBufferFormatIsPacked       = false;
2480             vertexLoadFunction           = CopyNativeVertexData<GLubyte, 1, 1, 0>;
2481             vertexLoadRequiresConversion = false;
2482             break;
2483 
2484         case angle::FormatID::R8_USCALED:
2485             internalFormat           = GL_R8_USCALED_ANGLEX;
2486             actualImageFormatID      = angle::FormatID::R8_USCALED;
2487             vkImageFormat            = VK_FORMAT_R8_USCALED;
2488             imageInitializerFunction = nullptr;
2489             {
2490                 static constexpr BufferFormatInitInfo kInfo[] = {
2491                     {angle::FormatID::R8_USCALED, VK_FORMAT_R8_USCALED, false,
2492                      CopyNativeVertexData<GLubyte, 1, 1, 0>, false},
2493                     {angle::FormatID::R32_FLOAT, VK_FORMAT_R32_SFLOAT, false,
2494                      CopyTo32FVertexData<GLubyte, 1, 1, false>, true}};
2495                 initBufferFallback(renderer, kInfo, ArraySize(kInfo));
2496             }
2497             break;
2498 
2499         case angle::FormatID::R9G9B9E5_SHAREDEXP:
2500             internalFormat               = GL_RGB9_E5;
2501             actualImageFormatID          = angle::FormatID::R9G9B9E5_SHAREDEXP;
2502             vkImageFormat                = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
2503             imageInitializerFunction     = nullptr;
2504             actualBufferFormatID         = angle::FormatID::R9G9B9E5_SHAREDEXP;
2505             vkBufferFormat               = VK_FORMAT_E5B9G9R9_UFLOAT_PACK32;
2506             vkBufferFormatIsPacked       = true;
2507             vertexLoadFunction           = CopyNativeVertexData<GLuint, 1, 1, 0>;
2508             vertexLoadRequiresConversion = false;
2509             break;
2510 
2511         case angle::FormatID::S8_UINT:
2512             internalFormat = GL_STENCIL_INDEX8;
2513             {
2514                 static constexpr ImageFormatInitInfo kInfo[] = {
2515                     {angle::FormatID::S8_UINT, VK_FORMAT_S8_UINT, nullptr},
2516                     {angle::FormatID::D24_UNORM_S8_UINT, VK_FORMAT_D24_UNORM_S8_UINT, nullptr},
2517                     {angle::FormatID::D32_FLOAT_S8X24_UINT, VK_FORMAT_D32_SFLOAT_S8_UINT, nullptr},
2518                     {angle::FormatID::S8_UINT, VK_FORMAT_S8_UINT, nullptr}};
2519                 initImageFallback(renderer, kInfo, ArraySize(kInfo));
2520             }
2521             actualBufferFormatID         = angle::FormatID::S8_UINT;
2522             vkBufferFormat               = VK_FORMAT_S8_UINT;
2523             vkBufferFormatIsPacked       = false;
2524             vertexLoadFunction           = nullptr;
2525             vertexLoadRequiresConversion = false;
2526             break;
2527 
2528         case angle::FormatID::X2R10G10B10_SINT_VERTEX:
2529             internalFormat               = GL_X2_RGB10_SINT_ANGLEX;
2530             actualImageFormatID          = angle::FormatID::NONE;
2531             vkImageFormat                = VK_FORMAT_UNDEFINED;
2532             imageInitializerFunction     = nullptr;
2533             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
2534             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
2535             vkBufferFormatIsPacked       = false;
2536             vertexLoadFunction           = CopyXYZ10ToXYZW32FVertexData<true, false>;
2537             vertexLoadRequiresConversion = true;
2538             break;
2539 
2540         case angle::FormatID::X2R10G10B10_SNORM_VERTEX:
2541             internalFormat               = GL_X2_RGB10_SNORM_ANGLEX;
2542             actualImageFormatID          = angle::FormatID::NONE;
2543             vkImageFormat                = VK_FORMAT_UNDEFINED;
2544             imageInitializerFunction     = nullptr;
2545             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
2546             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
2547             vkBufferFormatIsPacked       = false;
2548             vertexLoadFunction           = CopyXYZ10ToXYZW32FVertexData<true, true>;
2549             vertexLoadRequiresConversion = true;
2550             break;
2551 
2552         case angle::FormatID::X2R10G10B10_SSCALED_VERTEX:
2553             internalFormat               = GL_X2_RGB10_SSCALED_ANGLEX;
2554             actualImageFormatID          = angle::FormatID::NONE;
2555             vkImageFormat                = VK_FORMAT_UNDEFINED;
2556             imageInitializerFunction     = nullptr;
2557             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
2558             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
2559             vkBufferFormatIsPacked       = false;
2560             vertexLoadFunction           = CopyXYZ10ToXYZW32FVertexData<true, false>;
2561             vertexLoadRequiresConversion = true;
2562             break;
2563 
2564         case angle::FormatID::X2R10G10B10_UINT_VERTEX:
2565             internalFormat               = GL_X2_RGB10_UINT_ANGLEX;
2566             actualImageFormatID          = angle::FormatID::NONE;
2567             vkImageFormat                = VK_FORMAT_UNDEFINED;
2568             imageInitializerFunction     = nullptr;
2569             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
2570             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
2571             vkBufferFormatIsPacked       = false;
2572             vertexLoadFunction           = CopyXYZ10ToXYZW32FVertexData<false, false>;
2573             vertexLoadRequiresConversion = true;
2574             break;
2575 
2576         case angle::FormatID::X2R10G10B10_UNORM_VERTEX:
2577             internalFormat               = GL_X2_RGB10_UNORM_ANGLEX;
2578             actualImageFormatID          = angle::FormatID::NONE;
2579             vkImageFormat                = VK_FORMAT_UNDEFINED;
2580             imageInitializerFunction     = nullptr;
2581             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
2582             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
2583             vkBufferFormatIsPacked       = false;
2584             vertexLoadFunction           = CopyXYZ10ToXYZW32FVertexData<false, true>;
2585             vertexLoadRequiresConversion = true;
2586             break;
2587 
2588         case angle::FormatID::X2R10G10B10_USCALED_VERTEX:
2589             internalFormat               = GL_X2_RGB10_USCALED_ANGLEX;
2590             actualImageFormatID          = angle::FormatID::NONE;
2591             vkImageFormat                = VK_FORMAT_UNDEFINED;
2592             imageInitializerFunction     = nullptr;
2593             actualBufferFormatID         = angle::FormatID::R32G32B32A32_FLOAT;
2594             vkBufferFormat               = VK_FORMAT_R32G32B32A32_SFLOAT;
2595             vkBufferFormatIsPacked       = false;
2596             vertexLoadFunction           = CopyXYZ10ToXYZW32FVertexData<false, false>;
2597             vertexLoadRequiresConversion = true;
2598             break;
2599 
2600         default:
2601             UNREACHABLE();
2602             break;
2603     }
2604 }
2605 
2606 }  // namespace vk
2607 
2608 }  // namespace rx
2609