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