1 //
2 // Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // formatutils11.cpp: Queries for GL image formats and their translations to D3D11
8 // formats.
9 
10 #include "libANGLE/renderer/d3d/d3d11/formatutils11.h"
11 
12 #include "image_util/copyimage.h"
13 #include "image_util/generatemip.h"
14 #include "image_util/loadimage.h"
15 
16 #include "libANGLE/formatutils.h"
17 #include "libANGLE/renderer/d3d/d3d11/copyvertex.h"
18 #include "libANGLE/renderer/d3d/d3d11/dxgi_support_table.h"
19 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
20 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
21 
22 namespace rx
23 {
24 
25 namespace d3d11
26 {
27 
SupportsMipGen(DXGI_FORMAT dxgiFormat,D3D_FEATURE_LEVEL featureLevel)28 bool SupportsMipGen(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel)
29 {
30     const auto &support = GetDXGISupport(dxgiFormat, featureLevel);
31     ASSERT((support.optionallySupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) == 0);
32     return ((support.alwaysSupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) != 0);
33 }
34 
DXGIFormatSize(GLuint pixelBits,GLuint blockWidth,GLuint blockHeight)35 DXGIFormatSize::DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight)
36     : pixelBytes(pixelBits / 8), blockWidth(blockWidth), blockHeight(blockHeight)
37 {
38 }
39 
GetDXGIFormatSizeInfo(DXGI_FORMAT format)40 const DXGIFormatSize &GetDXGIFormatSizeInfo(DXGI_FORMAT format)
41 {
42     static const DXGIFormatSize sizeUnknown(0, 0, 0);
43     static const DXGIFormatSize size128(128, 1, 1);
44     static const DXGIFormatSize size96(96, 1, 1);
45     static const DXGIFormatSize size64(64, 1, 1);
46     static const DXGIFormatSize size32(32, 1, 1);
47     static const DXGIFormatSize size16(16, 1, 1);
48     static const DXGIFormatSize size8(8, 1, 1);
49     static const DXGIFormatSize sizeBC1(64, 4, 4);
50     static const DXGIFormatSize sizeBC2(128, 4, 4);
51     static const DXGIFormatSize sizeBC3(128, 4, 4);
52     static const DXGIFormatSize sizeBC4(64, 4, 4);
53     static const DXGIFormatSize sizeBC5(128, 4, 4);
54     static const DXGIFormatSize sizeBC6H(128, 4, 4);
55     static const DXGIFormatSize sizeBC7(128, 4, 4);
56     switch (format)
57     {
58         case DXGI_FORMAT_UNKNOWN:
59             return sizeUnknown;
60         case DXGI_FORMAT_R32G32B32A32_TYPELESS:
61         case DXGI_FORMAT_R32G32B32A32_FLOAT:
62         case DXGI_FORMAT_R32G32B32A32_UINT:
63         case DXGI_FORMAT_R32G32B32A32_SINT:
64             return size128;
65         case DXGI_FORMAT_R32G32B32_TYPELESS:
66         case DXGI_FORMAT_R32G32B32_FLOAT:
67         case DXGI_FORMAT_R32G32B32_UINT:
68         case DXGI_FORMAT_R32G32B32_SINT:
69             return size96;
70         case DXGI_FORMAT_R16G16B16A16_TYPELESS:
71         case DXGI_FORMAT_R16G16B16A16_FLOAT:
72         case DXGI_FORMAT_R16G16B16A16_UNORM:
73         case DXGI_FORMAT_R16G16B16A16_UINT:
74         case DXGI_FORMAT_R16G16B16A16_SNORM:
75         case DXGI_FORMAT_R16G16B16A16_SINT:
76         case DXGI_FORMAT_R32G32_TYPELESS:
77         case DXGI_FORMAT_R32G32_FLOAT:
78         case DXGI_FORMAT_R32G32_UINT:
79         case DXGI_FORMAT_R32G32_SINT:
80         case DXGI_FORMAT_R32G8X24_TYPELESS:
81         case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
82         case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
83         case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
84             return size64;
85         case DXGI_FORMAT_R10G10B10A2_TYPELESS:
86         case DXGI_FORMAT_R10G10B10A2_UNORM:
87         case DXGI_FORMAT_R10G10B10A2_UINT:
88         case DXGI_FORMAT_R11G11B10_FLOAT:
89         case DXGI_FORMAT_R8G8B8A8_TYPELESS:
90         case DXGI_FORMAT_R8G8B8A8_UNORM:
91         case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
92         case DXGI_FORMAT_R8G8B8A8_UINT:
93         case DXGI_FORMAT_R8G8B8A8_SNORM:
94         case DXGI_FORMAT_R8G8B8A8_SINT:
95         case DXGI_FORMAT_R16G16_TYPELESS:
96         case DXGI_FORMAT_R16G16_FLOAT:
97         case DXGI_FORMAT_R16G16_UNORM:
98         case DXGI_FORMAT_R16G16_UINT:
99         case DXGI_FORMAT_R16G16_SNORM:
100         case DXGI_FORMAT_R16G16_SINT:
101         case DXGI_FORMAT_R32_TYPELESS:
102         case DXGI_FORMAT_D32_FLOAT:
103         case DXGI_FORMAT_R32_FLOAT:
104         case DXGI_FORMAT_R32_UINT:
105         case DXGI_FORMAT_R32_SINT:
106         case DXGI_FORMAT_R24G8_TYPELESS:
107         case DXGI_FORMAT_D24_UNORM_S8_UINT:
108         case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
109         case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
110             return size32;
111         case DXGI_FORMAT_R8G8_TYPELESS:
112         case DXGI_FORMAT_R8G8_UNORM:
113         case DXGI_FORMAT_R8G8_UINT:
114         case DXGI_FORMAT_R8G8_SNORM:
115         case DXGI_FORMAT_R8G8_SINT:
116         case DXGI_FORMAT_R16_TYPELESS:
117         case DXGI_FORMAT_R16_FLOAT:
118         case DXGI_FORMAT_D16_UNORM:
119         case DXGI_FORMAT_R16_UNORM:
120         case DXGI_FORMAT_R16_UINT:
121         case DXGI_FORMAT_R16_SNORM:
122         case DXGI_FORMAT_R16_SINT:
123             return size16;
124         case DXGI_FORMAT_R8_TYPELESS:
125         case DXGI_FORMAT_R8_UNORM:
126         case DXGI_FORMAT_R8_UINT:
127         case DXGI_FORMAT_R8_SNORM:
128         case DXGI_FORMAT_R8_SINT:
129         case DXGI_FORMAT_A8_UNORM:
130             return size8;
131         case DXGI_FORMAT_R1_UNORM:
132             UNREACHABLE();
133             return sizeUnknown;
134         case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
135         case DXGI_FORMAT_R8G8_B8G8_UNORM:
136         case DXGI_FORMAT_G8R8_G8B8_UNORM:
137             return size32;
138         case DXGI_FORMAT_BC1_TYPELESS:
139         case DXGI_FORMAT_BC1_UNORM:
140         case DXGI_FORMAT_BC1_UNORM_SRGB:
141             return sizeBC1;
142         case DXGI_FORMAT_BC2_TYPELESS:
143         case DXGI_FORMAT_BC2_UNORM:
144         case DXGI_FORMAT_BC2_UNORM_SRGB:
145             return sizeBC2;
146         case DXGI_FORMAT_BC3_TYPELESS:
147         case DXGI_FORMAT_BC3_UNORM:
148         case DXGI_FORMAT_BC3_UNORM_SRGB:
149             return sizeBC3;
150         case DXGI_FORMAT_BC4_TYPELESS:
151         case DXGI_FORMAT_BC4_UNORM:
152         case DXGI_FORMAT_BC4_SNORM:
153             return sizeBC4;
154         case DXGI_FORMAT_BC5_TYPELESS:
155         case DXGI_FORMAT_BC5_UNORM:
156         case DXGI_FORMAT_BC5_SNORM:
157             return sizeBC5;
158         case DXGI_FORMAT_B5G6R5_UNORM:
159         case DXGI_FORMAT_B5G5R5A1_UNORM:
160             return size16;
161         case DXGI_FORMAT_B8G8R8A8_UNORM:
162         case DXGI_FORMAT_B8G8R8X8_UNORM:
163         case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
164         case DXGI_FORMAT_B8G8R8A8_TYPELESS:
165         case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
166         case DXGI_FORMAT_B8G8R8X8_TYPELESS:
167         case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
168             return size32;
169         case DXGI_FORMAT_BC6H_TYPELESS:
170         case DXGI_FORMAT_BC6H_UF16:
171         case DXGI_FORMAT_BC6H_SF16:
172             return sizeBC6H;
173         case DXGI_FORMAT_BC7_TYPELESS:
174         case DXGI_FORMAT_BC7_UNORM:
175         case DXGI_FORMAT_BC7_UNORM_SRGB:
176             return sizeBC7;
177         case DXGI_FORMAT_AYUV:
178         case DXGI_FORMAT_Y410:
179         case DXGI_FORMAT_Y416:
180         case DXGI_FORMAT_NV12:
181         case DXGI_FORMAT_P010:
182         case DXGI_FORMAT_P016:
183         case DXGI_FORMAT_420_OPAQUE:
184         case DXGI_FORMAT_YUY2:
185         case DXGI_FORMAT_Y210:
186         case DXGI_FORMAT_Y216:
187         case DXGI_FORMAT_NV11:
188         case DXGI_FORMAT_AI44:
189         case DXGI_FORMAT_IA44:
190         case DXGI_FORMAT_P8:
191         case DXGI_FORMAT_A8P8:
192             UNREACHABLE();
193             return sizeUnknown;
194         case DXGI_FORMAT_B4G4R4A4_UNORM:
195             return size16;
196         default:
197             UNREACHABLE();
198             return sizeUnknown;
199     }
200 }
201 
VertexFormat()202 constexpr VertexFormat::VertexFormat()
203     : conversionType(VERTEX_CONVERT_NONE), nativeFormat(DXGI_FORMAT_UNKNOWN), copyFunction(nullptr)
204 {
205 }
206 
VertexFormat(VertexConversionType conversionTypeIn,DXGI_FORMAT nativeFormatIn,VertexCopyFunction copyFunctionIn)207 constexpr VertexFormat::VertexFormat(VertexConversionType conversionTypeIn,
208                                      DXGI_FORMAT nativeFormatIn,
209                                      VertexCopyFunction copyFunctionIn)
210     : conversionType(conversionTypeIn), nativeFormat(nativeFormatIn), copyFunction(copyFunctionIn)
211 {
212 }
213 
GetVertexFormatInfo_FL_9_3(gl::VertexFormatType vertexFormatType)214 const VertexFormat *GetVertexFormatInfo_FL_9_3(gl::VertexFormatType vertexFormatType)
215 {
216     // D3D11 Feature Level 9_3 doesn't support as many formats for vertex buffer resource as Feature
217     // Level 10_0+.
218     // http://msdn.microsoft.com/en-us/library/windows/desktop/ff471324(v=vs.85).aspx
219 
220     switch (vertexFormatType)
221     {
222         // GL_BYTE -- unnormalized
223         case gl::VERTEX_FORMAT_SBYTE1:
224         {
225             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
226                                                &Copy8SintTo16SintVertexData<1, 2>);
227             return &info;
228         }
229         case gl::VERTEX_FORMAT_SBYTE2:
230         {
231             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
232                                                &Copy8SintTo16SintVertexData<2, 2>);
233             return &info;
234         }
235         case gl::VERTEX_FORMAT_SBYTE3:
236         {
237             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
238                                                &Copy8SintTo16SintVertexData<3, 4>);
239             return &info;
240         }
241         case gl::VERTEX_FORMAT_SBYTE4:
242         {
243             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
244                                                &Copy8SintTo16SintVertexData<4, 4>);
245             return &info;
246         }
247 
248         // GL_BYTE -- normalized
249         case gl::VERTEX_FORMAT_SBYTE1_NORM:
250         {
251             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
252                                                &Copy8SnormTo16SnormVertexData<1, 2>);
253             return &info;
254         }
255         case gl::VERTEX_FORMAT_SBYTE2_NORM:
256         {
257             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
258                                                &Copy8SnormTo16SnormVertexData<2, 2>);
259             return &info;
260         }
261         case gl::VERTEX_FORMAT_SBYTE3_NORM:
262         {
263             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
264                                                &Copy8SnormTo16SnormVertexData<3, 4>);
265             return &info;
266         }
267         case gl::VERTEX_FORMAT_SBYTE4_NORM:
268         {
269             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
270                                                &Copy8SnormTo16SnormVertexData<4, 4>);
271             return &info;
272         }
273 
274         // GL_UNSIGNED_BYTE -- un-normalized
275         // NOTE: 3 and 4 component unnormalized GL_UNSIGNED_BYTE should use the default format
276         // table.
277         case gl::VERTEX_FORMAT_UBYTE1:
278         {
279             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
280                                                &CopyNativeVertexData<GLubyte, 1, 4, 1>);
281             return &info;
282         }
283         case gl::VERTEX_FORMAT_UBYTE2:
284         {
285             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
286                                                &CopyNativeVertexData<GLubyte, 2, 4, 1>);
287             return &info;
288         }
289 
290         // GL_UNSIGNED_BYTE -- normalized
291         // NOTE: 3 and 4 component normalized GL_UNSIGNED_BYTE should use the default format table.
292 
293         // GL_UNSIGNED_BYTE -- normalized
294         case gl::VERTEX_FORMAT_UBYTE1_NORM:
295         {
296             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
297                                                &CopyNativeVertexData<GLubyte, 1, 4, UINT8_MAX>);
298             return &info;
299         }
300         case gl::VERTEX_FORMAT_UBYTE2_NORM:
301         {
302             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
303                                                &CopyNativeVertexData<GLubyte, 2, 4, UINT8_MAX>);
304             return &info;
305         }
306 
307         // GL_SHORT -- un-normalized
308         // NOTE: 2, 3 and 4 component unnormalized GL_SHORT should use the default format table.
309         case gl::VERTEX_FORMAT_SSHORT1:
310         {
311             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
312                                                &CopyNativeVertexData<GLshort, 1, 2, 0>);
313             return &info;
314         }
315 
316         // GL_SHORT -- normalized
317         // NOTE: 2, 3 and 4 component normalized GL_SHORT should use the default format table.
318         case gl::VERTEX_FORMAT_SSHORT1_NORM:
319         {
320             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
321                                                &CopyNativeVertexData<GLshort, 1, 2, 0>);
322             return &info;
323         }
324 
325         // GL_UNSIGNED_SHORT -- un-normalized
326         case gl::VERTEX_FORMAT_USHORT1:
327         {
328             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
329                                                &CopyTo32FVertexData<GLushort, 1, 2, false>);
330             return &info;
331         }
332         case gl::VERTEX_FORMAT_USHORT2:
333         {
334             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
335                                                &CopyTo32FVertexData<GLushort, 2, 2, false>);
336             return &info;
337         }
338         case gl::VERTEX_FORMAT_USHORT3:
339         {
340             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
341                                                &CopyTo32FVertexData<GLushort, 3, 3, false>);
342             return &info;
343         }
344         case gl::VERTEX_FORMAT_USHORT4:
345         {
346             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
347                                                &CopyTo32FVertexData<GLushort, 4, 4, false>);
348             return &info;
349         }
350 
351         // GL_UNSIGNED_SHORT -- normalized
352         case gl::VERTEX_FORMAT_USHORT1_NORM:
353         {
354             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
355                                                &CopyTo32FVertexData<GLushort, 1, 2, true>);
356             return &info;
357         }
358         case gl::VERTEX_FORMAT_USHORT2_NORM:
359         {
360             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
361                                                &CopyTo32FVertexData<GLushort, 2, 2, true>);
362             return &info;
363         }
364         case gl::VERTEX_FORMAT_USHORT3_NORM:
365         {
366             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
367                                                &CopyTo32FVertexData<GLushort, 3, 3, true>);
368             return &info;
369         }
370         case gl::VERTEX_FORMAT_USHORT4_NORM:
371         {
372             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
373                                                &CopyTo32FVertexData<GLushort, 4, 4, true>);
374             return &info;
375         }
376 
377         // GL_FIXED
378         // TODO: Add test to verify that this works correctly.
379         // NOTE: 2, 3 and 4 component GL_FIXED should use the default format table.
380         case gl::VERTEX_FORMAT_FIXED1:
381         {
382             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
383                                                &Copy32FixedTo32FVertexData<1, 2>);
384             return &info;
385         }
386 
387         // GL_FLOAT
388         // TODO: Add test to verify that this works correctly.
389         // NOTE: 2, 3 and 4 component GL_FLOAT should use the default format table.
390         case gl::VERTEX_FORMAT_FLOAT1:
391         {
392             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
393                                                &CopyNativeVertexData<GLfloat, 1, 2, 0>);
394             return &info;
395         }
396 
397         default:
398             return nullptr;
399     }
400 }
401 
GetVertexFormatInfo(gl::VertexFormatType vertexFormatType,D3D_FEATURE_LEVEL featureLevel)402 const VertexFormat &GetVertexFormatInfo(gl::VertexFormatType vertexFormatType, D3D_FEATURE_LEVEL featureLevel)
403 {
404     if (featureLevel == D3D_FEATURE_LEVEL_9_3)
405     {
406         const VertexFormat *result = GetVertexFormatInfo_FL_9_3(vertexFormatType);
407         if (result)
408         {
409             return *result;
410         }
411     }
412 
413     switch (vertexFormatType)
414     {
415         //
416         // Float formats
417         //
418 
419         // GL_BYTE -- un-normalized
420         case gl::VERTEX_FORMAT_SBYTE1:
421         {
422             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_SINT,
423                                                &CopyNativeVertexData<GLbyte, 1, 1, 0>);
424             return info;
425         }
426         case gl::VERTEX_FORMAT_SBYTE2:
427         {
428             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_SINT,
429                                                &CopyNativeVertexData<GLbyte, 2, 2, 0>);
430             return info;
431         }
432         case gl::VERTEX_FORMAT_SBYTE3:
433         {
434             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT,
435                                                &CopyNativeVertexData<GLbyte, 3, 4, 1>);
436             return info;
437         }
438         case gl::VERTEX_FORMAT_SBYTE4:
439         {
440             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_SINT,
441                                                &CopyNativeVertexData<GLbyte, 4, 4, 0>);
442             return info;
443         }
444 
445         // GL_BYTE -- normalized
446         case gl::VERTEX_FORMAT_SBYTE1_NORM:
447         {
448             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM,
449                                                &CopyNativeVertexData<GLbyte, 1, 1, 0>);
450             return info;
451         }
452         case gl::VERTEX_FORMAT_SBYTE2_NORM:
453         {
454             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM,
455                                                &CopyNativeVertexData<GLbyte, 2, 2, 0>);
456             return info;
457         }
458         case gl::VERTEX_FORMAT_SBYTE3_NORM:
459         {
460             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SNORM,
461                                                &CopyNativeVertexData<GLbyte, 3, 4, INT8_MAX>);
462             return info;
463         }
464         case gl::VERTEX_FORMAT_SBYTE4_NORM:
465         {
466             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM,
467                                                &CopyNativeVertexData<GLbyte, 4, 4, 0>);
468             return info;
469         }
470 
471         // GL_UNSIGNED_BYTE -- un-normalized
472         case gl::VERTEX_FORMAT_UBYTE1:
473         {
474             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_UINT,
475                                                &CopyNativeVertexData<GLubyte, 1, 1, 0>);
476             return info;
477         }
478         case gl::VERTEX_FORMAT_UBYTE2:
479         {
480             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_UINT,
481                                                &CopyNativeVertexData<GLubyte, 2, 2, 0>);
482             return info;
483         }
484         case gl::VERTEX_FORMAT_UBYTE3:
485         {
486             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
487                                                &CopyNativeVertexData<GLubyte, 3, 4, 1>);
488             return info;
489         }
490         case gl::VERTEX_FORMAT_UBYTE4:
491         {
492             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_UINT,
493                                                &CopyNativeVertexData<GLubyte, 4, 4, 0>);
494             return info;
495         }
496 
497         // GL_UNSIGNED_BYTE -- normalized
498         case gl::VERTEX_FORMAT_UBYTE1_NORM:
499         {
500             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM,
501                                                &CopyNativeVertexData<GLubyte, 1, 1, 0>);
502             return info;
503         }
504         case gl::VERTEX_FORMAT_UBYTE2_NORM:
505         {
506             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM,
507                                                &CopyNativeVertexData<GLubyte, 2, 2, 0>);
508             return info;
509         }
510         case gl::VERTEX_FORMAT_UBYTE3_NORM:
511         {
512             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
513                                                &CopyNativeVertexData<GLubyte, 3, 4, UINT8_MAX>);
514             return info;
515         }
516         case gl::VERTEX_FORMAT_UBYTE4_NORM:
517         {
518             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM,
519                                                &CopyNativeVertexData<GLubyte, 4, 4, 0>);
520             return info;
521         }
522 
523         // GL_SHORT -- un-normalized
524         case gl::VERTEX_FORMAT_SSHORT1:
525         {
526             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_SINT,
527                                                &CopyNativeVertexData<GLshort, 1, 1, 0>);
528             return info;
529         }
530         case gl::VERTEX_FORMAT_SSHORT2:
531         {
532             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_SINT,
533                                                &CopyNativeVertexData<GLshort, 2, 2, 0>);
534             return info;
535         }
536         case gl::VERTEX_FORMAT_SSHORT3:
537         {
538             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
539                                                &CopyNativeVertexData<GLshort, 3, 4, 1>);
540             return info;
541         }
542         case gl::VERTEX_FORMAT_SSHORT4:
543         {
544             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_SINT,
545                                                &CopyNativeVertexData<GLshort, 4, 4, 0>);
546             return info;
547         }
548 
549         // GL_SHORT -- normalized
550         case gl::VERTEX_FORMAT_SSHORT1_NORM:
551         {
552             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM,
553                                                &CopyNativeVertexData<GLshort, 1, 1, 0>);
554             return info;
555         }
556         case gl::VERTEX_FORMAT_SSHORT2_NORM:
557         {
558             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM,
559                                                &CopyNativeVertexData<GLshort, 2, 2, 0>);
560             return info;
561         }
562         case gl::VERTEX_FORMAT_SSHORT3_NORM:
563         {
564             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
565                                                &CopyNativeVertexData<GLshort, 3, 4, INT16_MAX>);
566             return info;
567         }
568         case gl::VERTEX_FORMAT_SSHORT4_NORM:
569         {
570             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM,
571                                                &CopyNativeVertexData<GLshort, 4, 4, 0>);
572             return info;
573         }
574 
575         // GL_UNSIGNED_SHORT -- un-normalized
576         case gl::VERTEX_FORMAT_USHORT1:
577         {
578             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_UINT,
579                                                &CopyNativeVertexData<GLushort, 1, 1, 0>);
580             return info;
581         }
582         case gl::VERTEX_FORMAT_USHORT2:
583         {
584             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_UINT,
585                                                &CopyNativeVertexData<GLushort, 2, 2, 0>);
586             return info;
587         }
588         case gl::VERTEX_FORMAT_USHORT3:
589         {
590             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT,
591                                                &CopyNativeVertexData<GLushort, 3, 4, 1>);
592             return info;
593         }
594         case gl::VERTEX_FORMAT_USHORT4:
595         {
596             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_UINT,
597                                                &CopyNativeVertexData<GLushort, 4, 4, 0>);
598             return info;
599         }
600 
601         // GL_UNSIGNED_SHORT -- normalized
602         case gl::VERTEX_FORMAT_USHORT1_NORM:
603         {
604             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM,
605                                                &CopyNativeVertexData<GLushort, 1, 1, 0>);
606             return info;
607         }
608         case gl::VERTEX_FORMAT_USHORT2_NORM:
609         {
610             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM,
611                                                &CopyNativeVertexData<GLushort, 2, 2, 0>);
612             return info;
613         }
614         case gl::VERTEX_FORMAT_USHORT3_NORM:
615         {
616             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UNORM,
617                                                &CopyNativeVertexData<GLushort, 3, 4, UINT16_MAX>);
618             return info;
619         }
620         case gl::VERTEX_FORMAT_USHORT4_NORM:
621         {
622             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM,
623                                                &CopyNativeVertexData<GLushort, 4, 4, 0>);
624             return info;
625         }
626 
627         // GL_INT -- un-normalized
628         case gl::VERTEX_FORMAT_SINT1:
629         {
630             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_SINT,
631                                                &CopyNativeVertexData<GLint, 1, 1, 0>);
632             return info;
633         }
634         case gl::VERTEX_FORMAT_SINT2:
635         {
636             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_SINT,
637                                                &CopyNativeVertexData<GLint, 2, 2, 0>);
638             return info;
639         }
640         case gl::VERTEX_FORMAT_SINT3:
641         {
642             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_SINT,
643                                                &CopyNativeVertexData<GLint, 3, 3, 0>);
644             return info;
645         }
646         case gl::VERTEX_FORMAT_SINT4:
647         {
648             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_SINT,
649                                                &CopyNativeVertexData<GLint, 4, 4, 0>);
650             return info;
651         }
652 
653         // GL_INT -- normalized
654         case gl::VERTEX_FORMAT_SINT1_NORM:
655         {
656             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
657                                                &CopyTo32FVertexData<GLint, 1, 1, true>);
658             return info;
659         }
660         case gl::VERTEX_FORMAT_SINT2_NORM:
661         {
662             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
663                                                &CopyTo32FVertexData<GLint, 2, 2, true>);
664             return info;
665         }
666         case gl::VERTEX_FORMAT_SINT3_NORM:
667         {
668             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
669                                                &CopyTo32FVertexData<GLint, 3, 3, true>);
670             return info;
671         }
672         case gl::VERTEX_FORMAT_SINT4_NORM:
673         {
674             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
675                                                &CopyTo32FVertexData<GLint, 4, 4, true>);
676             return info;
677         }
678 
679         // GL_UNSIGNED_INT -- un-normalized
680         case gl::VERTEX_FORMAT_UINT1:
681         {
682             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_UINT,
683                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
684             return info;
685         }
686         case gl::VERTEX_FORMAT_UINT2:
687         {
688             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_UINT,
689                                                &CopyNativeVertexData<GLuint, 2, 2, 0>);
690             return info;
691         }
692         case gl::VERTEX_FORMAT_UINT3:
693         {
694             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_UINT,
695                                                &CopyNativeVertexData<GLuint, 3, 3, 0>);
696             return info;
697         }
698         case gl::VERTEX_FORMAT_UINT4:
699         {
700             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_UINT,
701                                                &CopyNativeVertexData<GLuint, 4, 4, 0>);
702             return info;
703         }
704 
705         // GL_UNSIGNED_INT -- normalized
706         case gl::VERTEX_FORMAT_UINT1_NORM:
707         {
708             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
709                                                &CopyTo32FVertexData<GLuint, 1, 1, true>);
710             return info;
711         }
712         case gl::VERTEX_FORMAT_UINT2_NORM:
713         {
714             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
715                                                &CopyTo32FVertexData<GLuint, 2, 2, true>);
716             return info;
717         }
718         case gl::VERTEX_FORMAT_UINT3_NORM:
719         {
720             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
721                                                &CopyTo32FVertexData<GLuint, 3, 3, true>);
722             return info;
723         }
724         case gl::VERTEX_FORMAT_UINT4_NORM:
725         {
726             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
727                                                &CopyTo32FVertexData<GLuint, 4, 4, true>);
728             return info;
729         }
730 
731         // GL_FIXED
732         case gl::VERTEX_FORMAT_FIXED1:
733         {
734             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
735                                                &Copy32FixedTo32FVertexData<1, 1>);
736             return info;
737         }
738         case gl::VERTEX_FORMAT_FIXED2:
739         {
740             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
741                                                &Copy32FixedTo32FVertexData<2, 2>);
742             return info;
743         }
744         case gl::VERTEX_FORMAT_FIXED3:
745         {
746             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
747                                                &Copy32FixedTo32FVertexData<3, 3>);
748             return info;
749         }
750         case gl::VERTEX_FORMAT_FIXED4:
751         {
752             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
753                                                &Copy32FixedTo32FVertexData<4, 4>);
754             return info;
755         }
756 
757         // GL_HALF_FLOAT
758         case gl::VERTEX_FORMAT_HALF1:
759         {
760             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT,
761                                                &CopyNativeVertexData<GLhalf, 1, 1, 0>);
762             return info;
763         }
764         case gl::VERTEX_FORMAT_HALF2:
765         {
766             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT,
767                                                &CopyNativeVertexData<GLhalf, 2, 2, 0>);
768             return info;
769         }
770         case gl::VERTEX_FORMAT_HALF3:
771         {
772             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_FLOAT,
773                                                &CopyNativeVertexData<GLhalf, 3, 4, gl::Float16One>);
774             return info;
775         }
776         case gl::VERTEX_FORMAT_HALF4:
777         {
778             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT,
779                                                &CopyNativeVertexData<GLhalf, 4, 4, 0>);
780             return info;
781         }
782 
783         // GL_FLOAT
784         case gl::VERTEX_FORMAT_FLOAT1:
785         {
786             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT,
787                                                &CopyNativeVertexData<GLfloat, 1, 1, 0>);
788             return info;
789         }
790         case gl::VERTEX_FORMAT_FLOAT2:
791         {
792             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT,
793                                                &CopyNativeVertexData<GLfloat, 2, 2, 0>);
794             return info;
795         }
796         case gl::VERTEX_FORMAT_FLOAT3:
797         {
798             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT,
799                                                &CopyNativeVertexData<GLfloat, 3, 3, 0>);
800             return info;
801         }
802         case gl::VERTEX_FORMAT_FLOAT4:
803         {
804             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT,
805                                                &CopyNativeVertexData<GLfloat, 4, 4, 0>);
806             return info;
807         }
808 
809         // GL_INT_2_10_10_10_REV
810         case gl::VERTEX_FORMAT_SINT210:
811         {
812             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
813                                                &CopyXYZ10W2ToXYZW32FVertexData<true, false, true>);
814             return info;
815         }
816         case gl::VERTEX_FORMAT_SINT210_NORM:
817         {
818             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
819                                                &CopyXYZ10W2ToXYZW32FVertexData<true, true, true>);
820             return info;
821         }
822 
823         // GL_UNSIGNED_INT_2_10_10_10_REV
824         case gl::VERTEX_FORMAT_UINT210:
825         {
826             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
827                                                &CopyXYZ10W2ToXYZW32FVertexData<false, false, true>);
828             return info;
829         }
830         case gl::VERTEX_FORMAT_UINT210_NORM:
831         {
832             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM,
833                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
834             return info;
835         }
836 
837         //
838         // Integer Formats
839         //
840 
841         // GL_BYTE
842         case gl::VERTEX_FORMAT_SBYTE1_INT:
843         {
844             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SINT,
845                                                &CopyNativeVertexData<GLbyte, 1, 1, 0>);
846             return info;
847         }
848         case gl::VERTEX_FORMAT_SBYTE2_INT:
849         {
850             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SINT,
851                                                &CopyNativeVertexData<GLbyte, 2, 2, 0>);
852             return info;
853         }
854         case gl::VERTEX_FORMAT_SBYTE3_INT:
855         {
856             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SINT,
857                                                &CopyNativeVertexData<GLbyte, 3, 4, 1>);
858             return info;
859         }
860         case gl::VERTEX_FORMAT_SBYTE4_INT:
861         {
862             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SINT,
863                                                &CopyNativeVertexData<GLbyte, 4, 4, 0>);
864             return info;
865         }
866 
867         // GL_UNSIGNED_BYTE
868         case gl::VERTEX_FORMAT_UBYTE1_INT:
869         {
870             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UINT,
871                                                &CopyNativeVertexData<GLubyte, 1, 1, 0>);
872             return info;
873         }
874         case gl::VERTEX_FORMAT_UBYTE2_INT:
875         {
876             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UINT,
877                                                &CopyNativeVertexData<GLubyte, 2, 2, 0>);
878             return info;
879         }
880         case gl::VERTEX_FORMAT_UBYTE3_INT:
881         {
882             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UINT,
883                                                &CopyNativeVertexData<GLubyte, 3, 4, 1>);
884             return info;
885         }
886         case gl::VERTEX_FORMAT_UBYTE4_INT:
887         {
888             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UINT,
889                                                &CopyNativeVertexData<GLubyte, 4, 4, 0>);
890             return info;
891         }
892 
893         // GL_SHORT
894         case gl::VERTEX_FORMAT_SSHORT1_INT:
895         {
896             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SINT,
897                                                &CopyNativeVertexData<GLshort, 1, 1, 0>);
898             return info;
899         }
900         case gl::VERTEX_FORMAT_SSHORT2_INT:
901         {
902             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SINT,
903                                                &CopyNativeVertexData<GLshort, 2, 2, 0>);
904             return info;
905         }
906         case gl::VERTEX_FORMAT_SSHORT3_INT:
907         {
908             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT,
909                                                &CopyNativeVertexData<GLshort, 3, 4, 1>);
910             return info;
911         }
912         case gl::VERTEX_FORMAT_SSHORT4_INT:
913         {
914             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SINT,
915                                                &CopyNativeVertexData<GLshort, 4, 4, 0>);
916             return info;
917         }
918 
919         // GL_UNSIGNED_SHORT
920         case gl::VERTEX_FORMAT_USHORT1_INT:
921         {
922             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UINT,
923                                                &CopyNativeVertexData<GLushort, 1, 1, 0>);
924             return info;
925         }
926         case gl::VERTEX_FORMAT_USHORT2_INT:
927         {
928             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UINT,
929                                                &CopyNativeVertexData<GLushort, 2, 2, 0>);
930             return info;
931         }
932         case gl::VERTEX_FORMAT_USHORT3_INT:
933         {
934             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UINT,
935                                                &CopyNativeVertexData<GLushort, 3, 4, 1>);
936             return info;
937         }
938         case gl::VERTEX_FORMAT_USHORT4_INT:
939         {
940             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UINT,
941                                                &CopyNativeVertexData<GLushort, 4, 4, 0>);
942             return info;
943         }
944 
945         // GL_INT
946         case gl::VERTEX_FORMAT_SINT1_INT:
947         {
948             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT,
949                                                &CopyNativeVertexData<GLint, 1, 1, 0>);
950             return info;
951         }
952         case gl::VERTEX_FORMAT_SINT2_INT:
953         {
954             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT,
955                                                &CopyNativeVertexData<GLint, 2, 2, 0>);
956             return info;
957         }
958         case gl::VERTEX_FORMAT_SINT3_INT:
959         {
960             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT,
961                                                &CopyNativeVertexData<GLint, 3, 3, 0>);
962             return info;
963         }
964         case gl::VERTEX_FORMAT_SINT4_INT:
965         {
966             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT,
967                                                &CopyNativeVertexData<GLint, 4, 4, 0>);
968             return info;
969         }
970 
971         // GL_UNSIGNED_INT
972         case gl::VERTEX_FORMAT_UINT1_INT:
973         {
974             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT,
975                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
976             return info;
977         }
978         case gl::VERTEX_FORMAT_UINT2_INT:
979         {
980             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT,
981                                                &CopyNativeVertexData<GLuint, 2, 2, 0>);
982             return info;
983         }
984         case gl::VERTEX_FORMAT_UINT3_INT:
985         {
986             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT,
987                                                &CopyNativeVertexData<GLuint, 3, 3, 0>);
988             return info;
989         }
990         case gl::VERTEX_FORMAT_UINT4_INT:
991         {
992             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT,
993                                                &CopyNativeVertexData<GLuint, 4, 4, 0>);
994             return info;
995         }
996 
997         // GL_INT_2_10_10_10_REV
998         case gl::VERTEX_FORMAT_SINT210_INT:
999         {
1000             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT,
1001                                                &CopyXYZ10W2ToXYZW32FVertexData<true, true, false>);
1002             return info;
1003         }
1004 
1005         // GL_UNSIGNED_INT_2_10_10_10_REV
1006         case gl::VERTEX_FORMAT_UINT210_INT:
1007         {
1008             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT,
1009                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
1010             return info;
1011         }
1012 
1013         default:
1014         {
1015             static constexpr VertexFormat info;
1016             return info;
1017         }
1018     }
1019 }
1020 
1021 }  // namespace d3d11
1022 
1023 }  // namespace rx
1024