xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/d3d/d3d11/formatutils11.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1 //
2 // Copyright 2013 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/copyvertex.h"
18 #include "libANGLE/renderer/d3d/d3d11/Renderer11.h"
19 #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h"
20 #include "libANGLE/renderer/d3d/d3d11/texture_format_table.h"
21 #include "libANGLE/renderer/dxgi_support_table.h"
22 
23 namespace rx
24 {
25 
26 namespace d3d11
27 {
28 
SupportsMipGen(DXGI_FORMAT dxgiFormat,D3D_FEATURE_LEVEL featureLevel)29 bool SupportsMipGen(DXGI_FORMAT dxgiFormat, D3D_FEATURE_LEVEL featureLevel)
30 {
31     const auto &support = GetDXGISupport(dxgiFormat, featureLevel);
32     ASSERT((support.optionallySupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) == 0);
33     return ((support.alwaysSupportedFlags & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN) != 0);
34 }
35 
IsSupportedMultiplanarFormat(DXGI_FORMAT dxgiFormat)36 bool IsSupportedMultiplanarFormat(DXGI_FORMAT dxgiFormat)
37 {
38     return dxgiFormat == DXGI_FORMAT_NV12 || dxgiFormat == DXGI_FORMAT_P010 ||
39            dxgiFormat == DXGI_FORMAT_P016;
40 }
41 
GetYUVPlaneFormat(DXGI_FORMAT dxgiFormat,int plane)42 const Format &GetYUVPlaneFormat(DXGI_FORMAT dxgiFormat, int plane)
43 {
44     static constexpr Format nv12Plane0Info(
45         GL_R8, angle::FormatID::R8_UNORM, DXGI_FORMAT_NV12, DXGI_FORMAT_R8_UNORM,
46         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8_UNORM,
47         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8_TYPELESS, GL_RGBA8, nullptr);
48 
49     static constexpr Format nv12Plane1Info(
50         GL_RG8, angle::FormatID::R8G8_UNORM, DXGI_FORMAT_NV12, DXGI_FORMAT_R8G8_UNORM,
51         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8G8_UNORM,
52         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R8G8_TYPELESS, GL_RGBA8, nullptr);
53 
54     static constexpr Format p010Plane0Info(
55         GL_R16_EXT, angle::FormatID::R16_UNORM, DXGI_FORMAT_P010, DXGI_FORMAT_R16_UNORM,
56         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16_UNORM,
57         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16_TYPELESS, GL_RGBA16_EXT, nullptr);
58 
59     static constexpr Format p010Plane1Info(
60         GL_RG16_EXT, angle::FormatID::R16G16_UNORM, DXGI_FORMAT_P010, DXGI_FORMAT_R16G16_UNORM,
61         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16G16_UNORM, DXGI_FORMAT_UNKNOWN,
62         DXGI_FORMAT_R16G16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN,
63         DXGI_FORMAT_R16G16_TYPELESS, GL_RGBA16_EXT, nullptr);
64 
65     static constexpr Format p016Plane0Info(
66         GL_R16_EXT, angle::FormatID::R16_UNORM, DXGI_FORMAT_P016, DXGI_FORMAT_R16_UNORM,
67         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16_UNORM,
68         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16_TYPELESS, GL_RGBA16_EXT, nullptr);
69 
70     static constexpr Format p016Plane1Info(
71         GL_RG16_EXT, angle::FormatID::R16G16_UNORM, DXGI_FORMAT_P016, DXGI_FORMAT_R16G16_UNORM,
72         DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_R16G16_UNORM, DXGI_FORMAT_UNKNOWN,
73         DXGI_FORMAT_R16G16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN,
74         DXGI_FORMAT_R16G16_TYPELESS, GL_RGBA16_EXT, nullptr);
75 
76     ASSERT(IsSupportedMultiplanarFormat(dxgiFormat));
77     if (plane < 0 || plane > 1)
78     {
79         ERR() << "Invalid client buffer texture plane: " << plane;
80         static constexpr Format defaultInfo;
81         return defaultInfo;
82     }
83 
84     switch (dxgiFormat)
85     {
86         case DXGI_FORMAT_NV12:
87             return plane == 0 ? nv12Plane0Info : nv12Plane1Info;
88         case DXGI_FORMAT_P010:
89             return plane == 0 ? p010Plane0Info : p010Plane1Info;
90         case DXGI_FORMAT_P016:
91             return plane == 0 ? p016Plane0Info : p016Plane1Info;
92         default:
93             ERR() << "Not supported multiplanar format: " << dxgiFormat;
94     }
95     static constexpr Format defaultInfo;
96     return defaultInfo;
97 }
98 
DXGIFormatSize(GLuint pixelBits,GLuint blockWidth,GLuint blockHeight)99 DXGIFormatSize::DXGIFormatSize(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight)
100     : pixelBytes(pixelBits / 8), blockWidth(blockWidth), blockHeight(blockHeight)
101 {}
102 
GetDXGIFormatSizeInfo(DXGI_FORMAT format)103 const DXGIFormatSize &GetDXGIFormatSizeInfo(DXGI_FORMAT format)
104 {
105     static const DXGIFormatSize sizeUnknown(0, 0, 0);
106     static const DXGIFormatSize size128(128, 1, 1);
107     static const DXGIFormatSize size96(96, 1, 1);
108     static const DXGIFormatSize size64(64, 1, 1);
109     static const DXGIFormatSize size32(32, 1, 1);
110     static const DXGIFormatSize size16(16, 1, 1);
111     static const DXGIFormatSize size8(8, 1, 1);
112     static const DXGIFormatSize sizeBC1(64, 4, 4);
113     static const DXGIFormatSize sizeBC2(128, 4, 4);
114     static const DXGIFormatSize sizeBC3(128, 4, 4);
115     static const DXGIFormatSize sizeBC4(64, 4, 4);
116     static const DXGIFormatSize sizeBC5(128, 4, 4);
117     static const DXGIFormatSize sizeBC6H(128, 4, 4);
118     static const DXGIFormatSize sizeBC7(128, 4, 4);
119     switch (format)
120     {
121         case DXGI_FORMAT_UNKNOWN:
122             return sizeUnknown;
123         case DXGI_FORMAT_R32G32B32A32_TYPELESS:
124         case DXGI_FORMAT_R32G32B32A32_FLOAT:
125         case DXGI_FORMAT_R32G32B32A32_UINT:
126         case DXGI_FORMAT_R32G32B32A32_SINT:
127             return size128;
128         case DXGI_FORMAT_R32G32B32_TYPELESS:
129         case DXGI_FORMAT_R32G32B32_FLOAT:
130         case DXGI_FORMAT_R32G32B32_UINT:
131         case DXGI_FORMAT_R32G32B32_SINT:
132             return size96;
133         case DXGI_FORMAT_R16G16B16A16_TYPELESS:
134         case DXGI_FORMAT_R16G16B16A16_FLOAT:
135         case DXGI_FORMAT_R16G16B16A16_UNORM:
136         case DXGI_FORMAT_R16G16B16A16_UINT:
137         case DXGI_FORMAT_R16G16B16A16_SNORM:
138         case DXGI_FORMAT_R16G16B16A16_SINT:
139         case DXGI_FORMAT_R32G32_TYPELESS:
140         case DXGI_FORMAT_R32G32_FLOAT:
141         case DXGI_FORMAT_R32G32_UINT:
142         case DXGI_FORMAT_R32G32_SINT:
143         case DXGI_FORMAT_R32G8X24_TYPELESS:
144         case DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
145         case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
146         case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
147             return size64;
148         case DXGI_FORMAT_R10G10B10A2_TYPELESS:
149         case DXGI_FORMAT_R10G10B10A2_UNORM:
150         case DXGI_FORMAT_R10G10B10A2_UINT:
151         case DXGI_FORMAT_R11G11B10_FLOAT:
152         case DXGI_FORMAT_R8G8B8A8_TYPELESS:
153         case DXGI_FORMAT_R8G8B8A8_UNORM:
154         case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
155         case DXGI_FORMAT_R8G8B8A8_UINT:
156         case DXGI_FORMAT_R8G8B8A8_SNORM:
157         case DXGI_FORMAT_R8G8B8A8_SINT:
158         case DXGI_FORMAT_R16G16_TYPELESS:
159         case DXGI_FORMAT_R16G16_FLOAT:
160         case DXGI_FORMAT_R16G16_UNORM:
161         case DXGI_FORMAT_R16G16_UINT:
162         case DXGI_FORMAT_R16G16_SNORM:
163         case DXGI_FORMAT_R16G16_SINT:
164         case DXGI_FORMAT_R32_TYPELESS:
165         case DXGI_FORMAT_D32_FLOAT:
166         case DXGI_FORMAT_R32_FLOAT:
167         case DXGI_FORMAT_R32_UINT:
168         case DXGI_FORMAT_R32_SINT:
169         case DXGI_FORMAT_R24G8_TYPELESS:
170         case DXGI_FORMAT_D24_UNORM_S8_UINT:
171         case DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
172         case DXGI_FORMAT_X24_TYPELESS_G8_UINT:
173             return size32;
174         case DXGI_FORMAT_R8G8_TYPELESS:
175         case DXGI_FORMAT_R8G8_UNORM:
176         case DXGI_FORMAT_R8G8_UINT:
177         case DXGI_FORMAT_R8G8_SNORM:
178         case DXGI_FORMAT_R8G8_SINT:
179         case DXGI_FORMAT_R16_TYPELESS:
180         case DXGI_FORMAT_R16_FLOAT:
181         case DXGI_FORMAT_D16_UNORM:
182         case DXGI_FORMAT_R16_UNORM:
183         case DXGI_FORMAT_R16_UINT:
184         case DXGI_FORMAT_R16_SNORM:
185         case DXGI_FORMAT_R16_SINT:
186             return size16;
187         case DXGI_FORMAT_R8_TYPELESS:
188         case DXGI_FORMAT_R8_UNORM:
189         case DXGI_FORMAT_R8_UINT:
190         case DXGI_FORMAT_R8_SNORM:
191         case DXGI_FORMAT_R8_SINT:
192         case DXGI_FORMAT_A8_UNORM:
193             return size8;
194         case DXGI_FORMAT_R1_UNORM:
195             UNREACHABLE();
196             return sizeUnknown;
197         case DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
198         case DXGI_FORMAT_R8G8_B8G8_UNORM:
199         case DXGI_FORMAT_G8R8_G8B8_UNORM:
200             return size32;
201         case DXGI_FORMAT_BC1_TYPELESS:
202         case DXGI_FORMAT_BC1_UNORM:
203         case DXGI_FORMAT_BC1_UNORM_SRGB:
204             return sizeBC1;
205         case DXGI_FORMAT_BC2_TYPELESS:
206         case DXGI_FORMAT_BC2_UNORM:
207         case DXGI_FORMAT_BC2_UNORM_SRGB:
208             return sizeBC2;
209         case DXGI_FORMAT_BC3_TYPELESS:
210         case DXGI_FORMAT_BC3_UNORM:
211         case DXGI_FORMAT_BC3_UNORM_SRGB:
212             return sizeBC3;
213         case DXGI_FORMAT_BC4_TYPELESS:
214         case DXGI_FORMAT_BC4_UNORM:
215         case DXGI_FORMAT_BC4_SNORM:
216             return sizeBC4;
217         case DXGI_FORMAT_BC5_TYPELESS:
218         case DXGI_FORMAT_BC5_UNORM:
219         case DXGI_FORMAT_BC5_SNORM:
220             return sizeBC5;
221         case DXGI_FORMAT_B5G6R5_UNORM:
222         case DXGI_FORMAT_B5G5R5A1_UNORM:
223             return size16;
224         case DXGI_FORMAT_B8G8R8A8_UNORM:
225         case DXGI_FORMAT_B8G8R8X8_UNORM:
226         case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
227         case DXGI_FORMAT_B8G8R8A8_TYPELESS:
228         case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
229         case DXGI_FORMAT_B8G8R8X8_TYPELESS:
230         case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
231             return size32;
232         case DXGI_FORMAT_BC6H_TYPELESS:
233         case DXGI_FORMAT_BC6H_UF16:
234         case DXGI_FORMAT_BC6H_SF16:
235             return sizeBC6H;
236         case DXGI_FORMAT_BC7_TYPELESS:
237         case DXGI_FORMAT_BC7_UNORM:
238         case DXGI_FORMAT_BC7_UNORM_SRGB:
239             return sizeBC7;
240         case DXGI_FORMAT_AYUV:
241         case DXGI_FORMAT_Y410:
242         case DXGI_FORMAT_Y416:
243         case DXGI_FORMAT_NV12:
244         case DXGI_FORMAT_P010:
245         case DXGI_FORMAT_P016:
246         case DXGI_FORMAT_420_OPAQUE:
247         case DXGI_FORMAT_YUY2:
248         case DXGI_FORMAT_Y210:
249         case DXGI_FORMAT_Y216:
250         case DXGI_FORMAT_NV11:
251         case DXGI_FORMAT_AI44:
252         case DXGI_FORMAT_IA44:
253         case DXGI_FORMAT_P8:
254         case DXGI_FORMAT_A8P8:
255             UNREACHABLE();
256             return sizeUnknown;
257         case DXGI_FORMAT_B4G4R4A4_UNORM:
258             return size16;
259         default:
260             UNREACHABLE();
261             return sizeUnknown;
262     }
263 }
264 
VertexFormat()265 constexpr VertexFormat::VertexFormat()
266     : conversionType(VERTEX_CONVERT_NONE), nativeFormat(DXGI_FORMAT_UNKNOWN), copyFunction(nullptr)
267 {}
268 
VertexFormat(VertexConversionType conversionTypeIn,DXGI_FORMAT nativeFormatIn,VertexCopyFunction copyFunctionIn)269 constexpr VertexFormat::VertexFormat(VertexConversionType conversionTypeIn,
270                                      DXGI_FORMAT nativeFormatIn,
271                                      VertexCopyFunction copyFunctionIn)
272     : conversionType(conversionTypeIn), nativeFormat(nativeFormatIn), copyFunction(copyFunctionIn)
273 {}
274 
GetVertexFormatInfo_FL_9_3(angle::FormatID vertexFormatID)275 const VertexFormat *GetVertexFormatInfo_FL_9_3(angle::FormatID vertexFormatID)
276 {
277     // D3D11 Feature Level 9_3 doesn't support as many formats for vertex buffer resource as Feature
278     // Level 10_0+.
279     // http://msdn.microsoft.com/en-us/library/windows/desktop/ff471324(v=vs.85).aspx
280 
281     switch (vertexFormatID)
282     {
283         // GL_BYTE -- unnormalized
284         case angle::FormatID::R8_SSCALED:
285         {
286             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
287                                                &Copy8SintTo16SintVertexData<1, 2>);
288             return &info;
289         }
290         case angle::FormatID::R8G8_SSCALED:
291         {
292             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
293                                                &Copy8SintTo16SintVertexData<2, 2>);
294             return &info;
295         }
296         case angle::FormatID::R8G8B8_SSCALED:
297         {
298             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
299                                                &Copy8SintTo16SintVertexData<3, 4>);
300             return &info;
301         }
302         case angle::FormatID::R8G8B8A8_SSCALED:
303         {
304             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
305                                                &Copy8SintTo16SintVertexData<4, 4>);
306             return &info;
307         }
308 
309         // GL_BYTE -- normalized
310         case angle::FormatID::R8_SNORM:
311         {
312             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
313                                                &Copy8SnormTo16SnormVertexData<1, 2>);
314             return &info;
315         }
316         case angle::FormatID::R8G8_SNORM:
317         {
318             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
319                                                &Copy8SnormTo16SnormVertexData<2, 2>);
320             return &info;
321         }
322         case angle::FormatID::R8G8B8_SNORM:
323         {
324             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
325                                                &Copy8SnormTo16SnormVertexData<3, 4>);
326             return &info;
327         }
328         case angle::FormatID::R8G8B8A8_SNORM:
329         {
330             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
331                                                &Copy8SnormTo16SnormVertexData<4, 4>);
332             return &info;
333         }
334 
335         // GL_UNSIGNED_BYTE -- un-normalized
336         // NOTE: 3 and 4 component unnormalized GL_UNSIGNED_BYTE should use the default format
337         // table.
338         case angle::FormatID::R8_USCALED:
339         {
340             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
341                                                &CopyNativeVertexData<GLubyte, 1, 4, 1>);
342             return &info;
343         }
344         case angle::FormatID::R8G8_USCALED:
345         {
346             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
347                                                &CopyNativeVertexData<GLubyte, 2, 4, 1>);
348             return &info;
349         }
350 
351         // GL_UNSIGNED_BYTE -- normalized
352         // NOTE: 3 and 4 component normalized GL_UNSIGNED_BYTE should use the default format table.
353 
354         // GL_UNSIGNED_BYTE -- normalized
355         case angle::FormatID::R8_UNORM:
356         {
357             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
358                                                &CopyNativeVertexData<GLubyte, 1, 4, UINT8_MAX>);
359             return &info;
360         }
361         case angle::FormatID::R8G8_UNORM:
362         {
363             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
364                                                &CopyNativeVertexData<GLubyte, 2, 4, UINT8_MAX>);
365             return &info;
366         }
367 
368         // GL_SHORT -- un-normalized
369         // NOTE: 2, 3 and 4 component unnormalized GL_SHORT should use the default format table.
370         case angle::FormatID::R16_SSCALED:
371         {
372             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16_SINT,
373                                                &CopyNativeVertexData<GLshort, 1, 2, 0>);
374             return &info;
375         }
376 
377         // GL_SHORT -- normalized
378         // NOTE: 2, 3 and 4 component normalized GL_SHORT should use the default format table.
379         case angle::FormatID::R16_SNORM:
380         {
381             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16_SNORM,
382                                                &CopyNativeVertexData<GLshort, 1, 2, 0>);
383             return &info;
384         }
385 
386         // GL_UNSIGNED_SHORT -- un-normalized
387         case angle::FormatID::R16_USCALED:
388         {
389             static constexpr VertexFormat info(
390                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
391                 &CopyToFloatVertexData<GLushort, 1, 2, false, false>);
392             return &info;
393         }
394         case angle::FormatID::R16G16_USCALED:
395         {
396             static constexpr VertexFormat info(
397                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
398                 &CopyToFloatVertexData<GLushort, 2, 2, false, false>);
399             return &info;
400         }
401         case angle::FormatID::R16G16B16_USCALED:
402         {
403             static constexpr VertexFormat info(
404                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
405                 &CopyToFloatVertexData<GLushort, 3, 3, false, false>);
406             return &info;
407         }
408         case angle::FormatID::R16G16B16A16_USCALED:
409         {
410             static constexpr VertexFormat info(
411                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
412                 &CopyToFloatVertexData<GLushort, 4, 4, false, false>);
413             return &info;
414         }
415 
416         // GL_UNSIGNED_SHORT -- normalized
417         case angle::FormatID::R16_UNORM:
418         {
419             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
420                                                &CopyToFloatVertexData<GLushort, 1, 2, true, false>);
421             return &info;
422         }
423         case angle::FormatID::R16G16_UNORM:
424         {
425             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
426                                                &CopyToFloatVertexData<GLushort, 2, 2, true, false>);
427             return &info;
428         }
429         case angle::FormatID::R16G16B16_UNORM:
430         {
431             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
432                                                &CopyToFloatVertexData<GLushort, 3, 3, true, false>);
433             return &info;
434         }
435         case angle::FormatID::R16G16B16A16_UNORM:
436         {
437             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
438                                                &CopyToFloatVertexData<GLushort, 4, 4, true, false>);
439             return &info;
440         }
441 
442         // GL_FIXED
443         // TODO: Add test to verify that this works correctly.
444         // NOTE: 2, 3 and 4 component GL_FIXED should use the default format table.
445         case angle::FormatID::R32_FIXED:
446         {
447             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
448                                                &Copy32FixedTo32FVertexData<1, 2>);
449             return &info;
450         }
451 
452         // GL_FLOAT
453         // TODO: Add test to verify that this works correctly.
454         // NOTE: 2, 3 and 4 component GL_FLOAT should use the default format table.
455         case angle::FormatID::R32_FLOAT:
456         {
457             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
458                                                &CopyNativeVertexData<GLfloat, 1, 2, 0>);
459             return &info;
460         }
461 
462         default:
463             return nullptr;
464     }
465 }
466 
GetVertexFormatInfo(angle::FormatID vertexFormatID,D3D_FEATURE_LEVEL featureLevel)467 const VertexFormat &GetVertexFormatInfo(angle::FormatID vertexFormatID,
468                                         D3D_FEATURE_LEVEL featureLevel)
469 {
470     if (featureLevel == D3D_FEATURE_LEVEL_9_3)
471     {
472         const VertexFormat *result = GetVertexFormatInfo_FL_9_3(vertexFormatID);
473         if (result)
474         {
475             return *result;
476         }
477     }
478 
479     switch (vertexFormatID)
480     {
481         //
482         // Float formats
483         //
484 
485         // GL_BYTE -- un-normalized
486         case angle::FormatID::R8_SSCALED:
487         {
488             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_SINT,
489                                                &CopyNativeVertexData<GLbyte, 1, 1, 0>);
490             return info;
491         }
492         case angle::FormatID::R8G8_SSCALED:
493         {
494             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_SINT,
495                                                &CopyNativeVertexData<GLbyte, 2, 2, 0>);
496             return info;
497         }
498         case angle::FormatID::R8G8B8_SSCALED:
499         {
500             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT,
501                                                &CopyNativeVertexData<GLbyte, 3, 4, 1>);
502             return info;
503         }
504         case angle::FormatID::R8G8B8A8_SSCALED:
505         {
506             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_SINT,
507                                                &CopyNativeVertexData<GLbyte, 4, 4, 0>);
508             return info;
509         }
510 
511         // GL_BYTE -- normalized
512         case angle::FormatID::R8_SNORM:
513         {
514             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM,
515                                                &CopyNativeVertexData<GLbyte, 1, 1, 0>);
516             return info;
517         }
518         case angle::FormatID::R8G8_SNORM:
519         {
520             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM,
521                                                &CopyNativeVertexData<GLbyte, 2, 2, 0>);
522             return info;
523         }
524         case angle::FormatID::R8G8B8_SNORM:
525         {
526             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SNORM,
527                                                &CopyNativeVertexData<GLbyte, 3, 4, INT8_MAX>);
528             return info;
529         }
530         case angle::FormatID::R8G8B8A8_SNORM:
531         {
532             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM,
533                                                &CopyNativeVertexData<GLbyte, 4, 4, 0>);
534             return info;
535         }
536 
537         // GL_UNSIGNED_BYTE -- un-normalized
538         case angle::FormatID::R8_USCALED:
539         {
540             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8_UINT,
541                                                &CopyNativeVertexData<GLubyte, 1, 1, 0>);
542             return info;
543         }
544         case angle::FormatID::R8G8_USCALED:
545         {
546             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8_UINT,
547                                                &CopyNativeVertexData<GLubyte, 2, 2, 0>);
548             return info;
549         }
550         case angle::FormatID::R8G8B8_USCALED:
551         {
552             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,
553                                                &CopyNativeVertexData<GLubyte, 3, 4, 1>);
554             return info;
555         }
556         case angle::FormatID::R8G8B8A8_USCALED:
557         {
558             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R8G8B8A8_UINT,
559                                                &CopyNativeVertexData<GLubyte, 4, 4, 0>);
560             return info;
561         }
562 
563         // GL_UNSIGNED_BYTE -- normalized
564         case angle::FormatID::R8_UNORM:
565         {
566             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM,
567                                                &CopyNativeVertexData<GLubyte, 1, 1, 0>);
568             return info;
569         }
570         case angle::FormatID::R8G8_UNORM:
571         {
572             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM,
573                                                &CopyNativeVertexData<GLubyte, 2, 2, 0>);
574             return info;
575         }
576         case angle::FormatID::R8G8B8_UNORM:
577         {
578             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UNORM,
579                                                &CopyNativeVertexData<GLubyte, 3, 4, UINT8_MAX>);
580             return info;
581         }
582         case angle::FormatID::R8G8B8A8_UNORM:
583         {
584             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM,
585                                                &CopyNativeVertexData<GLubyte, 4, 4, 0>);
586             return info;
587         }
588 
589         // GL_SHORT -- un-normalized
590         case angle::FormatID::R16_SSCALED:
591         {
592             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_SINT,
593                                                &CopyNativeVertexData<GLshort, 1, 1, 0>);
594             return info;
595         }
596         case angle::FormatID::R16G16_SSCALED:
597         {
598             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_SINT,
599                                                &CopyNativeVertexData<GLshort, 2, 2, 0>);
600             return info;
601         }
602         case angle::FormatID::R16G16B16_SSCALED:
603         {
604             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,
605                                                &CopyNativeVertexData<GLshort, 3, 4, 1>);
606             return info;
607         }
608         case angle::FormatID::R16G16B16A16_SSCALED:
609         {
610             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_SINT,
611                                                &CopyNativeVertexData<GLshort, 4, 4, 0>);
612             return info;
613         }
614 
615         // GL_SHORT -- normalized
616         case angle::FormatID::R16_SNORM:
617         {
618             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM,
619                                                &CopyNativeVertexData<GLshort, 1, 1, 0>);
620             return info;
621         }
622         case angle::FormatID::R16G16_SNORM:
623         {
624             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM,
625                                                &CopyNativeVertexData<GLshort, 2, 2, 0>);
626             return info;
627         }
628         case angle::FormatID::R16G16B16_SNORM:
629         {
630             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SNORM,
631                                                &CopyNativeVertexData<GLshort, 3, 4, INT16_MAX>);
632             return info;
633         }
634         case angle::FormatID::R16G16B16A16_SNORM:
635         {
636             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM,
637                                                &CopyNativeVertexData<GLshort, 4, 4, 0>);
638             return info;
639         }
640 
641         // GL_UNSIGNED_SHORT -- un-normalized
642         case angle::FormatID::R16_USCALED:
643         {
644             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16_UINT,
645                                                &CopyNativeVertexData<GLushort, 1, 1, 0>);
646             return info;
647         }
648         case angle::FormatID::R16G16_USCALED:
649         {
650             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16_UINT,
651                                                &CopyNativeVertexData<GLushort, 2, 2, 0>);
652             return info;
653         }
654         case angle::FormatID::R16G16B16_USCALED:
655         {
656             static constexpr VertexFormat info(VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT,
657                                                &CopyNativeVertexData<GLushort, 3, 4, 1>);
658             return info;
659         }
660         case angle::FormatID::R16G16B16A16_USCALED:
661         {
662             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R16G16B16A16_UINT,
663                                                &CopyNativeVertexData<GLushort, 4, 4, 0>);
664             return info;
665         }
666 
667         // GL_UNSIGNED_SHORT -- normalized
668         case angle::FormatID::R16_UNORM:
669         {
670             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM,
671                                                &CopyNativeVertexData<GLushort, 1, 1, 0>);
672             return info;
673         }
674         case angle::FormatID::R16G16_UNORM:
675         {
676             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM,
677                                                &CopyNativeVertexData<GLushort, 2, 2, 0>);
678             return info;
679         }
680         case angle::FormatID::R16G16B16_UNORM:
681         {
682             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UNORM,
683                                                &CopyNativeVertexData<GLushort, 3, 4, UINT16_MAX>);
684             return info;
685         }
686         case angle::FormatID::R16G16B16A16_UNORM:
687         {
688             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM,
689                                                &CopyNativeVertexData<GLushort, 4, 4, 0>);
690             return info;
691         }
692 
693         // GL_INT -- un-normalized
694         case angle::FormatID::R32_SSCALED:
695         {
696             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_SINT,
697                                                &CopyNativeVertexData<GLint, 1, 1, 0>);
698             return info;
699         }
700         case angle::FormatID::R32G32_SSCALED:
701         {
702             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_SINT,
703                                                &CopyNativeVertexData<GLint, 2, 2, 0>);
704             return info;
705         }
706         case angle::FormatID::R32G32B32_SSCALED:
707         {
708             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_SINT,
709                                                &CopyNativeVertexData<GLint, 3, 3, 0>);
710             return info;
711         }
712         case angle::FormatID::R32G32B32A32_SSCALED:
713         {
714             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_SINT,
715                                                &CopyNativeVertexData<GLint, 4, 4, 0>);
716             return info;
717         }
718 
719         // GL_INT -- normalized
720         case angle::FormatID::R32_SNORM:
721         {
722             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
723                                                &CopyToFloatVertexData<GLint, 1, 1, true, false>);
724             return info;
725         }
726         case angle::FormatID::R32G32_SNORM:
727         {
728             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
729                                                &CopyToFloatVertexData<GLint, 2, 2, true, false>);
730             return info;
731         }
732         case angle::FormatID::R32G32B32_SNORM:
733         {
734             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
735                                                &CopyToFloatVertexData<GLint, 3, 3, true, false>);
736             return info;
737         }
738         case angle::FormatID::R32G32B32A32_SNORM:
739         {
740             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
741                                                &CopyToFloatVertexData<GLint, 4, 4, true, false>);
742             return info;
743         }
744 
745         // GL_UNSIGNED_INT -- un-normalized
746         case angle::FormatID::R32_USCALED:
747         {
748             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32_UINT,
749                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
750             return info;
751         }
752         case angle::FormatID::R32G32_USCALED:
753         {
754             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32_UINT,
755                                                &CopyNativeVertexData<GLuint, 2, 2, 0>);
756             return info;
757         }
758         case angle::FormatID::R32G32B32_USCALED:
759         {
760             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32_UINT,
761                                                &CopyNativeVertexData<GLuint, 3, 3, 0>);
762             return info;
763         }
764         case angle::FormatID::R32G32B32A32_USCALED:
765         {
766             static constexpr VertexFormat info(VERTEX_CONVERT_GPU, DXGI_FORMAT_R32G32B32A32_UINT,
767                                                &CopyNativeVertexData<GLuint, 4, 4, 0>);
768             return info;
769         }
770 
771         // GL_UNSIGNED_INT -- normalized
772         case angle::FormatID::R32_UNORM:
773         {
774             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
775                                                &CopyToFloatVertexData<GLuint, 1, 1, true, false>);
776             return info;
777         }
778         case angle::FormatID::R32G32_UNORM:
779         {
780             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
781                                                &CopyToFloatVertexData<GLuint, 2, 2, true, false>);
782             return info;
783         }
784         case angle::FormatID::R32G32B32_UNORM:
785         {
786             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
787                                                &CopyToFloatVertexData<GLuint, 3, 3, true, false>);
788             return info;
789         }
790         case angle::FormatID::R32G32B32A32_UNORM:
791         {
792             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
793                                                &CopyToFloatVertexData<GLuint, 4, 4, true, false>);
794             return info;
795         }
796 
797         // GL_FIXED
798         case angle::FormatID::R32_FIXED:
799         {
800             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32_FLOAT,
801                                                &Copy32FixedTo32FVertexData<1, 1>);
802             return info;
803         }
804         case angle::FormatID::R32G32_FIXED:
805         {
806             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32_FLOAT,
807                                                &Copy32FixedTo32FVertexData<2, 2>);
808             return info;
809         }
810         case angle::FormatID::R32G32B32_FIXED:
811         {
812             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32_FLOAT,
813                                                &Copy32FixedTo32FVertexData<3, 3>);
814             return info;
815         }
816         case angle::FormatID::R32G32B32A32_FIXED:
817         {
818             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
819                                                &Copy32FixedTo32FVertexData<4, 4>);
820             return info;
821         }
822 
823         // GL_HALF_FLOAT
824         case angle::FormatID::R16_FLOAT:
825         {
826             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT,
827                                                &CopyNativeVertexData<GLhalf, 1, 1, 0>);
828             return info;
829         }
830         case angle::FormatID::R16G16_FLOAT:
831         {
832             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT,
833                                                &CopyNativeVertexData<GLhalf, 2, 2, 0>);
834             return info;
835         }
836         case angle::FormatID::R16G16B16_FLOAT:
837         {
838             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_FLOAT,
839                                                &CopyNativeVertexData<GLhalf, 3, 4, gl::Float16One>);
840             return info;
841         }
842         case angle::FormatID::R16G16B16A16_FLOAT:
843         {
844             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT,
845                                                &CopyNativeVertexData<GLhalf, 4, 4, 0>);
846             return info;
847         }
848 
849         // GL_FLOAT
850         case angle::FormatID::R32_FLOAT:
851         {
852             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT,
853                                                &CopyNativeVertexData<GLfloat, 1, 1, 0>);
854             return info;
855         }
856         case angle::FormatID::R32G32_FLOAT:
857         {
858             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT,
859                                                &CopyNativeVertexData<GLfloat, 2, 2, 0>);
860             return info;
861         }
862         case angle::FormatID::R32G32B32_FLOAT:
863         {
864             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT,
865                                                &CopyNativeVertexData<GLfloat, 3, 3, 0>);
866             return info;
867         }
868         case angle::FormatID::R32G32B32A32_FLOAT:
869         {
870             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT,
871                                                &CopyNativeVertexData<GLfloat, 4, 4, 0>);
872             return info;
873         }
874 
875         // GL_INT_2_10_10_10_REV
876         case angle::FormatID::R10G10B10A2_SSCALED:
877         {
878             static constexpr VertexFormat info(
879                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
880                 &CopyXYZ10W2ToXYZWFloatVertexData<true, false, true, false>);
881             return info;
882         }
883         case angle::FormatID::R10G10B10A2_SNORM:
884         {
885             static constexpr VertexFormat info(
886                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
887                 &CopyXYZ10W2ToXYZWFloatVertexData<true, true, true, false>);
888             return info;
889         }
890 
891         // GL_UNSIGNED_INT_2_10_10_10_REV
892         case angle::FormatID::R10G10B10A2_USCALED:
893         {
894             static constexpr VertexFormat info(
895                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R32G32B32A32_FLOAT,
896                 &CopyXYZ10W2ToXYZWFloatVertexData<false, false, true, false>);
897             return info;
898         }
899         case angle::FormatID::R10G10B10A2_UNORM:
900         {
901             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM,
902                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
903             return info;
904         }
905 
906         //
907         // Integer Formats
908         //
909 
910         // GL_BYTE
911         case angle::FormatID::R8_SINT:
912         {
913             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SINT,
914                                                &CopyNativeVertexData<GLbyte, 1, 1, 0>);
915             return info;
916         }
917         case angle::FormatID::R8G8_SINT:
918         {
919             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SINT,
920                                                &CopyNativeVertexData<GLbyte, 2, 2, 0>);
921             return info;
922         }
923         case angle::FormatID::R8G8B8_SINT:
924         {
925             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_SINT,
926                                                &CopyNativeVertexData<GLbyte, 3, 4, 1>);
927             return info;
928         }
929         case angle::FormatID::R8G8B8A8_SINT:
930         {
931             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SINT,
932                                                &CopyNativeVertexData<GLbyte, 4, 4, 0>);
933             return info;
934         }
935 
936         // GL_UNSIGNED_BYTE
937         case angle::FormatID::R8_UINT:
938         {
939             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UINT,
940                                                &CopyNativeVertexData<GLubyte, 1, 1, 0>);
941             return info;
942         }
943         case angle::FormatID::R8G8_UINT:
944         {
945             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UINT,
946                                                &CopyNativeVertexData<GLubyte, 2, 2, 0>);
947             return info;
948         }
949         case angle::FormatID::R8G8B8_UINT:
950         {
951             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R8G8B8A8_UINT,
952                                                &CopyNativeVertexData<GLubyte, 3, 4, 1>);
953             return info;
954         }
955         case angle::FormatID::R8G8B8A8_UINT:
956         {
957             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UINT,
958                                                &CopyNativeVertexData<GLubyte, 4, 4, 0>);
959             return info;
960         }
961 
962         // GL_SHORT
963         case angle::FormatID::R16_SINT:
964         {
965             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SINT,
966                                                &CopyNativeVertexData<GLshort, 1, 1, 0>);
967             return info;
968         }
969         case angle::FormatID::R16G16_SINT:
970         {
971             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SINT,
972                                                &CopyNativeVertexData<GLshort, 2, 2, 0>);
973             return info;
974         }
975         case angle::FormatID::R16G16B16_SINT:
976         {
977             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT,
978                                                &CopyNativeVertexData<GLshort, 3, 4, 1>);
979             return info;
980         }
981         case angle::FormatID::R16G16B16A16_SINT:
982         {
983             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SINT,
984                                                &CopyNativeVertexData<GLshort, 4, 4, 0>);
985             return info;
986         }
987 
988         // GL_UNSIGNED_SHORT
989         case angle::FormatID::R16_UINT:
990         {
991             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UINT,
992                                                &CopyNativeVertexData<GLushort, 1, 1, 0>);
993             return info;
994         }
995         case angle::FormatID::R16G16_UINT:
996         {
997             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UINT,
998                                                &CopyNativeVertexData<GLushort, 2, 2, 0>);
999             return info;
1000         }
1001         case angle::FormatID::R16G16B16_UINT:
1002         {
1003             static constexpr VertexFormat info(VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_UINT,
1004                                                &CopyNativeVertexData<GLushort, 3, 4, 1>);
1005             return info;
1006         }
1007         case angle::FormatID::R16G16B16A16_UINT:
1008         {
1009             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UINT,
1010                                                &CopyNativeVertexData<GLushort, 4, 4, 0>);
1011             return info;
1012         }
1013 
1014         // GL_INT
1015         case angle::FormatID::R32_SINT:
1016         {
1017             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT,
1018                                                &CopyNativeVertexData<GLint, 1, 1, 0>);
1019             return info;
1020         }
1021         case angle::FormatID::R32G32_SINT:
1022         {
1023             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT,
1024                                                &CopyNativeVertexData<GLint, 2, 2, 0>);
1025             return info;
1026         }
1027         case angle::FormatID::R32G32B32_SINT:
1028         {
1029             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT,
1030                                                &CopyNativeVertexData<GLint, 3, 3, 0>);
1031             return info;
1032         }
1033         case angle::FormatID::R32G32B32A32_SINT:
1034         {
1035             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT,
1036                                                &CopyNativeVertexData<GLint, 4, 4, 0>);
1037             return info;
1038         }
1039 
1040         // GL_UNSIGNED_INT
1041         case angle::FormatID::R32_UINT:
1042         {
1043             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_SINT,
1044                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
1045             return info;
1046         }
1047         case angle::FormatID::R32G32_UINT:
1048         {
1049             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_SINT,
1050                                                &CopyNativeVertexData<GLuint, 2, 2, 0>);
1051             return info;
1052         }
1053         case angle::FormatID::R32G32B32_UINT:
1054         {
1055             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_SINT,
1056                                                &CopyNativeVertexData<GLuint, 3, 3, 0>);
1057             return info;
1058         }
1059         case angle::FormatID::R32G32B32A32_UINT:
1060         {
1061             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_SINT,
1062                                                &CopyNativeVertexData<GLuint, 4, 4, 0>);
1063             return info;
1064         }
1065 
1066         // GL_INT_2_10_10_10_REV
1067         case angle::FormatID::R10G10B10A2_SINT:
1068         {
1069             static constexpr VertexFormat info(
1070                 VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT,
1071                 &CopyXYZ10W2ToXYZWFloatVertexData<true, true, false, false>);
1072             return info;
1073         }
1074 
1075         // GL_UNSIGNED_INT_2_10_10_10_REV
1076         case angle::FormatID::R10G10B10A2_UINT:
1077         {
1078             static constexpr VertexFormat info(VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT,
1079                                                &CopyNativeVertexData<GLuint, 1, 1, 0>);
1080             return info;
1081         }
1082 
1083         default:
1084         {
1085             static constexpr VertexFormat info;
1086             return info;
1087         }
1088     }
1089 }
1090 
1091 }  // namespace d3d11
1092 
1093 }  // namespace rx
1094