tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

formatutils11.cpp (42031B)


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