blob: 77888da7412e674b57484763832d9b6a3c4ca110 [file] [log] [blame]
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001#include "precompiled.h"
2//
3// Copyright (c) 2013 The ANGLE Project Authors. All rights reserved.
4// Use of this source code is governed by a BSD-style license that can be
5// found in the LICENSE file.
6//
7
8// formatutils11.cpp: Queries for GL image formats and their translations to D3D11
9// formats.
10
11#include "libGLESv2/renderer/formatutils11.h"
12#include "libGLESv2/renderer/generatemip.h"
13#include "libGLESv2/renderer/loadimage.h"
14
15namespace rx
16{
17
18struct D3D11ES3FormatInfo
19{
20 DXGI_FORMAT mTexFormat;
21 DXGI_FORMAT mSRVFormat;
22 DXGI_FORMAT mRTVFormat;
23 DXGI_FORMAT mDSVFormat;
24
25 D3D11ES3FormatInfo()
26 : mTexFormat(DXGI_FORMAT_UNKNOWN), mDSVFormat(DXGI_FORMAT_UNKNOWN), mRTVFormat(DXGI_FORMAT_UNKNOWN), mSRVFormat(DXGI_FORMAT_UNKNOWN)
27 { }
28
29 D3D11ES3FormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat)
30 : mTexFormat(texFormat), mDSVFormat(dsvFormat), mRTVFormat(rtvFormat), mSRVFormat(srvFormat)
31 { }
32};
33
34// For sized GL internal formats, there is only one corresponding D3D11 format. This map type allows
35// querying for the DXGI texture formats to use for textures, SRVs, RTVs and DSVs given a GL internal
36// format.
37typedef std::pair<GLint, D3D11ES3FormatInfo> D3D11ES3FormatPair;
38typedef std::map<GLint, D3D11ES3FormatInfo> D3D11ES3FormatMap;
39
Geoff Lang18591b72013-06-07 12:00:15 -040040static D3D11ES3FormatMap BuildD3D11ES3FormatMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000041{
42 D3D11ES3FormatMap map;
43
44 // | GL internal format | | D3D11 texture format | D3D11 SRV format | D3D11 RTV format | D3D11 DSV format |
45 map.insert(D3D11ES3FormatPair(GL_NONE, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +000046 map.insert(D3D11ES3FormatPair(GL_R8, D3D11ES3FormatInfo(DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_R8_UNORM, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +000047 map.insert(D3D11ES3FormatPair(GL_R8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8_SNORM, DXGI_FORMAT_R8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +000048 map.insert(D3D11ES3FormatPair(GL_RG8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_R8G8_UNORM, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +000049 map.insert(D3D11ES3FormatPair(GL_RG8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_R8G8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000050 map.insert(D3D11ES3FormatPair(GL_RGB8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +000051 map.insert(D3D11ES3FormatPair(GL_RGB8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000052 map.insert(D3D11ES3FormatPair(GL_RGB565, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
53 map.insert(D3D11ES3FormatPair(GL_RGBA4, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
54 map.insert(D3D11ES3FormatPair(GL_RGB5_A1, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
55 map.insert(D3D11ES3FormatPair(GL_RGBA8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +000056 map.insert(D3D11ES3FormatPair(GL_RGBA8_SNORM, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_R8G8B8A8_SNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.org5d4468e2013-05-30 00:13:56 +000057 map.insert(D3D11ES3FormatPair(GL_RGB10_A2, D3D11ES3FormatInfo(DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_R10G10B10A2_UNORM, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +000058 map.insert(D3D11ES3FormatPair(GL_RGB10_A2UI, D3D11ES3FormatInfo(DXGI_FORMAT_R10G10B10A2_UINT, DXGI_FORMAT_R10G10B10A2_UINT, DXGI_FORMAT_R10G10B10A2_UINT, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.org96c62912013-05-30 00:17:00 +000059 map.insert(D3D11ES3FormatPair(GL_SRGB8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000060 map.insert(D3D11ES3FormatPair(GL_SRGB8_ALPHA8, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +000061 map.insert(D3D11ES3FormatPair(GL_R16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_R16_FLOAT, DXGI_FORMAT_UNKNOWN)));
62 map.insert(D3D11ES3FormatPair(GL_RG16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_R16G16_FLOAT, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000063 map.insert(D3D11ES3FormatPair(GL_RGB16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN)));
64 map.insert(D3D11ES3FormatPair(GL_RGBA16F, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +000065 map.insert(D3D11ES3FormatPair(GL_R32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN)));
66 map.insert(D3D11ES3FormatPair(GL_RG32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_R32G32_FLOAT, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000067 map.insert(D3D11ES3FormatPair(GL_RGB32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_UNKNOWN)));
68 map.insert(D3D11ES3FormatPair(GL_RGBA32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orga43d8292013-05-30 00:15:50 +000069 map.insert(D3D11ES3FormatPair(GL_R11F_G11F_B10F, D3D11ES3FormatInfo(DXGI_FORMAT_R11G11B10_FLOAT, DXGI_FORMAT_R11G11B10_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.org92b9cd52013-05-30 00:14:48 +000070 map.insert(D3D11ES3FormatPair(GL_RGB9_E5, D3D11ES3FormatInfo(DXGI_FORMAT_R9G9B9E5_SHAREDEXP, DXGI_FORMAT_R9G9B9E5_SHAREDEXP, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +000071 map.insert(D3D11ES3FormatPair(GL_R8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8_SINT, DXGI_FORMAT_R8_SINT, DXGI_FORMAT_R8_SINT, DXGI_FORMAT_UNKNOWN)));
72 map.insert(D3D11ES3FormatPair(GL_R8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8_UINT, DXGI_FORMAT_R8_UINT, DXGI_FORMAT_R8_UINT, DXGI_FORMAT_UNKNOWN)));
73 map.insert(D3D11ES3FormatPair(GL_R16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16_SINT, DXGI_FORMAT_R16_SINT, DXGI_FORMAT_R16_SINT, DXGI_FORMAT_UNKNOWN)));
74 map.insert(D3D11ES3FormatPair(GL_R16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_R16_UINT, DXGI_FORMAT_UNKNOWN)));
75 map.insert(D3D11ES3FormatPair(GL_R32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32_SINT, DXGI_FORMAT_R32_SINT, DXGI_FORMAT_R32_SINT, DXGI_FORMAT_UNKNOWN)));
76 map.insert(D3D11ES3FormatPair(GL_R32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R32_UINT, DXGI_FORMAT_R32_UINT, DXGI_FORMAT_UNKNOWN)));
77 map.insert(D3D11ES3FormatPair(GL_RG8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_R8G8_SINT, DXGI_FORMAT_UNKNOWN)));
78 map.insert(D3D11ES3FormatPair(GL_RG8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_R8G8_UINT, DXGI_FORMAT_UNKNOWN)));
79 map.insert(D3D11ES3FormatPair(GL_RG16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_R16G16_SINT, DXGI_FORMAT_UNKNOWN)));
80 map.insert(D3D11ES3FormatPair(GL_RG16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_R16G16_UINT, DXGI_FORMAT_UNKNOWN)));
81 map.insert(D3D11ES3FormatPair(GL_RG32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_R32G32_SINT, DXGI_FORMAT_UNKNOWN)));
82 map.insert(D3D11ES3FormatPair(GL_RG32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_R32G32_UINT, DXGI_FORMAT_UNKNOWN)));
83 map.insert(D3D11ES3FormatPair(GL_RGB8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_UNKNOWN)));
84 map.insert(D3D11ES3FormatPair(GL_RGB8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_UNKNOWN)));
85 map.insert(D3D11ES3FormatPair(GL_RGB16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_UNKNOWN)));
86 map.insert(D3D11ES3FormatPair(GL_RGB16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_UNKNOWN)));
87 map.insert(D3D11ES3FormatPair(GL_RGB32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32_SINT, DXGI_FORMAT_R32G32B32_SINT, DXGI_FORMAT_R32G32B32_SINT, DXGI_FORMAT_UNKNOWN)));
88 map.insert(D3D11ES3FormatPair(GL_RGB32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32_UINT, DXGI_FORMAT_R32G32B32_UINT, DXGI_FORMAT_R32G32B32_UINT, DXGI_FORMAT_UNKNOWN)));
89 map.insert(D3D11ES3FormatPair(GL_RGBA8I, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_R8G8B8A8_SINT, DXGI_FORMAT_UNKNOWN)));
90 map.insert(D3D11ES3FormatPair(GL_RGBA8UI, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_R8G8B8A8_UINT, DXGI_FORMAT_UNKNOWN)));
91 map.insert(D3D11ES3FormatPair(GL_RGBA16I, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_R16G16B16A16_SINT, DXGI_FORMAT_UNKNOWN)));
92 map.insert(D3D11ES3FormatPair(GL_RGBA16UI, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_R16G16B16A16_UINT, DXGI_FORMAT_UNKNOWN)));
93 map.insert(D3D11ES3FormatPair(GL_RGBA32I, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_R32G32B32A32_SINT, DXGI_FORMAT_UNKNOWN)));
94 map.insert(D3D11ES3FormatPair(GL_RGBA32UI, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_R32G32B32A32_UINT, DXGI_FORMAT_UNKNOWN)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000095
96 // Unsized formats, TODO: Are types of float and half float allowed for the unsized types? Would it change the DXGI format?
97 map.insert(D3D11ES3FormatPair(GL_ALPHA, D3D11ES3FormatInfo(DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
98 map.insert(D3D11ES3FormatPair(GL_LUMINANCE, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
99 map.insert(D3D11ES3FormatPair(GL_LUMINANCE_ALPHA, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
100 map.insert(D3D11ES3FormatPair(GL_RGB, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
101 map.insert(D3D11ES3FormatPair(GL_RGBA, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
102 map.insert(D3D11ES3FormatPair(GL_BGRA_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN)));
103
104 // From GL_EXT_texture_storage
105 // | GL internal format | | D3D11 texture format | D3D11 SRV format | D3D11 RTV format | D3D11 DSV format |
106 map.insert(D3D11ES3FormatPair(GL_ALPHA8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
107 map.insert(D3D11ES3FormatPair(GL_LUMINANCE8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
108 map.insert(D3D11ES3FormatPair(GL_ALPHA32F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
109 map.insert(D3D11ES3FormatPair(GL_LUMINANCE32F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
110 map.insert(D3D11ES3FormatPair(GL_ALPHA16F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
111 map.insert(D3D11ES3FormatPair(GL_LUMINANCE16F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
112 map.insert(D3D11ES3FormatPair(GL_LUMINANCE8_ALPHA8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
113 map.insert(D3D11ES3FormatPair(GL_LUMINANCE_ALPHA32F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
114 map.insert(D3D11ES3FormatPair(GL_LUMINANCE_ALPHA16F_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN )));
115 map.insert(D3D11ES3FormatPair(GL_BGRA8_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN )));
116 map.insert(D3D11ES3FormatPair(GL_BGRA4_ANGLEX, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN )));
117 map.insert(D3D11ES3FormatPair(GL_BGR5_A1_ANGLEX, D3D11ES3FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN )));
118
119 // Depth stencil formats
120 map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT16, D3D11ES3FormatInfo(DXGI_FORMAT_R16_TYPELESS, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D16_UNORM )));
121 map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT24, D3D11ES3FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT )));
122 map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT32F, D3D11ES3FormatInfo(DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D32_FLOAT )));
123 map.insert(D3D11ES3FormatPair(GL_DEPTH24_STENCIL8, D3D11ES3FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT )));
124 map.insert(D3D11ES3FormatPair(GL_DEPTH32F_STENCIL8, D3D11ES3FormatInfo(DXGI_FORMAT_R32G8X24_TYPELESS, DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D32_FLOAT_S8X24_UINT )));
125
126 // From GL_ANGLE_depth_texture
127 map.insert(D3D11ES3FormatPair(GL_DEPTH_COMPONENT32_OES, D3D11ES3FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT )));
128
129 // Compressed formats, From ES 3.0.1 spec, table 3.16
130 // | GL internal format | | D3D11 texture format | D3D11 SRV format | D3D11 RTV format | D3D11 DSV format |
131 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_R11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
132 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SIGNED_R11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
133 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RG11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
134 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SIGNED_RG11_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
135 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGB8_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
136 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SRGB8_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
137 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
138 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
139 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA8_ETC2_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
140 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, D3D11ES3FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
141
142 // From GL_EXT_texture_compression_dxt1
143 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
144 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, D3D11ES3FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
145
146 // From GL_ANGLE_texture_compression_dxt3
147 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, D3D11ES3FormatInfo(DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
148
149 // From GL_ANGLE_texture_compression_dxt5
150 map.insert(D3D11ES3FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, D3D11ES3FormatInfo(DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN)));
151
152 return map;
153}
154
Geoff Lang18591b72013-06-07 12:00:15 -0400155static bool GetD3D11ES3FormatInfo(GLint internalFormat, GLuint clientVersion, D3D11ES3FormatInfo *outFormatInfo)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000156{
Geoff Lang18591b72013-06-07 12:00:15 -0400157 static const D3D11ES3FormatMap formatMap = BuildD3D11ES3FormatMap();
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000158 D3D11ES3FormatMap::const_iterator iter = formatMap.find(internalFormat);
159 if (iter != formatMap.end())
160 {
161 if (outFormatInfo)
162 {
163 *outFormatInfo = iter->second;
164 }
165 return true;
166 }
167 else
168 {
169 return false;
170 }
171}
172
173// ES3 image loading functions vary based on the internal format and data type given,
174// this map type determines the loading function from the internal format and type supplied
shannonwoods@chromium.org5d4468e2013-05-30 00:13:56 +0000175// to glTex*Image*D and the destination DXGI_FORMAT. Source formats and types are taken from
176// Tables 3.2 and 3.3 of the ES 3 spec.
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000177typedef std::pair<GLint, GLenum> InternalFormatTypePair;
178typedef std::pair<InternalFormatTypePair, LoadImageFunction> D3D11LoadFunctionPair;
179typedef std::map<InternalFormatTypePair, LoadImageFunction> D3D11LoadFunctionMap;
180
181static void UnimplementedLoadFunction(int width, int height, int depth,
182 const void *input, unsigned int inputRowPitch, unsigned int inputDepthPitch,
183 void *output, unsigned int outputRowPitch, unsigned int outputDepthPitch)
184{
185 UNIMPLEMENTED();
186}
187
188// A helper function to insert data into the D3D11LoadFunctionMap with fewer characters.
189static inline void insertLoadFunction(D3D11LoadFunctionMap *map, GLint internalFormat, GLenum type,
190 LoadImageFunction loadFunc)
191{
192 map->insert(D3D11LoadFunctionPair(InternalFormatTypePair(internalFormat, type), loadFunc));
193}
194
195D3D11LoadFunctionMap buildD3D11LoadFunctionMap()
196{
197 D3D11LoadFunctionMap map;
198
199 // | Internal format | Type | Load function |
shannonwoods@chromium.org8d46e912013-05-30 00:14:32 +0000200 insertLoadFunction(&map, GL_RGBA8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000201 insertLoadFunction(&map, GL_RGB5_A1, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
202 insertLoadFunction(&map, GL_RGBA4, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
shannonwoods@chromium.org8d46e912013-05-30 00:14:32 +0000203 insertLoadFunction(&map, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> );
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +0000204 insertLoadFunction(&map, GL_RGBA8_SNORM, GL_BYTE, loadToNative<GLbyte, 4> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000205 insertLoadFunction(&map, GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, loadRGBA4444DataToRGBA );
shannonwoods@chromium.org8d46e912013-05-30 00:14:32 +0000206 insertLoadFunction(&map, GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV, loadToNative<GLuint, 1> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000207 insertLoadFunction(&map, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, loadRGBA5551DataToRGBA );
shannonwoods@chromium.org5d4468e2013-05-30 00:13:56 +0000208 insertLoadFunction(&map, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, loadRGBA2101010ToRGBA );
shannonwoods@chromium.org8d46e912013-05-30 00:14:32 +0000209 insertLoadFunction(&map, GL_RGBA16F, GL_HALF_FLOAT, loadToNative<GLhalf, 4> );
210 insertLoadFunction(&map, GL_RGBA32F, GL_FLOAT, loadToNative<GLfloat, 4> );
shannonwoods@chromium.orgde7e6a22013-05-30 00:16:46 +0000211 insertLoadFunction(&map, GL_RGBA16F, GL_FLOAT, loadFloatDataToHalfFloat<4> );
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +0000212 insertLoadFunction(&map, GL_RGBA8UI, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> );
213 insertLoadFunction(&map, GL_RGBA8I, GL_BYTE, loadToNative<GLbyte, 4> );
214 insertLoadFunction(&map, GL_RGBA16UI, GL_UNSIGNED_SHORT, loadToNative<GLushort, 4> );
215 insertLoadFunction(&map, GL_RGBA16I, GL_SHORT, loadToNative<GLshort, 4> );
216 insertLoadFunction(&map, GL_RGBA32UI, GL_UNSIGNED_INT, loadToNative<GLuint, 4> );
217 insertLoadFunction(&map, GL_RGBA32I, GL_INT, loadToNative<GLint, 4> );
218 insertLoadFunction(&map, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, loadToNative<GLuint, 1> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000219 insertLoadFunction(&map, GL_RGB8, GL_UNSIGNED_BYTE, loadRGBUByteDataToRGBA );
220 insertLoadFunction(&map, GL_RGB565, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
shannonwoods@chromium.org96c62912013-05-30 00:17:00 +0000221 insertLoadFunction(&map, GL_SRGB8, GL_UNSIGNED_BYTE, loadToNative3To4<GLubyte, 0xFF> );
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +0000222 insertLoadFunction(&map, GL_RGB8_SNORM, GL_BYTE, loadRGBSByteDataToRGBA );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000223 insertLoadFunction(&map, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, loadRGB565DataToRGBA );
shannonwoods@chromium.orga43d8292013-05-30 00:15:50 +0000224 insertLoadFunction(&map, GL_R11F_G11F_B10F, GL_UNSIGNED_INT_10F_11F_11F_REV, loadToNative<GLuint, 1> );
shannonwoods@chromium.org92b9cd52013-05-30 00:14:48 +0000225 insertLoadFunction(&map, GL_RGB9_E5, GL_UNSIGNED_INT_5_9_9_9_REV, loadToNative<GLuint, 1> );
shannonwoods@chromium.orgde7e6a22013-05-30 00:16:46 +0000226 insertLoadFunction(&map, GL_RGB16F, GL_HALF_FLOAT, loadToNative3To4<GLhalf, gl::Float16One>);
shannonwoods@chromium.orga43d8292013-05-30 00:15:50 +0000227 insertLoadFunction(&map, GL_R11F_G11F_B10F, GL_HALF_FLOAT, loadRGBHalfFloatDataTo111110Float );
shannonwoods@chromium.org92b9cd52013-05-30 00:14:48 +0000228 insertLoadFunction(&map, GL_RGB9_E5, GL_HALF_FLOAT, loadRGBHalfFloatDataTo999E5 );
shannonwoods@chromium.org8d46e912013-05-30 00:14:32 +0000229 insertLoadFunction(&map, GL_RGB32F, GL_FLOAT, loadToNative<GLfloat, 3> );
shannonwoods@chromium.orgde7e6a22013-05-30 00:16:46 +0000230 insertLoadFunction(&map, GL_RGB16F, GL_FLOAT, loadFloatRGBDataToHalfFloatRGBA );
shannonwoods@chromium.orga43d8292013-05-30 00:15:50 +0000231 insertLoadFunction(&map, GL_R11F_G11F_B10F, GL_FLOAT, loadRGBFloatDataTo111110Float );
shannonwoods@chromium.org92b9cd52013-05-30 00:14:48 +0000232 insertLoadFunction(&map, GL_RGB9_E5, GL_FLOAT, loadRGBFloatDataTo999E5 );
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +0000233 insertLoadFunction(&map, GL_RGB8UI, GL_UNSIGNED_BYTE, loadToNative3To4<GLubyte, 0x0> );
234 insertLoadFunction(&map, GL_RGB8I, GL_BYTE, loadToNative3To4<GLbyte, 0x0> );
235 insertLoadFunction(&map, GL_RGB16UI, GL_UNSIGNED_SHORT, loadToNative3To4<GLushort, 0x0> );
236 insertLoadFunction(&map, GL_RGB16I, GL_SHORT, loadToNative3To4<GLshort, 0x0> );
237 insertLoadFunction(&map, GL_RGB32UI, GL_UNSIGNED_INT, loadToNative<GLuint, 3> );
238 insertLoadFunction(&map, GL_RGB32I, GL_INT, loadToNative<GLint, 3> );
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +0000239 insertLoadFunction(&map, GL_RG8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 2> );
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +0000240 insertLoadFunction(&map, GL_RG8_SNORM, GL_BYTE, loadToNative<GLbyte, 2> );
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +0000241 insertLoadFunction(&map, GL_RG16F, GL_HALF_FLOAT, loadToNative<GLhalf, 2> );
242 insertLoadFunction(&map, GL_RG32F, GL_FLOAT, loadToNative<GLfloat, 2> );
243 insertLoadFunction(&map, GL_RG16F, GL_FLOAT, loadFloatDataToHalfFloat<2> );
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +0000244 insertLoadFunction(&map, GL_RG8UI, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 2> );
245 insertLoadFunction(&map, GL_RG8I, GL_BYTE, loadToNative<GLbyte, 2> );
246 insertLoadFunction(&map, GL_RG16UI, GL_UNSIGNED_SHORT, loadToNative<GLushort, 2> );
247 insertLoadFunction(&map, GL_RG16I, GL_SHORT, loadToNative<GLshort, 2> );
248 insertLoadFunction(&map, GL_RG32UI, GL_UNSIGNED_INT, loadToNative<GLuint, 2> );
249 insertLoadFunction(&map, GL_RG32I, GL_INT, loadToNative<GLint, 2> );
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +0000250 insertLoadFunction(&map, GL_R8, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 1> );
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +0000251 insertLoadFunction(&map, GL_R8_SNORM, GL_BYTE, loadToNative<GLbyte, 1> );
shannonwoods@chromium.orga32a2ba2013-05-30 00:14:40 +0000252 insertLoadFunction(&map, GL_R16F, GL_HALF_FLOAT, loadToNative<GLhalf, 1> );
253 insertLoadFunction(&map, GL_R32F, GL_FLOAT, loadToNative<GLfloat, 1> );
254 insertLoadFunction(&map, GL_R16F, GL_FLOAT, loadFloatDataToHalfFloat<1> );
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +0000255 insertLoadFunction(&map, GL_R8UI, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 1> );
256 insertLoadFunction(&map, GL_R8I, GL_BYTE, loadToNative<GLbyte, 1> );
257 insertLoadFunction(&map, GL_R16UI, GL_UNSIGNED_SHORT, loadToNative<GLushort, 1> );
258 insertLoadFunction(&map, GL_R16I, GL_SHORT, loadToNative<GLshort, 1> );
259 insertLoadFunction(&map, GL_R32UI, GL_UNSIGNED_INT, loadToNative<GLuint, 1> );
260 insertLoadFunction(&map, GL_R32I, GL_INT, loadToNative<GLint, 1> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000261 insertLoadFunction(&map, GL_DEPTH_COMPONENT16, GL_UNSIGNED_SHORT, UnimplementedLoadFunction );
262 insertLoadFunction(&map, GL_DEPTH_COMPONENT24, GL_UNSIGNED_INT, UnimplementedLoadFunction );
263 insertLoadFunction(&map, GL_DEPTH_COMPONENT16, GL_UNSIGNED_INT, UnimplementedLoadFunction );
264 insertLoadFunction(&map, GL_DEPTH_COMPONENT32F, GL_FLOAT, UnimplementedLoadFunction );
265 insertLoadFunction(&map, GL_DEPTH24_STENCIL8, GL_UNSIGNED_INT_24_8, UnimplementedLoadFunction );
266 insertLoadFunction(&map, GL_DEPTH32F_STENCIL8, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, UnimplementedLoadFunction );
267
268 // Unsized formats
269 insertLoadFunction(&map, GL_RGBA, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
270 insertLoadFunction(&map, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, UnimplementedLoadFunction );
271 insertLoadFunction(&map, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, UnimplementedLoadFunction );
272 insertLoadFunction(&map, GL_RGB, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
273 insertLoadFunction(&map, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, UnimplementedLoadFunction );
274 insertLoadFunction(&map, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
275 insertLoadFunction(&map, GL_LUMINANCE, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
276 insertLoadFunction(&map, GL_ALPHA, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
277
278 // From GL_OES_texture_float
279 insertLoadFunction(&map, GL_LUMINANCE_ALPHA, GL_FLOAT, loadLuminanceAlphaFloatDataToRGBA );
280 insertLoadFunction(&map, GL_LUMINANCE, GL_FLOAT, loadLuminanceFloatDataToRGB );
281 insertLoadFunction(&map, GL_ALPHA, GL_FLOAT, loadAlphaFloatDataToRGBA );
282
283 // From GL_OES_texture_half_float
284 insertLoadFunction(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, loadLuminanceAlphaHalfFloatDataToRGBA);
285 insertLoadFunction(&map, GL_LUMINANCE, GL_HALF_FLOAT, loadLuminanceHalfFloatDataToRGBA );
286 insertLoadFunction(&map, GL_ALPHA, GL_HALF_FLOAT, loadAlphaHalfFloatDataToRGBA );
287
288 // From GL_EXT_texture_storage
shannonwoods@chromium.org8d46e912013-05-30 00:14:32 +0000289 insertLoadFunction(&map, GL_ALPHA8_EXT, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 1> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000290 insertLoadFunction(&map, GL_LUMINANCE8_EXT, GL_UNSIGNED_BYTE, loadLuminanceDataToBGRA );
291 insertLoadFunction(&map, GL_LUMINANCE8_ALPHA8_EXT, GL_UNSIGNED_BYTE, loadLuminanceAlphaDataToBGRA );
292 insertLoadFunction(&map, GL_ALPHA32F_EXT, GL_FLOAT, loadAlphaFloatDataToRGBA );
293 insertLoadFunction(&map, GL_LUMINANCE32F_EXT, GL_FLOAT, loadLuminanceFloatDataToRGB );
294 insertLoadFunction(&map, GL_LUMINANCE_ALPHA32F_EXT, GL_FLOAT, loadLuminanceAlphaFloatDataToRGBA );
295 insertLoadFunction(&map, GL_ALPHA16F_EXT, GL_HALF_FLOAT, loadAlphaHalfFloatDataToRGBA );
296 insertLoadFunction(&map, GL_LUMINANCE16F_EXT, GL_HALF_FLOAT, loadLuminanceHalfFloatDataToRGBA );
297 insertLoadFunction(&map, GL_LUMINANCE_ALPHA16F_EXT, GL_HALF_FLOAT, loadLuminanceAlphaHalfFloatDataToRGBA);
298
shannonwoods@chromium.org8d46e912013-05-30 00:14:32 +0000299 insertLoadFunction(&map, GL_BGRA8_EXT, GL_UNSIGNED_BYTE, loadToNative<GLubyte, 4> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000300 insertLoadFunction(&map, GL_BGRA4_ANGLEX, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, loadRGBA4444DataToRGBA );
301 insertLoadFunction(&map, GL_BGRA4_ANGLEX, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
302 insertLoadFunction(&map, GL_BGR5_A1_ANGLEX, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, loadRGBA5551DataToRGBA );
303 insertLoadFunction(&map, GL_BGR5_A1_ANGLEX, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
304
305 // Compressed formats
306 // From ES 3.0.1 spec, table 3.16
307 // | Internal format | Type | Load function |
308 insertLoadFunction(&map, GL_COMPRESSED_R11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
309 insertLoadFunction(&map, GL_COMPRESSED_R11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
310 insertLoadFunction(&map, GL_COMPRESSED_SIGNED_R11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
311 insertLoadFunction(&map, GL_COMPRESSED_RG11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
312 insertLoadFunction(&map, GL_COMPRESSED_SIGNED_RG11_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
313 insertLoadFunction(&map, GL_COMPRESSED_RGB8_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
314 insertLoadFunction(&map, GL_COMPRESSED_SRGB8_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
315 insertLoadFunction(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
316 insertLoadFunction(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
317 insertLoadFunction(&map, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
318 insertLoadFunction(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_UNSIGNED_BYTE, UnimplementedLoadFunction );
319
320 // From GL_EXT_texture_compression_dxt1
321 insertLoadFunction(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 8>);
322 insertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 8>);
323
324 // From GL_ANGLE_texture_compression_dxt3
325 insertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 16>);
326
327 // From GL_ANGLE_texture_compression_dxt5
328 insertLoadFunction(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, loadCompressedBlockDataToNative<4, 4, 16>);
329
330 return map;
331}
332
333struct D3D11ES2FormatInfo
334{
335 DXGI_FORMAT mTexFormat;
336 DXGI_FORMAT mSRVFormat;
337 DXGI_FORMAT mRTVFormat;
338 DXGI_FORMAT mDSVFormat;
339
340 LoadImageFunction mLoadImageFunction;
341
342 D3D11ES2FormatInfo()
343 : mTexFormat(DXGI_FORMAT_UNKNOWN), mDSVFormat(DXGI_FORMAT_UNKNOWN), mRTVFormat(DXGI_FORMAT_UNKNOWN),
344 mSRVFormat(DXGI_FORMAT_UNKNOWN), mLoadImageFunction(NULL)
345 { }
346
347 D3D11ES2FormatInfo(DXGI_FORMAT texFormat, DXGI_FORMAT srvFormat, DXGI_FORMAT rtvFormat, DXGI_FORMAT dsvFormat,
348 LoadImageFunction loadFunc)
349 : mTexFormat(texFormat), mDSVFormat(dsvFormat), mRTVFormat(rtvFormat), mSRVFormat(srvFormat),
350 mLoadImageFunction(loadFunc)
351 { }
352};
353
354// ES2 internal formats can map to DXGI formats and loading functions
355typedef std::pair<GLint, D3D11ES2FormatInfo> D3D11ES2FormatPair;
356typedef std::map<GLint, D3D11ES2FormatInfo> D3D11ES2FormatMap;
357
Geoff Lang18591b72013-06-07 12:00:15 -0400358static D3D11ES2FormatMap BuildD3D11ES2FormatMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000359{
360 D3D11ES2FormatMap map;
361
362 // | Internal format | | Texture format | SRV format | RTV format | DSV format | Load function |
363 map.insert(D3D11ES2FormatPair(GL_NONE, D3D11ES2FormatInfo(DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, NULL )));
364 map.insert(D3D11ES2FormatPair(GL_DEPTH_COMPONENT16, D3D11ES2FormatInfo(DXGI_FORMAT_R16_TYPELESS, DXGI_FORMAT_R16_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D16_UNORM, NULL )));
365 map.insert(D3D11ES2FormatPair(GL_DEPTH_COMPONENT32_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R32_TYPELESS, DXGI_FORMAT_R32_FLOAT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D32_FLOAT, NULL )));
366 map.insert(D3D11ES2FormatPair(GL_DEPTH24_STENCIL8_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_R24_UNORM_X8_TYPELESS, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT, NULL )));
367 map.insert(D3D11ES2FormatPair(GL_STENCIL_INDEX8, D3D11ES2FormatInfo(DXGI_FORMAT_R24G8_TYPELESS, DXGI_FORMAT_X24_TYPELESS_G8_UINT, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_D24_UNORM_S8_UINT, NULL )));
368
369 map.insert(D3D11ES2FormatPair(GL_RGBA32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBAFloatDataToRGBA )));
370 map.insert(D3D11ES2FormatPair(GL_RGB32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBFloatDataToNative )));
371 map.insert(D3D11ES2FormatPair(GL_ALPHA32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadAlphaFloatDataToRGBA )));
372 map.insert(D3D11ES2FormatPair(GL_LUMINANCE32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_R32G32B32_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceFloatDataToRGB )));
373 map.insert(D3D11ES2FormatPair(GL_LUMINANCE_ALPHA32F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_R32G32B32A32_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceAlphaFloatDataToRGBA )));
374
375 map.insert(D3D11ES2FormatPair(GL_RGBA16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBAHalfFloatDataToRGBA )));
376 map.insert(D3D11ES2FormatPair(GL_RGB16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadRGBHalfFloatDataToRGBA )));
377 map.insert(D3D11ES2FormatPair(GL_ALPHA16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadAlphaHalfFloatDataToRGBA )));
378 map.insert(D3D11ES2FormatPair(GL_LUMINANCE16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceHalfFloatDataToRGBA )));
379 map.insert(D3D11ES2FormatPair(GL_LUMINANCE_ALPHA16F_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_UNKNOWN, loadLuminanceAlphaHalfFloatDataToRGBA )));
380
381 map.insert(D3D11ES2FormatPair(GL_ALPHA8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_A8_UNORM, DXGI_FORMAT_UNKNOWN, loadAlphaDataToNative )));
382 map.insert(D3D11ES2FormatPair(GL_LUMINANCE8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadLuminanceDataToBGRA )));
383 map.insert(D3D11ES2FormatPair(GL_LUMINANCE8_ALPHA8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadLuminanceAlphaDataToBGRA )));
384
385 map.insert(D3D11ES2FormatPair(GL_RGB8_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBUByteDataToRGBA )));
386 map.insert(D3D11ES2FormatPair(GL_RGB565, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGB565DataToRGBA )));
387 map.insert(D3D11ES2FormatPair(GL_RGBA8_OES, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBAUByteDataToNative )));
388 map.insert(D3D11ES2FormatPair(GL_RGBA4, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA4444DataToRGBA )));
389 map.insert(D3D11ES2FormatPair(GL_RGB5_A1, D3D11ES2FormatInfo(DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA5551DataToRGBA )));
390 map.insert(D3D11ES2FormatPair(GL_BGRA8_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadBGRADataToBGRA )));
391 map.insert(D3D11ES2FormatPair(GL_BGRA4_ANGLEX, D3D11ES2FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA4444DataToRGBA )));
392 map.insert(D3D11ES2FormatPair(GL_BGR5_A1_ANGLEX, D3D11ES2FormatInfo(DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT_UNKNOWN, loadRGBA5551DataToRGBA )));
393
394 map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 8>)));
395 map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, D3D11ES2FormatInfo(DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_BC1_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 8>)));
396 map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, D3D11ES2FormatInfo(DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_BC2_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 16>)));
397 map.insert(D3D11ES2FormatPair(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, D3D11ES2FormatInfo(DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_BC3_UNORM, DXGI_FORMAT_UNKNOWN, DXGI_FORMAT_UNKNOWN, loadCompressedBlockDataToNative<4, 4, 16>)));
398
399 return map;
400}
401
Geoff Lang18591b72013-06-07 12:00:15 -0400402static bool GetD3D11ES2FormatInfo(GLint internalFormat, GLuint clientVersion, D3D11ES2FormatInfo *outFormatInfo)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000403{
Geoff Lang18591b72013-06-07 12:00:15 -0400404 static const D3D11ES2FormatMap formatMap = BuildD3D11ES2FormatMap();
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000405 D3D11ES2FormatMap::const_iterator iter = formatMap.find(internalFormat);
406 if (iter != formatMap.end())
407 {
408 if (outFormatInfo)
409 {
410 *outFormatInfo = iter->second;
411 }
412 return true;
413 }
414 else
415 {
416 return false;
417 }
418}
419
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000420// A map to determine the pixel size and mipmap generation function of a given DXGI format
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000421struct DXGIFormatInfo
422{
423 GLuint mPixelBits;
424 GLuint mBlockWidth;
425 GLuint mBlockHeight;
426 GLint mInternalFormat;
427
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000428 MipGenerationFunction mMipGenerationFunction;
429
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000430 DXGIFormatInfo()
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000431 : mPixelBits(0), mBlockWidth(0), mBlockHeight(0), mInternalFormat(GL_NONE), mMipGenerationFunction(NULL)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000432 { }
433
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000434 DXGIFormatInfo(GLuint pixelBits, GLuint blockWidth, GLuint blockHeight, GLint internalFormat,
435 MipGenerationFunction mipFunc)
436 : mPixelBits(pixelBits), mBlockWidth(blockWidth), mBlockHeight(blockHeight), mInternalFormat(internalFormat),
437 mMipGenerationFunction(mipFunc)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000438 { }
439};
440
441typedef std::pair<DXGI_FORMAT, DXGIFormatInfo> DXGIFormatInfoPair;
442typedef std::map<DXGI_FORMAT, DXGIFormatInfo> DXGIFormatInfoMap;
443
Geoff Lang18591b72013-06-07 12:00:15 -0400444static DXGIFormatInfoMap BuildDXGIFormatInfoMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000445{
446 DXGIFormatInfoMap map;
447
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000448 // | DXGI format | S |W |H | Internal format | Mip generation function |
449 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_UNKNOWN, DXGIFormatInfo( 0, 0, 0, GL_NONE, NULL )));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000450
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000451 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_A8_UNORM, DXGIFormatInfo( 8, 1, 1, GL_ALPHA8_EXT, GenerateMip<A8> )));
452 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8_UNORM, DXGIFormatInfo( 8, 1, 1, GL_R8, GenerateMip<R8> )));
453 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8_UNORM, DXGIFormatInfo( 16, 1, 1, GL_RG8, GenerateMip<R8G8> )));
454 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8B8A8_UNORM, DXGIFormatInfo( 32, 1, 1, GL_RGBA8, GenerateMip<R8G8B8A8> )));
shannonwoods@chromium.org96c62912013-05-30 00:17:00 +0000455 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGIFormatInfo( 32, 1, 1, GL_SRGB8_ALPHA8, GenerateMip<R8G8B8A8> )));
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000456 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_B8G8R8A8_UNORM, DXGIFormatInfo( 32, 1, 1, GL_BGRA8_EXT, GenerateMip<B8G8R8A8> )));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000457
shannonwoods@chromium.org36d0be92013-05-30 00:15:59 +0000458 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8_SNORM, DXGIFormatInfo( 8, 1, 1, GL_R8_SNORM, GenerateMip<R8S> )));
459 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8_SNORM, DXGIFormatInfo( 16, 1, 1, GL_RG8_SNORM, GenerateMip<R8G8S> )));
460 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8B8A8_SNORM, DXGIFormatInfo( 32, 1, 1, GL_RGBA8_SNORM, GenerateMip<R8G8B8A8S> )));
461
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +0000462 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8_UINT, DXGIFormatInfo( 8, 1, 1, GL_R8UI, GenerateMip<R8> )));
463 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16_UINT, DXGIFormatInfo( 16, 1, 1, GL_R16UI, GenerateMip<R16> )));
464 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32_UINT, DXGIFormatInfo( 32, 1, 1, GL_R32UI, GenerateMip<R32> )));
465 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8_UINT, DXGIFormatInfo( 16, 1, 1, GL_RG8UI, GenerateMip<R8G8> )));
466 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16G16_UINT, DXGIFormatInfo( 32, 1, 1, GL_RG16UI, GenerateMip<R16G16> )));
467 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32_UINT, DXGIFormatInfo( 64, 1, 1, GL_RG32UI, GenerateMip<R32G32> )));
468 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32B32_UINT, DXGIFormatInfo( 96, 1, 1, GL_RGB32UI, GenerateMip<R32G32B32> )));
469 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8B8A8_UINT, DXGIFormatInfo( 32, 1, 1, GL_RGBA8UI, GenerateMip<R8G8B8A8> )));
470 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16G16B16A16_UINT, DXGIFormatInfo( 64, 1, 1, GL_RGBA16UI, GenerateMip<R16G16B16A16> )));
471 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32B32A32_UINT, DXGIFormatInfo(128, 1, 1, GL_RGBA32UI, GenerateMip<R32G32B32A32> )));
472
473 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8_SINT, DXGIFormatInfo( 8, 1, 1, GL_R8I, GenerateMip<R8S> )));
474 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16_SINT, DXGIFormatInfo( 16, 1, 1, GL_R16I, GenerateMip<R16S> )));
475 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32_SINT, DXGIFormatInfo( 32, 1, 1, GL_R32I, GenerateMip<R32S> )));
476 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8_SINT, DXGIFormatInfo( 16, 1, 1, GL_RG8I, GenerateMip<R8G8S> )));
477 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16G16_SINT, DXGIFormatInfo( 32, 1, 1, GL_RG16I, GenerateMip<R16G16S> )));
478 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32_SINT, DXGIFormatInfo( 64, 1, 1, GL_RG32I, GenerateMip<R32G32S> )));
479 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32B32_SINT, DXGIFormatInfo( 96, 1, 1, GL_RGB32I, GenerateMip<R32G32B32S> )));
480 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R8G8B8A8_SINT, DXGIFormatInfo( 32, 1, 1, GL_RGBA8I, GenerateMip<R8G8B8A8S> )));
481 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16G16B16A16_SINT, DXGIFormatInfo( 64, 1, 1, GL_RGBA16I, GenerateMip<R16G16B16A16S>)));
482 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32B32A32_SINT, DXGIFormatInfo(128, 1, 1, GL_RGBA32I, GenerateMip<R32G32B32A32S>)));
483
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000484 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R10G10B10A2_UNORM, DXGIFormatInfo( 32, 1, 1, GL_RGB10_A2, GenerateMip<R10G10B10A2> )));
shannonwoods@chromium.orga05127a2013-05-30 00:16:07 +0000485 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R10G10B10A2_UINT, DXGIFormatInfo( 32, 1, 1, GL_RGB10_A2UI, GenerateMip<R10G10B10A2> )));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000486
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000487 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16_FLOAT, DXGIFormatInfo( 16, 1, 1, GL_R16F, GenerateMip<R16F> )));
488 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16G16_FLOAT, DXGIFormatInfo( 32, 1, 1, GL_RG16F, GenerateMip<R16G16F> )));
489 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16G16B16A16_FLOAT, DXGIFormatInfo( 64, 1, 1, GL_RGBA16F, GenerateMip<R16G16B16A16F>)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000490
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000491 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32_FLOAT, DXGIFormatInfo( 32, 1, 1, GL_R32F, GenerateMip<R32F> )));
492 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32_FLOAT, DXGIFormatInfo( 64, 1, 1, GL_RG32F, GenerateMip<R32G32F> )));
493 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32B32_FLOAT, DXGIFormatInfo( 96, 1, 1, GL_RGB32F, GenerateMip<R32G32B32F> )));
494 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G32B32A32_FLOAT, DXGIFormatInfo(128, 1, 1, GL_RGBA32F, GenerateMip<R32G32B32A32F>)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000495
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000496 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R9G9B9E5_SHAREDEXP, DXGIFormatInfo( 32, 1, 1, GL_RGB9_E5, GenerateMip<R9G9B9E5> )));
shannonwoods@chromium.orga43d8292013-05-30 00:15:50 +0000497 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R11G11B10_FLOAT, DXGIFormatInfo( 32, 1, 1, GL_R11F_G11F_B10F, GenerateMip<R11G11B10F> )));
shannonwoods@chromium.org92b9cd52013-05-30 00:14:48 +0000498
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000499 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R16_TYPELESS, DXGIFormatInfo( 16, 1, 1, GL_DEPTH_COMPONENT16, NULL )));
500 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_D16_UNORM, DXGIFormatInfo( 16, 1, 1, GL_DEPTH_COMPONENT16, NULL )));
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000501 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R24G8_TYPELESS, DXGIFormatInfo( 32, 1, 1, GL_DEPTH24_STENCIL8_OES, NULL )));
502 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_D24_UNORM_S8_UINT, DXGIFormatInfo( 32, 1, 1, GL_DEPTH24_STENCIL8_OES, NULL )));
shannonwoods@chromium.orgd03f8972013-05-30 00:17:07 +0000503 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32_TYPELESS, DXGIFormatInfo( 32, 1, 1, GL_DEPTH_COMPONENT32_OES, NULL )));
504 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_D32_FLOAT, DXGIFormatInfo( 32, 1, 1, GL_DEPTH_COMPONENT32_OES, NULL )));
505 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_R32G8X24_TYPELESS, DXGIFormatInfo( 32, 1, 1, GL_DEPTH32F_STENCIL8, NULL )));
506 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_D32_FLOAT_S8X24_UINT,DXGIFormatInfo( 32, 1, 1, GL_DEPTH32F_STENCIL8, NULL )));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000507
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000508 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_BC1_UNORM, DXGIFormatInfo( 64, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, NULL )));
509 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_BC2_UNORM, DXGIFormatInfo(128, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, NULL )));
510 map.insert(DXGIFormatInfoPair(DXGI_FORMAT_BC3_UNORM, DXGIFormatInfo(128, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, NULL )));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000511
512 return map;
513}
514
Geoff Lang61e49a52013-05-29 10:22:58 -0400515static const DXGIFormatInfoMap &GetDXGIFormatInfoMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000516{
Geoff Lang18591b72013-06-07 12:00:15 -0400517 static const DXGIFormatInfoMap infoMap = BuildDXGIFormatInfoMap();
Geoff Lang61e49a52013-05-29 10:22:58 -0400518 return infoMap;
519}
520
Geoff Lang18591b72013-06-07 12:00:15 -0400521static bool GetDXGIFormatInfo(DXGI_FORMAT format, DXGIFormatInfo *outFormatInfo)
Geoff Lang61e49a52013-05-29 10:22:58 -0400522{
523 const DXGIFormatInfoMap &infoMap = GetDXGIFormatInfoMap();
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000524 DXGIFormatInfoMap::const_iterator iter = infoMap.find(format);
525 if (iter != infoMap.end())
526 {
527 if (outFormatInfo)
528 {
529 *outFormatInfo = iter->second;
530 }
531 return true;
532 }
533 else
534 {
535 return false;
536 }
537}
538
Geoff Lang61e49a52013-05-29 10:22:58 -0400539static d3d11::DXGIFormatSet BuildAllDXGIFormatSet()
540{
541 d3d11::DXGIFormatSet set;
542
543 const DXGIFormatInfoMap &infoMap = GetDXGIFormatInfoMap();
544 for (DXGIFormatInfoMap::const_iterator i = infoMap.begin(); i != infoMap.end(); ++i)
545 {
546 set.insert(i->first);
547 }
548
549 return set;
550}
551
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000552namespace d3d11
553{
554
555MipGenerationFunction GetMipGenerationFunction(DXGI_FORMAT format)
556{
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000557 DXGIFormatInfo formatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400558 if (GetDXGIFormatInfo(format, &formatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000559 {
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000560 return formatInfo.mMipGenerationFunction;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000561 }
562 else
563 {
564 UNREACHABLE();
565 return NULL;
566 }
567}
568
569LoadImageFunction GetImageLoadFunction(GLint internalFormat, GLenum type, GLuint clientVersion)
570{
571 if (clientVersion == 2)
572 {
573 D3D11ES2FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400574 if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000575 {
576 return d3d11FormatInfo.mLoadImageFunction;
577 }
578 else
579 {
580 UNREACHABLE();
581 return NULL;
582 }
583 }
584 else if (clientVersion == 3)
585 {
586 static const D3D11LoadFunctionMap loadImageMap = buildD3D11LoadFunctionMap();
587 D3D11LoadFunctionMap::const_iterator iter = loadImageMap.find(InternalFormatTypePair(internalFormat, type));
588 if (iter != loadImageMap.end())
589 {
590 return iter->second;
591 }
592 else
593 {
594 UNREACHABLE();
595 return NULL;
596 }
597 }
598 else
599 {
600 UNREACHABLE();
601 return NULL;
602 }
603}
604
605GLuint GetFormatPixelBytes(DXGI_FORMAT format)
606{
607 DXGIFormatInfo dxgiFormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400608 if (GetDXGIFormatInfo(format, &dxgiFormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000609 {
610 return dxgiFormatInfo.mPixelBits / 8;
611 }
612 else
613 {
614 UNREACHABLE();
615 return 0;
616 }
617}
618
619GLuint GetBlockWidth(DXGI_FORMAT format)
620{
621 DXGIFormatInfo dxgiFormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400622 if (GetDXGIFormatInfo(format, &dxgiFormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000623 {
624 return dxgiFormatInfo.mBlockWidth;
625 }
626 else
627 {
628 UNREACHABLE();
629 return 0;
630 }
631}
632
633GLuint GetBlockHeight(DXGI_FORMAT format)
634{
635 DXGIFormatInfo dxgiFormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400636 if (GetDXGIFormatInfo(format, &dxgiFormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000637 {
638 return dxgiFormatInfo.mBlockHeight;
639 }
640 else
641 {
642 UNREACHABLE();
643 return 0;
644 }
645}
646
647void MakeValidSize(bool isImage, DXGI_FORMAT format, GLsizei *requestWidth, GLsizei *requestHeight, int *levelOffset)
648{
649 DXGIFormatInfo dxgiFormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400650 if (GetDXGIFormatInfo(format, &dxgiFormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000651 {
652 int upsampleCount = 0;
653
654 GLsizei blockWidth = dxgiFormatInfo.mBlockWidth;
655 GLsizei blockHeight = dxgiFormatInfo.mBlockHeight;
656
657 // Don't expand the size of full textures that are at least (blockWidth x blockHeight) already.
658 if (isImage || *requestWidth < blockWidth || *requestHeight < blockHeight)
659 {
660 while (*requestWidth % blockWidth != 0 || *requestHeight % blockHeight != 0)
661 {
662 *requestWidth <<= 1;
663 *requestHeight <<= 1;
664 upsampleCount++;
665 }
666 }
667 *levelOffset = upsampleCount;
668 }
669 else
670 {
671 UNREACHABLE();
672 }
673}
674
Geoff Lang61e49a52013-05-29 10:22:58 -0400675const DXGIFormatSet &GetAllUsedDXGIFormats()
676{
677 static DXGIFormatSet formatSet = BuildAllDXGIFormatSet();
678 return formatSet;
679}
680
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000681}
682
683namespace gl_d3d11
684{
685
686DXGI_FORMAT GetTexFormat(GLint internalFormat, GLuint clientVersion)
687{
688 if (clientVersion == 2)
689 {
690 D3D11ES2FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400691 if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000692 {
693 return d3d11FormatInfo.mTexFormat;
694 }
695 else
696 {
697 UNREACHABLE();
698 return DXGI_FORMAT_UNKNOWN;
699 }
700 }
701 else if (clientVersion == 3)
702 {
703 D3D11ES3FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400704 if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000705 {
706 return d3d11FormatInfo.mTexFormat;
707 }
708 else
709 {
710 UNREACHABLE();
711 return DXGI_FORMAT_UNKNOWN;
712 }
713 }
714 else
715 {
716 UNREACHABLE();
717 return DXGI_FORMAT_UNKNOWN;
718 }
719}
720
721DXGI_FORMAT GetSRVFormat(GLint internalFormat, GLuint clientVersion)
722{
723 if (clientVersion == 2)
724 {
725 D3D11ES2FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400726 if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000727 {
728 return d3d11FormatInfo.mSRVFormat;
729 }
730 else
731 {
732 UNREACHABLE();
733 return DXGI_FORMAT_UNKNOWN;
734 }
735 }
736 else if (clientVersion == 3)
737 {
738 D3D11ES3FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400739 if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000740 {
741 return d3d11FormatInfo.mSRVFormat;
742 }
743 else
744 {
745 UNREACHABLE();
746 return DXGI_FORMAT_UNKNOWN;
747 }
748 }
749 else
750 {
751 UNREACHABLE();
752 return DXGI_FORMAT_UNKNOWN;
753 }
754}
755
756DXGI_FORMAT GetRTVFormat(GLint internalFormat, GLuint clientVersion)
757{
758 if (clientVersion == 2)
759 {
760 D3D11ES2FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400761 if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000762 {
763 return d3d11FormatInfo.mRTVFormat;
764 }
765 else
766 {
767 UNREACHABLE();
768 return DXGI_FORMAT_UNKNOWN;
769 }
770 }
771 else if (clientVersion == 3)
772 {
773 D3D11ES3FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400774 if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000775 {
776 return d3d11FormatInfo.mRTVFormat;
777 }
778 else
779 {
780 UNREACHABLE();
781 return DXGI_FORMAT_UNKNOWN;
782 }
783 }
784 else
785 {
786 UNREACHABLE();
787 return DXGI_FORMAT_UNKNOWN;
788 }
789}
790
791DXGI_FORMAT GetDSVFormat(GLint internalFormat, GLuint clientVersion)
792{
793 if (clientVersion == 2)
794 {
795 D3D11ES2FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400796 if (GetD3D11ES2FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000797 {
798 return d3d11FormatInfo.mDSVFormat;
799 }
800 else
801 {
802 return DXGI_FORMAT_UNKNOWN;
803 }
804 }
805 else if (clientVersion == 3)
806 {
807 D3D11ES3FormatInfo d3d11FormatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400808 if (GetD3D11ES3FormatInfo(internalFormat, clientVersion, &d3d11FormatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000809 {
810 return d3d11FormatInfo.mDSVFormat;
811 }
812 else
813 {
814 return DXGI_FORMAT_UNKNOWN;
815 }
816 }
817 else
818 {
819 UNREACHABLE();
820 return DXGI_FORMAT_UNKNOWN;
821 }
822}
823
824}
825
826namespace d3d11_gl
827{
828
829GLint GetInternalFormat(DXGI_FORMAT format)
830{
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000831 DXGIFormatInfo formatInfo;
Geoff Lang18591b72013-06-07 12:00:15 -0400832 if (GetDXGIFormatInfo(format, &formatInfo))
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000833 {
shannonwoods@chromium.orgba9d7502013-05-30 00:14:58 +0000834 return formatInfo.mInternalFormat;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000835 }
836 else
837 {
838 UNREACHABLE();
839 return GL_NONE;
840 }
841}
842
843}
844
845}