1b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org//
2cec3590a151059813b91b33cd5e000c94f5bccaaGeoff Lang// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
3b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org// Use of this source code is governed by a BSD-style license that can be
4b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org// found in the LICENSE file.
5b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org//
6b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
7b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org// formatutils11.cpp: Queries for GL image formats and their translations to D3D11
8b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org// formats.
9b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
10c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/d3d11/formatutils11.h"
11b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org#include "libGLESv2/renderer/generatemip.h"
12b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org#include "libGLESv2/renderer/loadimage.h"
13fe28ca06248f5b9cf97e0c8678275997cbf6b4daGeoff Lang#include "libGLESv2/renderer/copyimage.h"
1400f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang#include "libGLESv2/renderer/Renderer.h"
157ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill#include "libGLESv2/renderer/copyvertex.h"
16b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
17b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.orgnamespace rx
18b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
19b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
209aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langnamespace d3d11
21b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
22b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
239aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::map<DXGI_FORMAT, GLenum> DXGIToESFormatMap;
24b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
259aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langinline void AddDXGIToESEntry(DXGIToESFormatMap *map, DXGI_FORMAT key, GLenum value)
269aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
279aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    map->insert(std::make_pair(key, value));
289aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang}
29b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
309aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic DXGIToESFormatMap BuildDXGIToESFormatMap()
31b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
329aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    DXGIToESFormatMap map;
33b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_UNKNOWN,                  GL_NONE);
35b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_A8_UNORM,                 GL_ALPHA8_EXT);
379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8_UNORM,                 GL_R8);
389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_UNORM,               GL_RG8);
399aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_UNORM,           GL_RGBA8);
409aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,      GL_SRGB8_ALPHA8);
419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_B8G8R8A8_UNORM,           GL_BGRA8_EXT);
42b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
439aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8_SNORM,                 GL_R8_SNORM);
449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_SNORM,               GL_RG8_SNORM);
459aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_SNORM,           GL_RGBA8_SNORM);
46b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
479aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8_UINT,                  GL_R8UI);
489aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16_UINT,                 GL_R16UI);
499aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32_UINT,                 GL_R32UI);
509aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_UINT,                GL_RG8UI);
519aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16_UINT,              GL_RG16UI);
529aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32_UINT,              GL_RG32UI);
539aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32_UINT,           GL_RGB32UI);
549aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_UINT,            GL_RGBA8UI);
559aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16B16A16_UINT,        GL_RGBA16UI);
569aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32A32_UINT,        GL_RGBA32UI);
57b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
589aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8_SINT,                  GL_R8I);
599aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16_SINT,                 GL_R16I);
609aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32_SINT,                 GL_R32I);
619aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8_SINT,                GL_RG8I);
629aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16_SINT,              GL_RG16I);
639aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32_SINT,              GL_RG32I);
649aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32_SINT,           GL_RGB32I);
659aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R8G8B8A8_SINT,            GL_RGBA8I);
669aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16B16A16_SINT,        GL_RGBA16I);
679aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32A32_SINT,        GL_RGBA32I);
68b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
699aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R10G10B10A2_UNORM,        GL_RGB10_A2);
709aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R10G10B10A2_UINT,         GL_RGB10_A2UI);
71b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
729aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16_FLOAT,                GL_R16F);
739aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16_FLOAT,             GL_RG16F);
749aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16G16B16A16_FLOAT,       GL_RGBA16F);
75b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
769aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32_FLOAT,                GL_R32F);
779aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32_FLOAT,             GL_RG32F);
789aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32_FLOAT,          GL_RGB32F);
799aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G32B32A32_FLOAT,       GL_RGBA32F);
80b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
819aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP,       GL_RGB9_E5);
829aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R11G11B10_FLOAT,          GL_R11F_G11F_B10F);
839aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
849aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16_TYPELESS,             GL_DEPTH_COMPONENT16);
859aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R16_UNORM,                GL_DEPTH_COMPONENT16);
869aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_D16_UNORM,                GL_DEPTH_COMPONENT16);
879aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R24G8_TYPELESS,           GL_DEPTH24_STENCIL8_OES);
889aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    GL_DEPTH24_STENCIL8_OES);
899aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_D24_UNORM_S8_UINT,        GL_DEPTH24_STENCIL8_OES);
909aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32G8X24_TYPELESS,        GL_DEPTH32F_STENCIL8);
919aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, GL_DEPTH32F_STENCIL8);
929aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     GL_DEPTH32F_STENCIL8);
939aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_R32_TYPELESS,             GL_DEPTH_COMPONENT32F);
949aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_D32_FLOAT,                GL_DEPTH_COMPONENT32F);
959aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
969aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_BC1_UNORM,                GL_COMPRESSED_RGBA_S3TC_DXT1_EXT);
979aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_BC2_UNORM,                GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE);
989aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    AddDXGIToESEntry(&map, DXGI_FORMAT_BC3_UNORM,                GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE);
99b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
100b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    return map;
101b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
102b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1039aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstruct D3D11FastCopyFormat
104b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
1059aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    GLenum destFormat;
1069aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    GLenum destType;
1079aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    ColorCopyFunction copyFunction;
1089aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
1099aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    D3D11FastCopyFormat(GLenum destFormat, GLenum destType, ColorCopyFunction copyFunction)
1109aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        : destFormat(destFormat), destType(destType), copyFunction(copyFunction)
1119aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    { }
1129aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
1139aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    bool operator<(const D3D11FastCopyFormat& other) const
114b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    {
1159aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        return memcmp(this, &other, sizeof(D3D11FastCopyFormat)) < 0;
116b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    }
1179aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang};
118b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1199aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::multimap<DXGI_FORMAT, D3D11FastCopyFormat> D3D11FastCopyMap;
120b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1219aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic D3D11FastCopyMap BuildFastCopyMap()
122b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
1239aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    D3D11FastCopyMap map;
124b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
125268b6bcd5d415e2169228f4f082e546ac05aa899Geoff Lang    map.insert(std::make_pair(DXGI_FORMAT_B8G8R8A8_UNORM, D3D11FastCopyFormat(GL_RGBA, GL_UNSIGNED_BYTE, CopyBGRA8ToRGBA8)));
126d3ff2169bfb788ff64a83987c93084854aee88bfGeoff Lang
1279aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    return map;
128b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
129b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1309aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstruct DXGIDepthStencilInfo
131b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
1329aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    unsigned int depthBits;
1339aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    unsigned int depthOffset;
1349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    unsigned int stencilBits;
1359aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    unsigned int stencilOffset;
1369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang};
137b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::map<DXGI_FORMAT, DXGIDepthStencilInfo> DepthStencilInfoMap;
1399aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::pair<DXGI_FORMAT, DXGIDepthStencilInfo> DepthStencilInfoPair;
140b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic inline void InsertDXGIDepthStencilInfo(DepthStencilInfoMap *map, DXGI_FORMAT format, unsigned int depthBits,
1429aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                              unsigned int depthOffset, unsigned int stencilBits, unsigned int stencilOffset)
1439aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
1449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    DXGIDepthStencilInfo info;
1459aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.depthBits = depthBits;
1469aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.depthOffset = depthOffset;
1479aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.stencilBits = stencilBits;
1489aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.stencilOffset = stencilOffset;
149b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1509aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    map->insert(std::make_pair(format, info));
1519aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang}
152b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1539aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic DepthStencilInfoMap BuildDepthStencilInfoMap()
1549aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
1559aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    DepthStencilInfoMap map;
156e4a492be45f39dffaea53c3523064844ee56e41bGeoff Lang
1579aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R16_TYPELESS,             16, 0, 0,  0);
1589aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R16_UNORM,                16, 0, 0,  0);
1599aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_D16_UNORM,                16, 0, 0,  0);
160b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1619aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R24G8_TYPELESS,           24, 0, 8, 24);
1629aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    24, 0, 8, 24);
1639aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_D24_UNORM_S8_UINT,        24, 0, 8, 24);
164b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1659aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R32_TYPELESS,             32, 0, 0,  0);
1669aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R32_FLOAT,                32, 0, 0,  0);
1679aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_D32_FLOAT,                32, 0, 0,  0);
168b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1699aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R32G8X24_TYPELESS,        32, 0, 8, 32);
1709aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, 32, 0, 8, 32);
1719aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertDXGIDepthStencilInfo(&map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     32, 0, 8, 32);
172b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1739aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    return map;
1749aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang}
175b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1769aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::map<DXGI_FORMAT, DXGIFormat> DXGIFormatInfoMap;
1779aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
1789aa00bbc5303cf7817d02d04860b044b3d29804dGeoff LangDXGIFormat::DXGIFormat()
1799aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    : pixelBytes(0),
1809aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      blockWidth(0),
1819aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      blockHeight(0),
1829aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      depthBits(0),
1839aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      depthOffset(0),
1849aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      stencilBits(0),
1859aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      stencilOffset(0),
1869aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      internalFormat(GL_NONE),
1879aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      componentType(GL_NONE),
1889aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      mipGenerationFunction(NULL),
1899aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      colorReadFunction(NULL),
1909aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      fastCopyFunctions()
1919aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
1929aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang}
193b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1949aa00bbc5303cf7817d02d04860b044b3d29804dGeoff LangColorCopyFunction DXGIFormat::getFastCopyFunction(GLenum format, GLenum type) const
1959aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
1969aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    FastCopyFunctionMap::const_iterator iter = fastCopyFunctions.find(std::make_pair(format, type));
1979aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    return (iter != fastCopyFunctions.end()) ? iter->second : NULL;
198b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
199b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
2009aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langvoid AddDXGIFormat(DXGIFormatInfoMap *map, DXGI_FORMAT dxgiFormat, GLuint pixelBits, GLuint blockWidth, GLuint blockHeight,
2019aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                   GLenum componentType, MipGenerationFunction mipFunc, ColorReadFunction readFunc)
202b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
2039aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    DXGIFormat info;
2049aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.pixelBytes = pixelBits / 8;
2059aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.blockWidth = blockWidth;
2069aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.blockHeight = blockHeight;
207b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
2089aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    static const DepthStencilInfoMap dsInfoMap = BuildDepthStencilInfoMap();
2099aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    DepthStencilInfoMap::const_iterator dsInfoIter = dsInfoMap.find(dxgiFormat);
2109aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    if (dsInfoIter != dsInfoMap.end())
2119aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    {
2129aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.depthBits = dsInfoIter->second.depthBits;
2139aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.depthOffset = dsInfoIter->second.depthOffset;
2149aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.stencilBits = dsInfoIter->second.stencilBits;
2159aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.stencilOffset = dsInfoIter->second.stencilOffset;
2169aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    }
2179aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    else
2189aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    {
2199aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.depthBits = 0;
2209aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.depthOffset = 0;
2219aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.stencilBits = 0;
2229aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.stencilOffset = 0;
2239aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    }
224ba9d750b929ffd8059cb9692a5bb440d3a050584shannonwoods@chromium.org
2259aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    static const DXGIToESFormatMap dxgiToESMap = BuildDXGIToESFormatMap();
2269aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    DXGIToESFormatMap::const_iterator dxgiToESIter = dxgiToESMap.find(dxgiFormat);
2279aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.internalFormat = (dxgiToESIter != dxgiToESMap.end()) ? dxgiToESIter->second : GL_NONE;
228b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
2299aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.componentType = componentType;
230b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
2319aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.mipGenerationFunction = mipFunc;
2329aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.colorReadFunction = readFunc;
233b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
2349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    static const D3D11FastCopyMap fastCopyMap = BuildFastCopyMap();
2359aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    std::pair<D3D11FastCopyMap::const_iterator, D3D11FastCopyMap::const_iterator> fastCopyIter = fastCopyMap.equal_range(dxgiFormat);
2369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    for (D3D11FastCopyMap::const_iterator i = fastCopyIter.first; i != fastCopyIter.second; i++)
2379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    {
2389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.fastCopyFunctions.insert(std::make_pair(std::make_pair(i->second.destFormat, i->second.destType), i->second.copyFunction));
2399aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    }
2409aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
2419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    map->insert(std::make_pair(dxgiFormat, info));
2429eeecfc20be089b62310787895870e0284cfb383Jamie Madill}
2439eeecfc20be089b62310787895870e0284cfb383Jamie Madill
2449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// A map to determine the pixel size and mipmap generation function of a given DXGI format
2459eeecfc20be089b62310787895870e0284cfb383Jamie Madillstatic DXGIFormatInfoMap BuildDXGIFormatInfoMap()
246b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
247b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    DXGIFormatInfoMap map;
248b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
2499aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    //                | DXGI format                          |S   |W |H |Component Type         | Mip generation function   | Color read function
250826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_UNKNOWN,                  0,   0, 0, GL_NONE,                NULL,                       NULL);
251826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
252826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_A8_UNORM,                 8,   1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<A8>,            ReadColor<A8, GLfloat>);
253826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8_UNORM,                 8,   1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8>,            ReadColor<R8, GLfloat>);
254826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8_UNORM,               16,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8G8>,          ReadColor<R8G8, GLfloat>);
255826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_UNORM,           32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8G8B8A8>,      ReadColor<R8G8B8A8, GLfloat>);
256826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,      32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R8G8B8A8>,      ReadColor<R8G8B8A8, GLfloat>);
257826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_B8G8R8A8_UNORM,           32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<B8G8R8A8>,      ReadColor<B8G8R8A8, GLfloat>);
258826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
259826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8_SNORM,                 8,   1, 1, GL_SIGNED_NORMALIZED,   GenerateMip<R8S>,           ReadColor<R8S, GLfloat>);
260826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8_SNORM,               16,  1, 1, GL_SIGNED_NORMALIZED,   GenerateMip<R8G8S>,         ReadColor<R8G8S, GLfloat>);
261826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_SNORM,           32,  1, 1, GL_SIGNED_NORMALIZED,   GenerateMip<R8G8B8A8S>,     ReadColor<R8G8B8A8S, GLfloat>);
262826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
263826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8_UINT,                  8,   1, 1, GL_UNSIGNED_INT,        GenerateMip<R8>,            ReadColor<R8, GLuint>);
264826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16_UINT,                 16,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R16>,           ReadColor<R16, GLuint>);
265826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32_UINT,                 32,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R32>,           ReadColor<R32, GLuint>);
266826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8_UINT,                16,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R8G8>,          ReadColor<R8G8, GLuint>);
267826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16_UINT,              32,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R16G16>,        ReadColor<R16G16, GLuint>);
268826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32_UINT,              64,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R32G32>,        ReadColor<R32G32, GLuint>);
269826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32_UINT,           96,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R32G32B32>,     ReadColor<R32G32B32, GLuint>);
270826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_UINT,            32,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R8G8B8A8>,      ReadColor<R8G8B8A8, GLuint>);
271826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_UINT,        64,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R16G16B16A16>,  ReadColor<R16G16B16A16, GLuint>);
272826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32A32_UINT,        128, 1, 1, GL_UNSIGNED_INT,        GenerateMip<R32G32B32A32>,  ReadColor<R32G32B32A32, GLuint>);
273826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
274826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8_SINT,                  8,   1, 1, GL_INT,                 GenerateMip<R8S>,           ReadColor<R8S, GLint>);
275826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16_SINT,                 16,  1, 1, GL_INT,                 GenerateMip<R16S>,          ReadColor<R16S, GLint>);
276826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32_SINT,                 32,  1, 1, GL_INT,                 GenerateMip<R32S>,          ReadColor<R32S, GLint>);
277826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8_SINT,                16,  1, 1, GL_INT,                 GenerateMip<R8G8S>,         ReadColor<R8G8S, GLint>);
278826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16_SINT,              32,  1, 1, GL_INT,                 GenerateMip<R16G16S>,       ReadColor<R16G16S, GLint>);
279826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32_SINT,              64,  1, 1, GL_INT,                 GenerateMip<R32G32S>,       ReadColor<R32G32S, GLint>);
280826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32_SINT,           96,  1, 1, GL_INT,                 GenerateMip<R32G32B32S>,    ReadColor<R32G32B32S, GLint>);
281826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R8G8B8A8_SINT,            32,  1, 1, GL_INT,                 GenerateMip<R8G8B8A8S>,     ReadColor<R8G8B8A8S, GLint>);
282826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_SINT,        64,  1, 1, GL_INT,                 GenerateMip<R16G16B16A16S>, ReadColor<R16G16B16A16S, GLint>);
283826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32A32_SINT,        128, 1, 1, GL_INT,                 GenerateMip<R32G32B32A32S>, ReadColor<R32G32B32A32S, GLint>);
284826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
285826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R10G10B10A2_UNORM,        32,  1, 1, GL_UNSIGNED_NORMALIZED, GenerateMip<R10G10B10A2>,   ReadColor<R10G10B10A2, GLfloat>);
286826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R10G10B10A2_UINT,         32,  1, 1, GL_UNSIGNED_INT,        GenerateMip<R10G10B10A2>,   ReadColor<R10G10B10A2, GLuint>);
287826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
288826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16_FLOAT,                16,  1, 1, GL_FLOAT,               GenerateMip<R16F>,          ReadColor<R16F, GLfloat>);
289826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16_FLOAT,             32,  1, 1, GL_FLOAT,               GenerateMip<R16G16F>,       ReadColor<R16G16F, GLfloat>);
290826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_FLOAT,       64,  1, 1, GL_FLOAT,               GenerateMip<R16G16B16A16F>, ReadColor<R16G16B16A16F, GLfloat>);
291826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
292826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32_FLOAT,                32,  1, 1, GL_FLOAT,               GenerateMip<R32F>,          ReadColor<R32F, GLfloat>);
293826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32_FLOAT,             64,  1, 1, GL_FLOAT,               GenerateMip<R32G32F>,       ReadColor<R32G32F, GLfloat>);
294826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32_FLOAT,          96,  1, 1, GL_FLOAT,               NULL,                       NULL);
295826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G32B32A32_FLOAT,       128, 1, 1, GL_FLOAT,               GenerateMip<R32G32B32A32F>, ReadColor<R32G32B32A32F, GLfloat>);
296826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
297826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R9G9B9E5_SHAREDEXP,       32,  1, 1, GL_FLOAT,               GenerateMip<R9G9B9E5>,      ReadColor<R9G9B9E5, GLfloat>);
298826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R11G11B10_FLOAT,          32,  1, 1, GL_FLOAT,               GenerateMip<R11G11B10F>,    ReadColor<R11G11B10F, GLfloat>);
299826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
300826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16_TYPELESS,             16,  1, 1, GL_NONE,                NULL,                       NULL);
301826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16_UNORM,                16,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
302826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_D16_UNORM,                16,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
303826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R24G8_TYPELESS,           32,  1, 1, GL_NONE,                NULL,                       NULL);
304826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    32,  1, 1, GL_NONE,                NULL,                       NULL);
305826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_D24_UNORM_S8_UINT,        32,  1, 1, GL_UNSIGNED_INT,        NULL,                       NULL);
306826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32G8X24_TYPELESS,        64,  1, 1, GL_NONE,                NULL,                       NULL);
307826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, 64,  1, 1, GL_NONE,                NULL,                       NULL);
308826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_D32_FLOAT_S8X24_UINT,     64,  1, 1, GL_UNSIGNED_INT,        NULL,                       NULL);
309826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R32_TYPELESS,             32,  1, 1, GL_NONE,                NULL,                       NULL);
310826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_D32_FLOAT,                32,  1, 1, GL_FLOAT,               NULL,                       NULL);
311826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
312826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_BC1_UNORM,                64,  4, 4, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
313826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_BC2_UNORM,                128, 4, 4, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
314826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_BC3_UNORM,                128, 4, 4, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
315826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
316826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    // Useful formats for vertex buffers
317826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16_UNORM,                16,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
318826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16_SNORM,                16,  1, 1, GL_SIGNED_NORMALIZED,   NULL,                       NULL);
319826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16_UNORM,             32,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
320826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16_SNORM,             32,  1, 1, GL_SIGNED_NORMALIZED,   NULL,                       NULL);
321826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_UNORM,       64,  1, 1, GL_UNSIGNED_NORMALIZED, NULL,                       NULL);
322826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill    AddDXGIFormat(&map, DXGI_FORMAT_R16G16B16A16_SNORM,       64,  1, 1, GL_SIGNED_NORMALIZED,   NULL,                       NULL);
323b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
324b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    return map;
325b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
326b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
3279aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langconst DXGIFormat &GetDXGIFormatInfo(DXGI_FORMAT format)
32861e49a5cacc894fe2de1273c65374a5e7083a05fGeoff Lang{
3299eeecfc20be089b62310787895870e0284cfb383Jamie Madill    static const DXGIFormatInfoMap infoMap = BuildDXGIFormatInfoMap();
330b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    DXGIFormatInfoMap::const_iterator iter = infoMap.find(format);
331b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    if (iter != infoMap.end())
332b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    {
3339aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        return iter->second;
334d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    }
335d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    else
336d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    {
3379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        static DXGIFormat defaultInfo;
3389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        return defaultInfo;
339d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    }
340d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang}
341d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang
34200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Langstruct SwizzleSizeType
34300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang{
3449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    size_t maxComponentSize;
3459aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    GLenum componentType;
34600f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
34700f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    SwizzleSizeType()
3489aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        : maxComponentSize(0), componentType(GL_NONE)
34900f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    { }
35000f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
3519aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    SwizzleSizeType(size_t maxComponentSize, GLenum componentType)
3529aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        : maxComponentSize(maxComponentSize), componentType(componentType)
35300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    { }
35400f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
35500f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    bool operator<(const SwizzleSizeType& other) const
35600f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    {
3579aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        return (maxComponentSize != other.maxComponentSize) ? (maxComponentSize < other.maxComponentSize)
3589aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                                            : (componentType < other.componentType);
35900f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    }
36000f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang};
36100f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
36200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Langstruct SwizzleFormatInfo
36300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang{
36400f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    DXGI_FORMAT mTexFormat;
36500f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    DXGI_FORMAT mSRVFormat;
36600f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    DXGI_FORMAT mRTVFormat;
36700f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
36800f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    SwizzleFormatInfo()
36900f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang        : mTexFormat(DXGI_FORMAT_UNKNOWN), mSRVFormat(DXGI_FORMAT_UNKNOWN), mRTVFormat(DXGI_FORMAT_UNKNOWN)
37000f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    { }
37100f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
37200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    SwizzleFormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat)
37300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang        : mTexFormat(texFormat), mSRVFormat(srvFormat), mRTVFormat(rtvFormat)
37400f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    { }
37500f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang};
37600f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
37700f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Langtypedef std::map<SwizzleSizeType, SwizzleFormatInfo> SwizzleInfoMap;
37800f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Langtypedef std::pair<SwizzleSizeType, SwizzleFormatInfo> SwizzleInfoPair;
37900f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
38000f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Langstatic SwizzleInfoMap BuildSwizzleInfoMap()
38100f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang{
38200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    SwizzleInfoMap map;
38300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
38400f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM    )));
38567938efc2bd9cae57b2c3e24fb20821dec00a788Geoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM, DXGI_FORMAT_R16G16B16A16_UNORM)));
38667938efc2bd9cae57b2c3e24fb20821dec00a788Geoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(24, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT)));
38767938efc2bd9cae57b2c3e24fb20821dec00a788Geoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_UNSIGNED_NORMALIZED), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT)));
38800f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
38900f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_SIGNED_NORMALIZED  ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_SNORM,     DXGI_FORMAT_R8G8B8A8_SNORM,     DXGI_FORMAT_R8G8B8A8_SNORM    )));
39000f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
39100f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_FLOAT              ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT)));
39200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_FLOAT              ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT)));
39300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
39400f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_UNSIGNED_INT       ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_UINT,      DXGI_FORMAT_R8G8B8A8_UINT,      DXGI_FORMAT_R8G8B8A8_UINT     )));
39500f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_UNSIGNED_INT       ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_UINT,  DXGI_FORMAT_R16G16B16A16_UINT,  DXGI_FORMAT_R16G16B16A16_UINT )));
39600f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_UNSIGNED_INT       ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_UINT,  DXGI_FORMAT_R32G32B32A32_UINT,  DXGI_FORMAT_R32G32B32A32_UINT )));
39700f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
39800f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType( 8, GL_INT                ), SwizzleFormatInfo(DXGI_FORMAT_R8G8B8A8_SINT,      DXGI_FORMAT_R8G8B8A8_SINT,      DXGI_FORMAT_R8G8B8A8_SINT     )));
39900f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(16, GL_INT                ), SwizzleFormatInfo(DXGI_FORMAT_R16G16B16A16_SINT,  DXGI_FORMAT_R16G16B16A16_SINT,  DXGI_FORMAT_R16G16B16A16_SINT )));
40000f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    map.insert(SwizzleInfoPair(SwizzleSizeType(32, GL_INT                ), SwizzleFormatInfo(DXGI_FORMAT_R32G32B32A32_SINT,  DXGI_FORMAT_R32G32B32A32_SINT,  DXGI_FORMAT_R32G32B32A32_SINT )));
40100f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
40200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang    return map;
40300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang}
4049aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
4050c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Langtypedef std::pair<GLint, InitializeTextureDataFunction> InternalFormatInitializerPair;
4060c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Langtypedef std::map<GLint, InitializeTextureDataFunction> InternalFormatInitializerMap;
4070c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang
4080c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Langstatic InternalFormatInitializerMap BuildInternalFormatInitializerMap()
4090c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang{
4100c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang    InternalFormatInitializerMap map;
4110c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang
41286846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB8,    Initialize4ComponentData<GLubyte,  0x00,       0x00,       0x00,       0xFF>          ));
41386846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB565,  Initialize4ComponentData<GLubyte,  0x00,       0x00,       0x00,       0xFF>          ));
41486846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_SRGB8,   Initialize4ComponentData<GLubyte,  0x00,       0x00,       0x00,       0xFF>          ));
41586846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB16F,  Initialize4ComponentData<GLhalf,   0x0000,     0x0000,     0x0000,     gl::Float16One>));
41686846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB32F,  Initialize4ComponentData<GLfloat,  0x00000000, 0x00000000, 0x00000000, gl::Float32One>));
41786846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB8UI,  Initialize4ComponentData<GLubyte,  0x00,       0x00,       0x00,       0x01>          ));
41886846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB8I,   Initialize4ComponentData<GLbyte,   0x00,       0x00,       0x00,       0x01>          ));
41986846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB16UI, Initialize4ComponentData<GLushort, 0x0000,     0x0000,     0x0000,     0x0001>        ));
42086846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB16I,  Initialize4ComponentData<GLshort,  0x0000,     0x0000,     0x0000,     0x0001>        ));
42186846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB32UI, Initialize4ComponentData<GLuint,   0x00000000, 0x00000000, 0x00000000, 0x00000001>    ));
42286846e242e61e16d19e7a07492c081ee29a59694Geoff Lang    map.insert(InternalFormatInitializerPair(GL_RGB32I,  Initialize4ComponentData<GLint,    0x00000000, 0x00000000, 0x00000000, 0x00000001>    ));
4230c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang
4249aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    return map;
4259aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang}
4269aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
4279aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// ES3 image loading functions vary based on the internal format and data type given,
4289aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// this map type determines the loading function from the internal format and type supplied
4299aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// to glTex*Image*D and the destination DXGI_FORMAT. Source formats and types are taken from
4309aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// Tables 3.2 and 3.3 of the ES 3 spec.
4319aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::pair<GLenum, LoadImageFunction> TypeLoadFunctionPair;
4329aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::map<GLenum, std::vector<TypeLoadFunctionPair> > D3D11LoadFunctionMap;
4339aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
4349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic void UnimplementedLoadFunction(size_t width, size_t height, size_t depth,
4359aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
4369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
4379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
4389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    UNIMPLEMENTED();
4399aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang}
4409aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
4419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic void UnreachableLoadFunction(size_t width, size_t height, size_t depth,
4429aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                    const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
4439aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                    uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch)
4449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
4459aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    UNREACHABLE();
4460c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang}
44700f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
4489aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// A helper function to insert data into the D3D11LoadFunctionMap with fewer characters.
4499aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic inline void InsertLoadFunction(D3D11LoadFunctionMap *map, GLenum internalFormat, GLenum type,
4509aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                      LoadImageFunction loadFunc)
45100f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang{
4529aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    (*map)[internalFormat].push_back(TypeLoadFunctionPair(type, loadFunc));
45300f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang}
45400f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
4559aa00bbc5303cf7817d02d04860b044b3d29804dGeoff LangD3D11LoadFunctionMap BuildD3D11LoadFunctionMap()
45600f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang{
4579aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    D3D11LoadFunctionMap map;
45880b5a55eafb52a9e72676ce7c91c34ce037f4783Jamie Madill
4599aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    //                      | Internal format      | Type                             | Load function                       |
4609aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA8,              GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>             );
4619aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB5_A1,            GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>             );
4629aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA4,              GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>             );
4639aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_SRGB8_ALPHA8,       GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>             );
4649aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA8_SNORM,        GL_BYTE,                           LoadToNative<GLbyte, 4>              );
4659aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA4,              GL_UNSIGNED_SHORT_4_4_4_4,         LoadRGBA4ToRGBA8                     );
4669aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB10_A2,           GL_UNSIGNED_INT_2_10_10_10_REV,    LoadToNative<GLuint, 1>              );
4679aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB5_A1,            GL_UNSIGNED_SHORT_5_5_5_1,         LoadRGB5A1ToRGBA8                    );
4689aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB5_A1,            GL_UNSIGNED_INT_2_10_10_10_REV,    LoadRGB10A2ToRGBA8                   );
4699aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA16F,            GL_HALF_FLOAT,                     LoadToNative<GLhalf, 4>              );
4709aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA16F,            GL_HALF_FLOAT_OES,                 LoadToNative<GLhalf, 4>              );
4719aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA32F,            GL_FLOAT,                          LoadToNative<GLfloat, 4>             );
4729aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA16F,            GL_FLOAT,                          Load32FTo16F<4>                      );
4739aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA8UI,            GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>             );
4749aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA8I,             GL_BYTE,                           LoadToNative<GLbyte, 4>              );
4759aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA16UI,           GL_UNSIGNED_SHORT,                 LoadToNative<GLushort, 4>            );
4769aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA16I,            GL_SHORT,                          LoadToNative<GLshort, 4>             );
4779aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA32UI,           GL_UNSIGNED_INT,                   LoadToNative<GLuint, 4>              );
4789aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA32I,            GL_INT,                            LoadToNative<GLint, 4>               );
4799aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB10_A2UI,         GL_UNSIGNED_INT_2_10_10_10_REV,    LoadToNative<GLuint, 1>              );
4809aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB8,               GL_UNSIGNED_BYTE,                  LoadToNative3To4<GLubyte, 0xFF>      );
4819aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB565,             GL_UNSIGNED_BYTE,                  LoadToNative3To4<GLubyte, 0xFF>      );
4829aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_SRGB8,              GL_UNSIGNED_BYTE,                  LoadToNative3To4<GLubyte, 0xFF>      );
4839aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB8_SNORM,         GL_BYTE,                           LoadToNative3To4<GLbyte, 0x7F>       );
4849aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB565,             GL_UNSIGNED_SHORT_5_6_5,           LoadR5G6B5ToRGBA8                    );
4859aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R11F_G11F_B10F,     GL_UNSIGNED_INT_10F_11F_11F_REV,   LoadToNative<GLuint, 1>              );
4869aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB9_E5,            GL_UNSIGNED_INT_5_9_9_9_REV,       LoadToNative<GLuint, 1>              );
4879aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB16F,             GL_HALF_FLOAT,                     LoadToNative3To4<GLhalf, gl::Float16One>);
4889aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB16F,             GL_HALF_FLOAT_OES,                 LoadToNative3To4<GLhalf, gl::Float16One>);
4899aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R11F_G11F_B10F,     GL_HALF_FLOAT,                     LoadRGB16FToRG11B10F                 );
4909aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R11F_G11F_B10F,     GL_HALF_FLOAT_OES,                 LoadRGB16FToRG11B10F                 );
4919aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB9_E5,            GL_HALF_FLOAT,                     LoadRGB16FToRGB9E5                   );
4929aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB9_E5,            GL_HALF_FLOAT_OES,                 LoadRGB16FToRGB9E5                   );
4939aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB32F,             GL_FLOAT,                          LoadToNative3To4<GLfloat, gl::Float32One>);
4949aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB16F,             GL_FLOAT,                          LoadRGB32FToRGBA16F                  );
4959aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R11F_G11F_B10F,     GL_FLOAT,                          LoadRGB32FToRG11B10F                 );
4969aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB9_E5,            GL_FLOAT,                          LoadRGB32FToRGB9E5                   );
4979aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB8UI,             GL_UNSIGNED_BYTE,                  LoadToNative3To4<GLubyte, 0x01>      );
4989aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB8I,              GL_BYTE,                           LoadToNative3To4<GLbyte, 0x01>       );
4999aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB16UI,            GL_UNSIGNED_SHORT,                 LoadToNative3To4<GLushort, 0x0001>   );
5009aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB16I,             GL_SHORT,                          LoadToNative3To4<GLshort, 0x0001>    );
5019aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB32UI,            GL_UNSIGNED_INT,                   LoadToNative3To4<GLuint, 0x00000001> );
5029aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB32I,             GL_INT,                            LoadToNative3To4<GLint, 0x00000001>  );
5039aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG8,                GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 2>             );
5049aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG8_SNORM,          GL_BYTE,                           LoadToNative<GLbyte, 2>              );
5059aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG16F,              GL_HALF_FLOAT,                     LoadToNative<GLhalf, 2>              );
5069aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG16F,              GL_HALF_FLOAT_OES,                 LoadToNative<GLhalf, 2>              );
5079aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG32F,              GL_FLOAT,                          LoadToNative<GLfloat, 2>             );
5089aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG16F,              GL_FLOAT,                          Load32FTo16F<2>                      );
5099aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG8UI,              GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 2>             );
5109aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG8I,               GL_BYTE,                           LoadToNative<GLbyte, 2>              );
5119aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG16UI,             GL_UNSIGNED_SHORT,                 LoadToNative<GLushort, 2>            );
5129aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG16I,              GL_SHORT,                          LoadToNative<GLshort, 2>             );
5139aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG32UI,             GL_UNSIGNED_INT,                   LoadToNative<GLuint, 2>              );
5149aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RG32I,              GL_INT,                            LoadToNative<GLint, 2>               );
5159aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R8,                 GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 1>             );
5169aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R8_SNORM,           GL_BYTE,                           LoadToNative<GLbyte, 1>              );
5179aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R16F,               GL_HALF_FLOAT,                     LoadToNative<GLhalf, 1>              );
5189aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R16F,               GL_HALF_FLOAT_OES,                 LoadToNative<GLhalf, 1>              );
5199aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R32F,               GL_FLOAT,                          LoadToNative<GLfloat, 1>             );
5209aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R16F,               GL_FLOAT,                          Load32FTo16F<1>                      );
5219aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R8UI,               GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 1>             );
5229aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R8I,                GL_BYTE,                           LoadToNative<GLbyte, 1>              );
5239aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R16UI,              GL_UNSIGNED_SHORT,                 LoadToNative<GLushort, 1>            );
5249aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R16I,               GL_SHORT,                          LoadToNative<GLshort, 1>             );
5259aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R32UI,              GL_UNSIGNED_INT,                   LoadToNative<GLuint, 1>              );
5269aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_R32I,               GL_INT,                            LoadToNative<GLint, 1>               );
5279aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_DEPTH_COMPONENT16,  GL_UNSIGNED_SHORT,                 LoadToNative<GLushort, 1>            );
5289aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_DEPTH_COMPONENT24,  GL_UNSIGNED_INT,                   LoadR32ToR24G8                       );
5299aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_DEPTH_COMPONENT16,  GL_UNSIGNED_INT,                   LoadR32ToR16                         );
5309aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_DEPTH_COMPONENT32F, GL_FLOAT,                          LoadToNative<GLfloat, 1>             );
5319aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_DEPTH24_STENCIL8,   GL_UNSIGNED_INT_24_8,              LoadR32ToR24G8                       );
5329aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_DEPTH32F_STENCIL8,  GL_FLOAT_32_UNSIGNED_INT_24_8_REV, LoadToNative<GLuint, 2>              );
5335d601382b51c29d1670b58c01360416bd929842dGeoff Lang
5349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Unsized formats
5359aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Load functions are unreachable because they are converted to sized internal formats based on
5369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // the format and type before loading takes place.
5379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA,               GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
5389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA,               GL_UNSIGNED_SHORT_4_4_4_4,         UnreachableLoadFunction              );
5399aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGBA,               GL_UNSIGNED_SHORT_5_5_5_1,         UnreachableLoadFunction              );
5409aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB,                GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
5419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_RGB,                GL_UNSIGNED_SHORT_5_6_5,           UnreachableLoadFunction              );
5429aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE_ALPHA,    GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
5439aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE,          GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
5449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA,              GL_UNSIGNED_BYTE,                  UnreachableLoadFunction              );
54580b5a55eafb52a9e72676ce7c91c34ce037f4783Jamie Madill
5469aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_OES_texture_float
5479aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE_ALPHA,    GL_FLOAT,                          LoadLA32FToRGBA32F                   );
5489aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE,          GL_FLOAT,                          LoadL32FToRGBA32F                    );
5499aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA,              GL_FLOAT,                          LoadA32FToRGBA32F                    );
55000f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
5519aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_OES_texture_half_float
5529aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE_ALPHA,    GL_HALF_FLOAT,                     LoadLA16FToRGBA16F                   );
5539aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE_ALPHA,    GL_HALF_FLOAT_OES,                 LoadLA16FToRGBA16F                   );
5549aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE,          GL_HALF_FLOAT,                     LoadL16FToRGBA16F                    );
5559aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE,          GL_HALF_FLOAT_OES,                 LoadL16FToRGBA16F                    );
5569aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA,              GL_HALF_FLOAT,                     LoadA16FToRGBA16F                    );
5579aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA,              GL_HALF_FLOAT_OES,                 LoadA16FToRGBA16F                    );
55800f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
5599aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_EXT_texture_storage
5609aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA8_EXT,             GL_UNSIGNED_BYTE,              LoadToNative<GLubyte, 1>             );
5619aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE8_EXT,         GL_UNSIGNED_BYTE,              LoadL8ToRGBA8                        );
5629aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE8_ALPHA8_EXT,  GL_UNSIGNED_BYTE,              LoadLA8ToRGBA8                       );
5639aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA32F_EXT,           GL_FLOAT,                      LoadA32FToRGBA32F                    );
5649aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE32F_EXT,       GL_FLOAT,                      LoadL32FToRGBA32F                    );
5659aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE_ALPHA32F_EXT, GL_FLOAT,                      LoadLA32FToRGBA32F                   );
5669aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA16F_EXT,           GL_HALF_FLOAT,                 LoadA16FToRGBA16F                    );
5679aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_ALPHA16F_EXT,           GL_HALF_FLOAT_OES,             LoadA16FToRGBA16F                    );
5689aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE16F_EXT,       GL_HALF_FLOAT,                 LoadL16FToRGBA16F                    );
5699aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE16F_EXT,       GL_HALF_FLOAT_OES,             LoadL16FToRGBA16F                    );
5709aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE_ALPHA16F_EXT, GL_HALF_FLOAT,                 LoadLA16FToRGBA16F                   );
5719aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_LUMINANCE_ALPHA16F_EXT, GL_HALF_FLOAT_OES,             LoadLA16FToRGBA16F                   );
57200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
5739aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_ANGLE_depth_texture
5749aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_DEPTH_COMPONENT32_OES,  GL_UNSIGNED_INT,               LoadR32ToR24G8                       );
5750c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang
5769aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_EXT_texture_format_BGRA8888
5779aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_BGRA8_EXT,              GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>         );
5789aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_BGRA4_ANGLEX,           GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, LoadRGBA4ToRGBA8                 );
5799aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_BGRA4_ANGLEX,           GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>         );
5809aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_BGR5_A1_ANGLEX,         GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, LoadRGB5A1ToRGBA8                );
5819aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_BGR5_A1_ANGLEX,         GL_UNSIGNED_BYTE,                  LoadToNative<GLubyte, 4>         );
582b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
5839aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Compressed formats
5849aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From ES 3.0.1 spec, table 3.16
5859aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    //                      | Internal format                             | Type            | Load function                  |
5869aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5879aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_R11_EAC,                        GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5889aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_SIGNED_R11_EAC,                 GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5899aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RG11_EAC,                       GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5909aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_SIGNED_RG11_EAC,                GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5919aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RGB8_ETC2,                      GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5929aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_SRGB8_ETC2,                     GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5939aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5949aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5959aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RGBA8_ETC2_EAC,                 GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
5969aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          GL_UNSIGNED_BYTE, UnimplementedLoadFunction       );
597b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
5989aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_EXT_texture_compression_dxt1
5999aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,              GL_UNSIGNED_BYTE, LoadCompressedToNative<4, 4,  8>);
6009aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,             GL_UNSIGNED_BYTE, LoadCompressedToNative<4, 4,  8>);
601b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
6029aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_ANGLE_texture_compression_dxt3
6039aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,           GL_UNSIGNED_BYTE, LoadCompressedToNative<4, 4, 16>);
604b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
6059aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_ANGLE_texture_compression_dxt5
6069aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,           GL_UNSIGNED_BYTE, LoadCompressedToNative<4, 4, 16>);
607b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
6089aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    return map;
609b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
610b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
6119aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// For sized GL internal formats, there is only one corresponding D3D11 format. This map type allows
6129aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// querying for the DXGI texture formats to use for textures, SRVs, RTVs and DSVs given a GL internal
6139aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang// format.
6149aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::map<GLenum, TextureFormat> D3D11ES3FormatMap;
6159aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
6169aa00bbc5303cf7817d02d04860b044b3d29804dGeoff LangTextureFormat::TextureFormat()
6179aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    : texFormat(DXGI_FORMAT_UNKNOWN),
6189aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      srvFormat(DXGI_FORMAT_UNKNOWN),
6199aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      rtvFormat(DXGI_FORMAT_UNKNOWN),
6209aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      dsvFormat(DXGI_FORMAT_UNKNOWN),
6219aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      renderFormat(DXGI_FORMAT_UNKNOWN),
6229aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      swizzleTexFormat(DXGI_FORMAT_UNKNOWN),
6239aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      swizzleSRVFormat(DXGI_FORMAT_UNKNOWN),
6249aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      swizzleRTVFormat(DXGI_FORMAT_UNKNOWN),
6259aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      dataInitializerFunction(NULL),
6269aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      loadFunctions()
627826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill{
628826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill}
629826f3d30905af11dded9fb0d2973067f4287d800Jamie Madill
6309aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic inline void InsertD3D11FormatInfo(D3D11ES3FormatMap *map, GLenum internalFormat, DXGI_FORMAT texFormat,
6319aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang                                         DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat)
632d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang{
6339aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    TextureFormat info;
6349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.texFormat = texFormat;
6359aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.srvFormat = srvFormat;
6369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.rtvFormat = rtvFormat;
6379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.dsvFormat = dsvFormat;
638d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang
6399aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Given a GL internal format, the renderFormat is the DSV format if it is depth- or stencil-renderable,
6409aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // the RTV format if it is color-renderable, and the (nonrenderable) texture format otherwise.
6419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    if (dsvFormat != DXGI_FORMAT_UNKNOWN)
642d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    {
6439aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.renderFormat = dsvFormat;
644d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    }
6459aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    else if (rtvFormat != DXGI_FORMAT_UNKNOWN)
646d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    {
6479aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.renderFormat = rtvFormat;
648d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    }
6499aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    else if (texFormat != DXGI_FORMAT_UNKNOWN)
650d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    {
6519aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.renderFormat = texFormat;
652d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    }
653d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    else
654d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    {
6559aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        info.renderFormat = DXGI_FORMAT_UNKNOWN;
656d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    }
657d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang
6589aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Compute the swizzle formats
6599aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    const gl::InternalFormat &formatInfo = gl::GetInternalFormatInfo(internalFormat);
660299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang    if (internalFormat != GL_NONE && formatInfo.pixelBytes > 0)
661d8c861388d753c94b5b63e2597485101fe0e4c1dGeoff Lang    {
662299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang        if (formatInfo.componentCount != 4 || texFormat == DXGI_FORMAT_UNKNOWN ||
663299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            srvFormat == DXGI_FORMAT_UNKNOWN || rtvFormat == DXGI_FORMAT_UNKNOWN)
6649aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        {
665299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            // Get the maximum sized component
666299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            unsigned int maxBits = 1;
667299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            if (formatInfo.compressed)
668299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            {
669299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                unsigned int compressedBitsPerBlock = formatInfo.pixelBytes * 8;
670299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                unsigned int blockSize = formatInfo.compressedBlockWidth * formatInfo.compressedBlockHeight;
671299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                maxBits = std::max(compressedBitsPerBlock / blockSize, maxBits);
672299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            }
673299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            else
674299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            {
675299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                maxBits = std::max(maxBits, formatInfo.alphaBits);
676299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                maxBits = std::max(maxBits, formatInfo.redBits);
677299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                maxBits = std::max(maxBits, formatInfo.greenBits);
678299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                maxBits = std::max(maxBits, formatInfo.blueBits);
679299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                maxBits = std::max(maxBits, formatInfo.luminanceBits);
680299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang                maxBits = std::max(maxBits, formatInfo.depthBits);
681299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            }
682299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang
683299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            maxBits = roundUp(maxBits, 8U);
684299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang
685299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            static const SwizzleInfoMap swizzleMap = BuildSwizzleInfoMap();
686299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            SwizzleInfoMap::const_iterator swizzleIter = swizzleMap.find(SwizzleSizeType(maxBits, formatInfo.componentType));
687299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            ASSERT(swizzleIter != swizzleMap.end());
688299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang
689299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            const SwizzleFormatInfo &swizzleInfo = swizzleIter->second;
690299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            info.swizzleTexFormat = swizzleInfo.mTexFormat;
691299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            info.swizzleSRVFormat = swizzleInfo.mSRVFormat;
692299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            info.swizzleRTVFormat = swizzleInfo.mRTVFormat;
6939aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        }
6949aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        else
6959aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        {
696299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            // The original texture format is suitable for swizzle operations
697299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            info.swizzleTexFormat = texFormat;
698299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            info.swizzleSRVFormat = srvFormat;
699299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang            info.swizzleRTVFormat = rtvFormat;
7009aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        }
701b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    }
702b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    else
703b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    {
704299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang        // Not possible to swizzle with this texture format since it is either unsized or GL_NONE
705299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang        info.swizzleTexFormat = DXGI_FORMAT_UNKNOWN;
706299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang        info.swizzleSRVFormat = DXGI_FORMAT_UNKNOWN;
707299fcf29431a4777868da1f8c1d3cd796d14e570Geoff Lang        info.swizzleRTVFormat = DXGI_FORMAT_UNKNOWN;
708b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    }
709b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
7109aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Check if there is an initialization function for this texture format
7119aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    static const InternalFormatInitializerMap initializerMap = BuildInternalFormatInitializerMap();
7129aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InternalFormatInitializerMap::const_iterator initializerIter = initializerMap.find(internalFormat);
7139aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.dataInitializerFunction = (initializerIter != initializerMap.end()) ? initializerIter->second : NULL;
71461e49a5cacc894fe2de1273c65374a5e7083a05fGeoff Lang
7159aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Gather all the load functions for this internal format
7169aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    static const D3D11LoadFunctionMap loadFunctions = BuildD3D11LoadFunctionMap();
7179aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    D3D11LoadFunctionMap::const_iterator loadFunctionIter = loadFunctions.find(internalFormat);
7189aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    if (loadFunctionIter != loadFunctions.end())
719fe28ca06248f5b9cf97e0c8678275997cbf6b4daGeoff Lang    {
7209aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        const std::vector<TypeLoadFunctionPair> &loadFunctionVector = loadFunctionIter->second;
7219aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        for (size_t i = 0; i < loadFunctionVector.size(); i++)
7229aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        {
7239aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang            GLenum type = loadFunctionVector[i].first;
7249aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang            LoadImageFunction function = loadFunctionVector[i].second;
7259aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang            info.loadFunctions.insert(std::make_pair(type, function));
7269aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        }
727fe28ca06248f5b9cf97e0c8678275997cbf6b4daGeoff Lang    }
728fe28ca06248f5b9cf97e0c8678275997cbf6b4daGeoff Lang
7299aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    map->insert(std::make_pair(internalFormat, info));
730b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
731b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
7329aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic D3D11ES3FormatMap BuildD3D11FormatMap()
733b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org{
7349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    D3D11ES3FormatMap map;
735b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
7369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    //                         | GL internal format  | D3D11 texture format            | D3D11 SRV format               | D3D11 RTV format               | D3D11 DSV format   |
7379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_NONE,              DXGI_FORMAT_UNKNOWN,              DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
7389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R8,                DXGI_FORMAT_R8_UNORM,             DXGI_FORMAT_R8_UNORM,            DXGI_FORMAT_R8_UNORM,            DXGI_FORMAT_UNKNOWN);
7399aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R8_SNORM,          DXGI_FORMAT_R8_SNORM,             DXGI_FORMAT_R8_SNORM,            DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
7409aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG8,               DXGI_FORMAT_R8G8_UNORM,           DXGI_FORMAT_R8G8_UNORM,          DXGI_FORMAT_R8G8_UNORM,          DXGI_FORMAT_UNKNOWN);
7419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG8_SNORM,         DXGI_FORMAT_R8G8_SNORM,           DXGI_FORMAT_R8G8_SNORM,          DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
7429aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB8,              DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7439aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB8_SNORM,        DXGI_FORMAT_R8G8B8A8_SNORM,       DXGI_FORMAT_R8G8B8A8_SNORM,      DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
7449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB565,            DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7459aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA4,             DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7469aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB5_A1,           DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7479aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA8,             DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7489aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA8_SNORM,       DXGI_FORMAT_R8G8B8A8_SNORM,       DXGI_FORMAT_R8G8B8A8_SNORM,      DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
7499aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB10_A2,          DXGI_FORMAT_R10G10B10A2_UNORM,    DXGI_FORMAT_R10G10B10A2_UNORM,   DXGI_FORMAT_R10G10B10A2_UNORM,   DXGI_FORMAT_UNKNOWN);
7509aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB10_A2UI,        DXGI_FORMAT_R10G10B10A2_UINT,     DXGI_FORMAT_R10G10B10A2_UINT,    DXGI_FORMAT_R10G10B10A2_UINT,    DXGI_FORMAT_UNKNOWN);
7519aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_SRGB8,             DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,  DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
7529aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_SRGB8_ALPHA8,      DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,  DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN);
7539aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R16F,              DXGI_FORMAT_R16_FLOAT,            DXGI_FORMAT_R16_FLOAT,           DXGI_FORMAT_R16_FLOAT,           DXGI_FORMAT_UNKNOWN);
7549aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG16F,             DXGI_FORMAT_R16G16_FLOAT,         DXGI_FORMAT_R16G16_FLOAT,        DXGI_FORMAT_R16G16_FLOAT,        DXGI_FORMAT_UNKNOWN);
7559aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB16F,            DXGI_FORMAT_R16G16B16A16_FLOAT,   DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_UNKNOWN);
7569aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA16F,           DXGI_FORMAT_R16G16B16A16_FLOAT,   DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_R16G16B16A16_FLOAT,  DXGI_FORMAT_UNKNOWN);
7579aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R32F,              DXGI_FORMAT_R32_FLOAT,            DXGI_FORMAT_R32_FLOAT,           DXGI_FORMAT_R32_FLOAT,           DXGI_FORMAT_UNKNOWN);
7589aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG32F,             DXGI_FORMAT_R32G32_FLOAT,         DXGI_FORMAT_R32G32_FLOAT,        DXGI_FORMAT_R32G32_FLOAT,        DXGI_FORMAT_UNKNOWN);
7599aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB32F,            DXGI_FORMAT_R32G32B32A32_FLOAT,   DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_UNKNOWN);
7609aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA32F,           DXGI_FORMAT_R32G32B32A32_FLOAT,   DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_R32G32B32A32_FLOAT,  DXGI_FORMAT_UNKNOWN);
7619aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R11F_G11F_B10F,    DXGI_FORMAT_R11G11B10_FLOAT,      DXGI_FORMAT_R11G11B10_FLOAT,     DXGI_FORMAT_R11G11B10_FLOAT,     DXGI_FORMAT_UNKNOWN);
7629aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB9_E5,           DXGI_FORMAT_R9G9B9E5_SHAREDEXP,   DXGI_FORMAT_R9G9B9E5_SHAREDEXP,  DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_UNKNOWN);
7639aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R8I,               DXGI_FORMAT_R8_SINT,              DXGI_FORMAT_R8_SINT,             DXGI_FORMAT_R8_SINT,             DXGI_FORMAT_UNKNOWN);
7649aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R8UI,              DXGI_FORMAT_R8_UINT,              DXGI_FORMAT_R8_UINT,             DXGI_FORMAT_R8_UINT,             DXGI_FORMAT_UNKNOWN);
7659aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R16I,              DXGI_FORMAT_R16_SINT,             DXGI_FORMAT_R16_SINT,            DXGI_FORMAT_R16_SINT,            DXGI_FORMAT_UNKNOWN);
7669aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R16UI,             DXGI_FORMAT_R16_UINT,             DXGI_FORMAT_R16_UINT,            DXGI_FORMAT_R16_UINT,            DXGI_FORMAT_UNKNOWN);
7679aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R32I,              DXGI_FORMAT_R32_SINT,             DXGI_FORMAT_R32_SINT,            DXGI_FORMAT_R32_SINT,            DXGI_FORMAT_UNKNOWN);
7689aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_R32UI,             DXGI_FORMAT_R32_UINT,             DXGI_FORMAT_R32_UINT,            DXGI_FORMAT_R32_UINT,            DXGI_FORMAT_UNKNOWN);
7699aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG8I,              DXGI_FORMAT_R8G8_SINT,            DXGI_FORMAT_R8G8_SINT,           DXGI_FORMAT_R8G8_SINT,           DXGI_FORMAT_UNKNOWN);
7709aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG8UI,             DXGI_FORMAT_R8G8_UINT,            DXGI_FORMAT_R8G8_UINT,           DXGI_FORMAT_R8G8_UINT,           DXGI_FORMAT_UNKNOWN);
7719aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG16I,             DXGI_FORMAT_R16G16_SINT,          DXGI_FORMAT_R16G16_SINT,         DXGI_FORMAT_R16G16_SINT,         DXGI_FORMAT_UNKNOWN);
7729aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG16UI,            DXGI_FORMAT_R16G16_UINT,          DXGI_FORMAT_R16G16_UINT,         DXGI_FORMAT_R16G16_UINT,         DXGI_FORMAT_UNKNOWN);
7739aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG32I,             DXGI_FORMAT_R32G32_SINT,          DXGI_FORMAT_R32G32_SINT,         DXGI_FORMAT_R32G32_SINT,         DXGI_FORMAT_UNKNOWN);
7749aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RG32UI,            DXGI_FORMAT_R32G32_UINT,          DXGI_FORMAT_R32G32_UINT,         DXGI_FORMAT_R32G32_UINT,         DXGI_FORMAT_UNKNOWN);
7759aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB8I,             DXGI_FORMAT_R8G8B8A8_SINT,        DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_UNKNOWN);
7769aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB8UI,            DXGI_FORMAT_R8G8B8A8_UINT,        DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_UNKNOWN);
7779aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB16I,            DXGI_FORMAT_R16G16B16A16_SINT,    DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_UNKNOWN);
7789aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB16UI,           DXGI_FORMAT_R16G16B16A16_UINT,    DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_UNKNOWN);
7799aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB32I,            DXGI_FORMAT_R32G32B32A32_SINT,    DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_UNKNOWN);
7809aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB32UI,           DXGI_FORMAT_R32G32B32A32_UINT,    DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_UNKNOWN);
7819aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA8I,            DXGI_FORMAT_R8G8B8A8_SINT,        DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_R8G8B8A8_SINT,       DXGI_FORMAT_UNKNOWN);
7829aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA8UI,           DXGI_FORMAT_R8G8B8A8_UINT,        DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_R8G8B8A8_UINT,       DXGI_FORMAT_UNKNOWN);
7839aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA16I,           DXGI_FORMAT_R16G16B16A16_SINT,    DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_R16G16B16A16_SINT,   DXGI_FORMAT_UNKNOWN);
7849aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA16UI,          DXGI_FORMAT_R16G16B16A16_UINT,    DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_R16G16B16A16_UINT,   DXGI_FORMAT_UNKNOWN);
7859aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA32I,           DXGI_FORMAT_R32G32B32A32_SINT,    DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_R32G32B32A32_SINT,   DXGI_FORMAT_UNKNOWN);
7869aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA32UI,          DXGI_FORMAT_R32G32B32A32_UINT,    DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_R32G32B32A32_UINT,   DXGI_FORMAT_UNKNOWN);
787b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
7889aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Unsized formats, TODO: Are types of float and half float allowed for the unsized types? Would it change the DXGI format?
7899aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_ALPHA,             DXGI_FORMAT_A8_UNORM,             DXGI_FORMAT_A8_UNORM,            DXGI_FORMAT_A8_UNORM,            DXGI_FORMAT_UNKNOWN);
7909aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE,         DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7919aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE_ALPHA,   DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7929aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGB,               DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7939aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_RGBA,              DXGI_FORMAT_R8G8B8A8_UNORM,       DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_R8G8B8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
7949aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_BGRA_EXT,          DXGI_FORMAT_B8G8R8A8_UNORM,       DXGI_FORMAT_B8G8R8A8_UNORM,      DXGI_FORMAT_B8G8R8A8_UNORM,      DXGI_FORMAT_UNKNOWN);
795b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
7969aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_EXT_texture_storage
7979aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    //                           | GL internal format     | D3D11 texture format          | D3D11 SRV format                    | D3D11 RTV format              | D3D11 DSV format               |
7989aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_ALPHA8_EXT,             DXGI_FORMAT_A8_UNORM,           DXGI_FORMAT_A8_UNORM,                 DXGI_FORMAT_A8_UNORM,           DXGI_FORMAT_UNKNOWN           );
7999aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE8_EXT,         DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM,           DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
8009aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_ALPHA32F_EXT,           DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN           );
8019aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE32F_EXT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN           );
8029aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_ALPHA16F_EXT,           DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN           );
8039aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE16F_EXT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN           );
8049aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE8_ALPHA8_EXT,  DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_R8G8B8A8_UNORM,           DXGI_FORMAT_R8G8B8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
8059aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE_ALPHA32F_EXT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT,       DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN           );
8069aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_LUMINANCE_ALPHA16F_EXT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT,       DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN           );
8079aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_BGRA8_EXT,              DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_B8G8R8A8_UNORM,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
8089aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_BGRA4_ANGLEX,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_B8G8R8A8_UNORM,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
8099aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_BGR5_A1_ANGLEX,         DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_B8G8R8A8_UNORM,           DXGI_FORMAT_B8G8R8A8_UNORM,     DXGI_FORMAT_UNKNOWN           );
810b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
8119aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Depth stencil formats
8129aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_DEPTH_COMPONENT16,     DXGI_FORMAT_R16_TYPELESS,        DXGI_FORMAT_R16_UNORM,                DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D16_UNORM         );
8139aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_DEPTH_COMPONENT24,     DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D24_UNORM_S8_UINT );
8149aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_DEPTH_COMPONENT32F,    DXGI_FORMAT_R32_TYPELESS,        DXGI_FORMAT_R32_FLOAT,                DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D32_FLOAT         );
8159aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_DEPTH24_STENCIL8,      DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D24_UNORM_S8_UINT );
8169aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_DEPTH32F_STENCIL8,     DXGI_FORMAT_R32G8X24_TYPELESS,   DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D32_FLOAT_S8X24_UINT);
8179aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_STENCIL_INDEX8,        DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_X24_TYPELESS_G8_UINT,     DXGI_FORMAT_UNKNOWN,            DXGI_FORMAT_D24_UNORM_S8_UINT );
818b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
8199aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_ANGLE_depth_texture
8209aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Since D3D11 doesn't have a D32_UNORM format, use D24S8 which has comparable precision and matches the ES3 format.
8219aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_DEPTH_COMPONENT32_OES, DXGI_FORMAT_R24G8_TYPELESS,      DXGI_FORMAT_R24_UNORM_X8_TYPELESS,    DXGI_FORMAT_UNKNOWN,             DXGI_FORMAT_D24_UNORM_S8_UINT);
822dd4674f2beea11fa31dc41e147c8476cdbbe0910Shannon Woods
8239aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // Compressed formats, From ES 3.0.1 spec, table 3.16
8249aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    //                           | GL internal format                        | D3D11 texture format | D3D11 SRV format     | D3D11 RTV format   | D3D11 DSV format  |
8259aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_R11_EAC,                        DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8269aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_SIGNED_R11_EAC,                 DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8279aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RG11_EAC,                       DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8289aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_SIGNED_RG11_EAC,                DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8299aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RGB8_ETC2,                      DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8309aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_SRGB8_ETC2,                     DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8319aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,  DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8329aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8339aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RGBA8_ETC2_EAC,                 DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8349aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,          DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN,   DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
835dd4674f2beea11fa31dc41e147c8476cdbbe0910Shannon Woods
8369aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_EXT_texture_compression_dxt1
8379aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT,              DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
8389aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,             DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
83900f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
8409aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_ANGLE_texture_compression_dxt3
8419aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE,           DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
84200f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
8439aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    // From GL_ANGLE_texture_compression_dxt5
8449aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    InsertD3D11FormatInfo(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE,           DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN);
84500f6bc32b5bd0e988cd58a3df1914791972e7acbGeoff Lang
8469aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    return map;
8470c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang}
8480c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang
8499aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langconst TextureFormat &GetTextureFormatInfo(GLenum internalFormat)
8500c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang{
8519aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    static const D3D11ES3FormatMap formatMap = BuildD3D11FormatMap();
8529aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    D3D11ES3FormatMap::const_iterator iter = formatMap.find(internalFormat);
8539aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    if (iter != formatMap.end())
8540c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang    {
8550c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang        return iter->second;
8560c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang    }
8570c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang    else
8580c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang    {
8599aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        static const TextureFormat defaultInfo;
8609aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        return defaultInfo;
8610c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang    }
8620c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang}
8630c99b1b0a42afd3b5fb578468895b166acd5bb6eGeoff Lang
8649aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::map<gl::VertexFormat, VertexFormat> D3D11VertexFormatInfoMap;
8659aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langtypedef std::pair<gl::VertexFormat, VertexFormat> D3D11VertexFormatPair;
8667ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
8679aa00bbc5303cf7817d02d04860b044b3d29804dGeoff LangVertexFormat::VertexFormat()
8689aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    : conversionType(VERTEX_CONVERT_NONE),
8699aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      nativeFormat(DXGI_FORMAT_UNKNOWN),
8709aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang      copyFunction(NULL)
8719aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang{
8729aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang}
8737ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
8749aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic void AddVertexFormatInfo(D3D11VertexFormatInfoMap *map, GLenum inputType, GLboolean normalized, GLuint componentCount,
8757ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill                                VertexConversionType conversionType, DXGI_FORMAT nativeFormat, VertexCopyFunction copyFunction)
8767ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill{
8777ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    gl::VertexFormat inputFormat(inputType, normalized, componentCount, false);
8789aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
8799aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    VertexFormat info;
8809aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.conversionType = conversionType;
8819aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.nativeFormat = nativeFormat;
8829aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.copyFunction = copyFunction;
8839aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
8849aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    map->insert(D3D11VertexFormatPair(inputFormat, info));
8857ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill}
8867ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
8879aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langstatic void AddIntegerVertexFormatInfo(D3D11VertexFormatInfoMap *map, GLenum inputType, GLuint componentCount,
8887ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill                                       VertexConversionType conversionType, DXGI_FORMAT nativeFormat, VertexCopyFunction copyFunction)
8897ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill{
8907ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    gl::VertexFormat inputFormat(inputType, GL_FALSE, componentCount, true);
8919aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
8929aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    VertexFormat info;
8939aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.conversionType = conversionType;
8949aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.nativeFormat = nativeFormat;
8959aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    info.copyFunction = copyFunction;
8969aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang
8979aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang    map->insert(D3D11VertexFormatPair(inputFormat, info));
8987ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill}
8997ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9007ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madillstatic D3D11VertexFormatInfoMap BuildD3D11VertexFormatInfoMap()
9017ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill{
9027ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    D3D11VertexFormatInfoMap map;
9037ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9047ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // TODO: column legend
9057ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9067ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    //
9077ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // Float formats
9087ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    //
9097ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9107ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_BYTE -- un-normalized
91145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8_SINT,            &CopyNativeVertexData<GLbyte, 1, 0>);
91245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8_SINT,          &CopyNativeVertexData<GLbyte, 2, 0>);
91345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_SINT,      &CopyNativeVertexData<GLbyte, 3, 1>);
91445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8B8A8_SINT,      &CopyNativeVertexData<GLbyte, 4, 0>);
9157ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9167ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_BYTE -- normalized
91745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_SNORM,           &CopyNativeVertexData<GLbyte, 1, 0>);
91845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_SNORM,         &CopyNativeVertexData<GLbyte, 2, 0>);
91945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R8G8B8A8_SNORM,     &CopyNativeVertexData<GLbyte, 3, INT8_MAX>);
92045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_BYTE,           GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_SNORM,     &CopyNativeVertexData<GLbyte, 4, 0>);
9217ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9227ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_BYTE -- un-normalized
92345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8_UINT,            &CopyNativeVertexData<GLubyte, 1, 0>);
92445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8_UINT,          &CopyNativeVertexData<GLubyte, 2, 0>);
92545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R8G8B8A8_UINT,      &CopyNativeVertexData<GLubyte, 3, 1>);
92645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R8G8B8A8_UINT,      &CopyNativeVertexData<GLubyte, 4, 0>);
9277ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9287ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_BYTE -- normalized
92945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8_UNORM,           &CopyNativeVertexData<GLubyte, 1, 0>);
93045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8_UNORM,         &CopyNativeVertexData<GLubyte, 2, 0>);
93145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R8G8B8A8_UNORM,     &CopyNativeVertexData<GLubyte, 3, UINT8_MAX>);
93245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R8G8B8A8_UNORM,     &CopyNativeVertexData<GLubyte, 4, 0>);
9337ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9347ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_SHORT -- un-normalized
93545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16_SINT,           &CopyNativeVertexData<GLshort, 1, 0>);
93645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16_SINT,        &CopyNativeVertexData<GLshort, 2, 0>);
93745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_SINT,  &CopyNativeVertexData<GLshort, 4, 1>);
93845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16B16A16_SINT,  &CopyNativeVertexData<GLshort, 4, 0>);
9397ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9407ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_SHORT -- normalized
94145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_SNORM,          &CopyNativeVertexData<GLshort, 1, 0>);
94245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_SNORM,       &CopyNativeVertexData<GLshort, 2, 0>);
94345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R16G16B16A16_SNORM, &CopyNativeVertexData<GLshort, 3, INT16_MAX>);
94445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_SHORT,          GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_SNORM, &CopyNativeVertexData<GLshort, 4, 0>);
9457ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9467ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_SHORT -- un-normalized
94745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16_UINT,           &CopyNativeVertexData<GLushort, 1, 0>);
94845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16_UINT,        &CopyNativeVertexData<GLushort, 2, 0>);
94945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 3, VERTEX_CONVERT_BOTH, DXGI_FORMAT_R16G16B16A16_UINT,  &CopyNativeVertexData<GLushort, 3, 1>);
95045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R16G16B16A16_UINT,  &CopyNativeVertexData<GLushort, 4, 0>);
9517ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9527ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_SHORT -- normalized
95345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_UNORM,          &CopyNativeVertexData<GLushort, 1, 0>);
95445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_UNORM,       &CopyNativeVertexData<GLushort, 2, 0>);
95545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R16G16B16A16_UNORM, &CopyNativeVertexData<GLushort, 3, UINT16_MAX>);
95645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_SHORT, GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_UNORM, &CopyNativeVertexData<GLushort, 4, 0>);
9577ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9587ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_INT -- un-normalized
95945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32_SINT,           &CopyNativeVertexData<GLint, 1, 0>);
96045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32_SINT,        &CopyNativeVertexData<GLint, 2, 0>);
96145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_FALSE, 3, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32_SINT,     &CopyNativeVertexData<GLint, 3, 0>);
96245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32A32_SINT,  &CopyNativeVertexData<GLint, 4, 0>);
9637ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9647ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_INT -- normalized
96545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_TRUE,  1, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32_FLOAT,          &CopyTo32FVertexData<GLint, 1, true>);
96645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_TRUE,  2, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32_FLOAT,       &CopyTo32FVertexData<GLint, 2, true>);
96745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32_FLOAT,    &CopyTo32FVertexData<GLint, 3, true>);
96845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT,            GL_TRUE,  4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &CopyTo32FVertexData<GLint, 4, true>);
9697ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9707ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_INT -- un-normalized
97145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_FALSE, 1, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32_UINT,           &CopyNativeVertexData<GLuint, 1, 0>);
97245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_FALSE, 2, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32_UINT,        &CopyNativeVertexData<GLuint, 2, 0>);
97345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_FALSE, 3, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32_UINT,     &CopyNativeVertexData<GLuint, 3, 0>);
97445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_FALSE, 4, VERTEX_CONVERT_GPU,  DXGI_FORMAT_R32G32B32A32_UINT,  &CopyNativeVertexData<GLuint, 4, 0>);
9757ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9767ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_INT -- normalized
97745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_TRUE,  1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT,          &CopyTo32FVertexData<GLuint, 1, true>);
97845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_TRUE,  2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT,       &CopyTo32FVertexData<GLuint, 2, true>);
97945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_TRUE,  3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32_FLOAT,    &CopyTo32FVertexData<GLuint, 3, true>);
98045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT,   GL_TRUE,  4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, &CopyTo32FVertexData<GLuint, 4, true>);
9817ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9827ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_FIXED
98345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FIXED,          GL_FALSE, 1, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32_FLOAT,          &Copy32FixedTo32FVertexData<1>);
98445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FIXED,          GL_FALSE, 2, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32_FLOAT,       &Copy32FixedTo32FVertexData<2>);
98545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FIXED,          GL_FALSE, 3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32_FLOAT,    &Copy32FixedTo32FVertexData<3>);
98645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FIXED,          GL_FALSE, 4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &Copy32FixedTo32FVertexData<4>);
9877ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9887ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_HALF_FLOAT
98945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_HALF_FLOAT,     GL_FALSE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16_FLOAT,          &CopyNativeVertexData<GLhalf, 1, 0>);
99045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_HALF_FLOAT,     GL_FALSE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16_FLOAT,       &CopyNativeVertexData<GLhalf, 2, 0>);
99145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_HALF_FLOAT,     GL_FALSE, 3, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R16G16B16A16_FLOAT, &CopyNativeVertexData<GLhalf, 3, gl::Float16One>);
99245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_HALF_FLOAT,     GL_FALSE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R16G16B16A16_FLOAT, &CopyNativeVertexData<GLhalf, 4, 0>);
9937ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
9947ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_FLOAT
99545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FLOAT,          GL_FALSE, 1, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32_FLOAT,          &CopyNativeVertexData<GLfloat, 1, 0>);
99645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FLOAT,          GL_FALSE, 2, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32_FLOAT,       &CopyNativeVertexData<GLfloat, 2, 0>);
99745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FLOAT,          GL_FALSE, 3, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32_FLOAT,    &CopyNativeVertexData<GLfloat, 3, 0>);
99845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_FLOAT,          GL_FALSE, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R32G32B32A32_FLOAT, &CopyNativeVertexData<GLfloat, 4, 0>);
9997ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10007ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_INT_2_10_10_10_REV
100145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT_2_10_10_10_REV,          GL_FALSE,  4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &CopyXYZ10W2ToXYZW32FVertexData<true, false, true>);
100245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_INT_2_10_10_10_REV,          GL_TRUE,   4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &CopyXYZ10W2ToXYZW32FVertexData<true, true,  true>);
10037ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10047ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_INT_2_10_10_10_REV
100545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE,  4, VERTEX_CONVERT_CPU,  DXGI_FORMAT_R32G32B32A32_FLOAT, &CopyXYZ10W2ToXYZW32FVertexData<false, false, true>);
100645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddVertexFormatInfo(&map, GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE,   4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UNORM,  &CopyNativeVertexData<GLuint, 1, 0>);
10077ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10087ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    //
10097ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // Integer Formats
10107ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    //
10117ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10127ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_BYTE
101345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_BYTE,           1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8_SINT,           &CopyNativeVertexData<GLbyte, 1, 0>);
101445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_BYTE,           2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8_SINT,         &CopyNativeVertexData<GLbyte, 2, 0>);
101545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_BYTE,           3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R8G8B8A8_SINT,     &CopyNativeVertexData<GLbyte, 3, 1>);
101645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_BYTE,           4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8B8A8_SINT,     &CopyNativeVertexData<GLbyte, 4, 0>);
10177ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10187ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_BYTE
101945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8_UINT,           &CopyNativeVertexData<GLubyte, 1, 0>);
102045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8_UINT,         &CopyNativeVertexData<GLubyte, 2, 0>);
102145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R8G8B8A8_UINT,     &CopyNativeVertexData<GLubyte, 3, 1>);
102245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_BYTE,  4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R8G8B8A8_UINT,     &CopyNativeVertexData<GLubyte, 4, 0>);
10237ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10247ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_SHORT
102545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_SHORT,          1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16_SINT,          &CopyNativeVertexData<GLshort, 1, 0>);
102645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_SHORT,          2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16_SINT,       &CopyNativeVertexData<GLshort, 2, 0>);
102745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_SHORT,          3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R16G16B16A16_SINT, &CopyNativeVertexData<GLshort, 3, 1>);
102845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_SHORT,          4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16B16A16_SINT, &CopyNativeVertexData<GLshort, 4, 0>);
10297ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10307ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_SHORT
103145965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16_UINT,          &CopyNativeVertexData<GLushort, 1, 0>);
103245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16_UINT,       &CopyNativeVertexData<GLushort, 2, 0>);
103345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 3, VERTEX_CONVERT_CPU,   DXGI_FORMAT_R16G16B16A16_UINT, &CopyNativeVertexData<GLushort, 3, 1>);
103445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_SHORT, 4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R16G16B16A16_UINT, &CopyNativeVertexData<GLushort, 4, 0>);
10357ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10367ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_INT
103745965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_INT,            1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32_SINT,          &CopyNativeVertexData<GLint, 1, 0>);
103845965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_INT,            2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32_SINT,       &CopyNativeVertexData<GLint, 2, 0>);
103945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_INT,            3, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32_SINT,    &CopyNativeVertexData<GLint, 3, 0>);
104045965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_INT,            4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32A32_SINT, &CopyNativeVertexData<GLint, 4, 0>);
10417ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10427ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_INT
104345965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT,   1, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32_SINT,          &CopyNativeVertexData<GLuint, 1, 0>);
104445965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT,   2, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32_SINT,       &CopyNativeVertexData<GLuint, 2, 0>);
104545965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT,   3, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32_SINT,    &CopyNativeVertexData<GLuint, 3, 0>);
104645965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT,   4, VERTEX_CONVERT_NONE,  DXGI_FORMAT_R32G32B32A32_SINT, &CopyNativeVertexData<GLuint, 4, 0>);
10477ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10487ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_INT_2_10_10_10_REV
104945965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_INT_2_10_10_10_REV, 4, VERTEX_CONVERT_CPU, DXGI_FORMAT_R16G16B16A16_SINT, &CopyXYZ10W2ToXYZW32FVertexData<true, true, false>);
10507ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10517ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    // GL_UNSIGNED_INT_2_10_10_10_REV
105245965b102fbff399c3e39aeeabf55f146c75caabGeoff Lang    AddIntegerVertexFormatInfo(&map, GL_UNSIGNED_INT_2_10_10_10_REV, 4, VERTEX_CONVERT_NONE, DXGI_FORMAT_R10G10B10A2_UINT, &CopyNativeVertexData<GLuint, 1, 0>);
10537ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10547ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    return map;
10557ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill}
10567ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10579aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Langconst VertexFormat &GetVertexFormatInfo(const gl::VertexFormat &vertexFormat)
10587ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill{
10597ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    static const D3D11VertexFormatInfoMap vertexFormatMap = BuildD3D11VertexFormatInfoMap();
10607ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill
10617ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    D3D11VertexFormatInfoMap::const_iterator iter = vertexFormatMap.find(vertexFormat);
10627ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    if (iter != vertexFormatMap.end())
10637ab02fafb5de8cabadaa5eff10e473e79f9b027eJamie Madill    {
1064e4a492be45f39dffaea53c3523064844ee56e41bGeoff Lang        return iter->second;
1065b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    }
106666aaf723bc8535bf1a8e32c032928d9f4d895d33Geoff Lang    else
1067b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    {
10689aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        static const VertexFormat defaultInfo;
10699aa00bbc5303cf7817d02d04860b044b3d29804dGeoff Lang        return defaultInfo;
1070b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org    }
1071b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
1072b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1073b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
1074b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org
1075b8490f3c368bd2407980ed7df7810b3d84b20b68shannonwoods@chromium.org}
1076