blob: 506431ecf6a643eee6a4ca3f4cc18778e2c0341f [file] [log] [blame]
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001//
Geoff Langcec35902014-04-16 10:52:36 -04002// Copyright (c) 2013-2014 The ANGLE Project Authors. All rights reserved.
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// formatutils.cpp: Queries for GL image formats.
8
Shannon Woods4d161ba2014-03-17 18:13:30 -04009#include "common/mathutil.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050010#include "libANGLE/formatutils.h"
11#include "libANGLE/Context.h"
12#include "libANGLE/Framebuffer.h"
13#include "libANGLE/renderer/Renderer.h"
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000014
15namespace gl
16{
17
18// ES2 requires that format is equal to internal format at all glTex*Image2D entry points and the implementation
19// can decide the true, sized, internal format. The ES2FormatMap determines the internal format for all valid
20// format and type combinations.
21
22typedef std::pair<GLenum, GLenum> FormatTypePair;
Geoff Lang051dbc72015-01-05 15:48:58 -050023typedef std::pair<FormatTypePair, GLenum> FormatPair;
24typedef std::map<FormatTypePair, GLenum> FormatMap;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000025
Jamie Madill89a0bf52013-09-18 14:36:24 -040026// A helper function to insert data into the format map with fewer characters.
Geoff Lang051dbc72015-01-05 15:48:58 -050027static inline void InsertFormatMapping(FormatMap *map, GLenum format, GLenum type, GLenum internalFormat)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000028{
Geoff Lang051dbc72015-01-05 15:48:58 -050029 map->insert(FormatPair(FormatTypePair(format, type), internalFormat));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000030}
31
Geoff Lange4a492b2014-06-19 14:14:41 -040032FormatMap BuildFormatMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000033{
34 FormatMap map;
35
Geoff Lang051dbc72015-01-05 15:48:58 -050036 // | Format | Type | Internal format |
37 InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA8);
38 InsertFormatMapping(&map, GL_RGBA, GL_BYTE, GL_RGBA8_SNORM);
39 InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_RGBA4);
40 InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_RGB5_A1);
41 InsertFormatMapping(&map, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_RGB10_A2);
42 InsertFormatMapping(&map, GL_RGBA, GL_FLOAT, GL_RGBA32F);
43 InsertFormatMapping(&map, GL_RGBA, GL_HALF_FLOAT, GL_RGBA16F);
44 InsertFormatMapping(&map, GL_RGBA, GL_HALF_FLOAT_OES, GL_RGBA16F);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000045
Geoff Lang051dbc72015-01-05 15:48:58 -050046 InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_RGBA8UI);
47 InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_BYTE, GL_RGBA8I);
48 InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_RGBA16UI);
49 InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_SHORT, GL_RGBA16I);
50 InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_RGBA32UI);
51 InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_INT, GL_RGBA32I);
52 InsertFormatMapping(&map, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_RGB10_A2UI);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000053
Geoff Lang051dbc72015-01-05 15:48:58 -050054 InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_BYTE, GL_RGB8);
55 InsertFormatMapping(&map, GL_RGB, GL_BYTE, GL_RGB8_SNORM);
56 InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB565);
57 InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_R11F_G11F_B10F);
58 InsertFormatMapping(&map, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_RGB9_E5);
59 InsertFormatMapping(&map, GL_RGB, GL_FLOAT, GL_RGB32F);
60 InsertFormatMapping(&map, GL_RGB, GL_HALF_FLOAT, GL_RGB16F);
61 InsertFormatMapping(&map, GL_RGB, GL_HALF_FLOAT_OES, GL_RGB16F);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000062
Geoff Lang051dbc72015-01-05 15:48:58 -050063 InsertFormatMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_RGB8UI);
64 InsertFormatMapping(&map, GL_RGB_INTEGER, GL_BYTE, GL_RGB8I);
65 InsertFormatMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_RGB16UI);
66 InsertFormatMapping(&map, GL_RGB_INTEGER, GL_SHORT, GL_RGB16I);
67 InsertFormatMapping(&map, GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_RGB32UI);
68 InsertFormatMapping(&map, GL_RGB_INTEGER, GL_INT, GL_RGB32I);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000069
Geoff Lang051dbc72015-01-05 15:48:58 -050070 InsertFormatMapping(&map, GL_RG, GL_UNSIGNED_BYTE, GL_RG8);
71 InsertFormatMapping(&map, GL_RG, GL_BYTE, GL_RG8_SNORM);
72 InsertFormatMapping(&map, GL_RG, GL_FLOAT, GL_RG32F);
73 InsertFormatMapping(&map, GL_RG, GL_HALF_FLOAT, GL_RG16F);
74 InsertFormatMapping(&map, GL_RG, GL_HALF_FLOAT_OES, GL_RG16F);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000075
Geoff Lang051dbc72015-01-05 15:48:58 -050076 InsertFormatMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_RG8UI);
77 InsertFormatMapping(&map, GL_RG_INTEGER, GL_BYTE, GL_RG8I);
78 InsertFormatMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_RG16UI);
79 InsertFormatMapping(&map, GL_RG_INTEGER, GL_SHORT, GL_RG16I);
80 InsertFormatMapping(&map, GL_RG_INTEGER, GL_UNSIGNED_INT, GL_RG32UI);
81 InsertFormatMapping(&map, GL_RG_INTEGER, GL_INT, GL_RG32I);
Geoff Langfe28ca02013-06-04 10:10:48 -040082
Geoff Lang051dbc72015-01-05 15:48:58 -050083 InsertFormatMapping(&map, GL_RED, GL_UNSIGNED_BYTE, GL_R8);
84 InsertFormatMapping(&map, GL_RED, GL_BYTE, GL_R8_SNORM);
85 InsertFormatMapping(&map, GL_RED, GL_FLOAT, GL_R32F);
86 InsertFormatMapping(&map, GL_RED, GL_HALF_FLOAT, GL_R16F);
87 InsertFormatMapping(&map, GL_RED, GL_HALF_FLOAT_OES, GL_R16F);
Geoff Langfe28ca02013-06-04 10:10:48 -040088
Geoff Lang051dbc72015-01-05 15:48:58 -050089 InsertFormatMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_R8UI);
90 InsertFormatMapping(&map, GL_RED_INTEGER, GL_BYTE, GL_R8I);
91 InsertFormatMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_R16UI);
92 InsertFormatMapping(&map, GL_RED_INTEGER, GL_SHORT, GL_R16I);
93 InsertFormatMapping(&map, GL_RED_INTEGER, GL_UNSIGNED_INT, GL_R32UI);
94 InsertFormatMapping(&map, GL_RED_INTEGER, GL_INT, GL_R32I);
Geoff Langfe28ca02013-06-04 10:10:48 -040095
Geoff Lang051dbc72015-01-05 15:48:58 -050096 InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_LUMINANCE8_ALPHA8_EXT);
97 InsertFormatMapping(&map, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE8_EXT);
98 InsertFormatMapping(&map, GL_ALPHA, GL_UNSIGNED_BYTE, GL_ALPHA8_EXT);
99 InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_LUMINANCE_ALPHA32F_EXT);
100 InsertFormatMapping(&map, GL_LUMINANCE, GL_FLOAT, GL_LUMINANCE32F_EXT);
101 InsertFormatMapping(&map, GL_ALPHA, GL_FLOAT, GL_ALPHA32F_EXT);
102 InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, GL_LUMINANCE_ALPHA16F_EXT);
103 InsertFormatMapping(&map, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, GL_LUMINANCE_ALPHA16F_EXT);
104 InsertFormatMapping(&map, GL_LUMINANCE, GL_HALF_FLOAT, GL_LUMINANCE16F_EXT);
105 InsertFormatMapping(&map, GL_LUMINANCE, GL_HALF_FLOAT_OES, GL_LUMINANCE16F_EXT);
106 InsertFormatMapping(&map, GL_ALPHA, GL_HALF_FLOAT, GL_ALPHA16F_EXT);
107 InsertFormatMapping(&map, GL_ALPHA, GL_HALF_FLOAT_OES, GL_ALPHA16F_EXT);
Geoff Langfe28ca02013-06-04 10:10:48 -0400108
Geoff Lang051dbc72015-01-05 15:48:58 -0500109 InsertFormatMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_BGRA8_EXT);
110 InsertFormatMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, GL_BGRA4_ANGLEX);
111 InsertFormatMapping(&map, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_BGR5_A1_ANGLEX);
Geoff Langfe28ca02013-06-04 10:10:48 -0400112
Geoff Lang051dbc72015-01-05 15:48:58 -0500113 InsertFormatMapping(&map, GL_SRGB_EXT, GL_UNSIGNED_BYTE, GL_SRGB8);
114 InsertFormatMapping(&map, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, GL_SRGB8_ALPHA8);
Geoff Langfe28ca02013-06-04 10:10:48 -0400115
Geoff Lang051dbc72015-01-05 15:48:58 -0500116 InsertFormatMapping(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGB_S3TC_DXT1_EXT);
117 InsertFormatMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT);
118 InsertFormatMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE);
119 InsertFormatMapping(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE);
Geoff Lang05b05022014-06-11 15:31:45 -0400120
Geoff Lang051dbc72015-01-05 15:48:58 -0500121 InsertFormatMapping(&map, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_DEPTH_COMPONENT16);
122 InsertFormatMapping(&map, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_DEPTH_COMPONENT32_OES);
123 InsertFormatMapping(&map, GL_DEPTH_COMPONENT, GL_FLOAT, GL_DEPTH_COMPONENT32F);
Geoff Langcec35902014-04-16 10:52:36 -0400124
Geoff Lang051dbc72015-01-05 15:48:58 -0500125 InsertFormatMapping(&map, GL_STENCIL, GL_UNSIGNED_BYTE, GL_STENCIL_INDEX8);
Geoff Langfe28ca02013-06-04 10:10:48 -0400126
Geoff Lang051dbc72015-01-05 15:48:58 -0500127 InsertFormatMapping(&map, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH24_STENCIL8);
128 InsertFormatMapping(&map, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_DEPTH32F_STENCIL8);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000129
130 return map;
131}
132
Geoff Lang5d601382014-07-22 15:14:06 -0400133Type::Type()
134 : bytes(0),
Olli Etuaho11ffe1b2015-03-24 17:28:18 +0200135 bytesShift(0),
Geoff Lang5d601382014-07-22 15:14:06 -0400136 specialInterpretation(false)
Geoff Langfe28ca02013-06-04 10:10:48 -0400137{
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000138}
139
Olli Etuaho31f8f4f2015-03-25 16:03:57 +0200140static Type GenTypeInfo(GLuint bytes, bool specialInterpretation)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000141{
Geoff Lang5d601382014-07-22 15:14:06 -0400142 Type info;
143 info.bytes = bytes;
Olli Etuaho11ffe1b2015-03-24 17:28:18 +0200144 GLuint i = 0;
145 while ((1u << i) < bytes)
146 {
147 ++i;
148 }
149 info.bytesShift = i;
150 ASSERT((1u << info.bytesShift) == bytes);
Geoff Lang5d601382014-07-22 15:14:06 -0400151 info.specialInterpretation = specialInterpretation;
Olli Etuaho31f8f4f2015-03-25 16:03:57 +0200152 return info;
Geoff Lang5d601382014-07-22 15:14:06 -0400153}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000154
Geoff Lang5d601382014-07-22 15:14:06 -0400155bool operator<(const Type& a, const Type& b)
156{
157 return memcmp(&a, &b, sizeof(Type)) < 0;
158}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000159
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000160// Information about internal formats
Geoff Lang493daf52014-07-03 13:38:44 -0400161static bool AlwaysSupported(GLuint, const Extensions &)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000162{
Geoff Lang493daf52014-07-03 13:38:44 -0400163 return true;
164}
165
166static bool UnimplementedSupport(GLuint, const Extensions &)
167{
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000168 return false;
169}
170
Geoff Lang493daf52014-07-03 13:38:44 -0400171static bool NeverSupported(GLuint, const Extensions &)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000172{
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000173 return false;
174}
175
Geoff Lange4a492b2014-06-19 14:14:41 -0400176template <GLuint minCoreGLVersion>
Geoff Langabce7622014-09-19 16:13:00 -0400177static bool RequireES(GLuint clientVersion, const Extensions &)
Geoff Lange4a492b2014-06-19 14:14:41 -0400178{
179 return clientVersion >= minCoreGLVersion;
180}
181
Geoff Langcec35902014-04-16 10:52:36 -0400182// Pointer to a boolean memeber of the Extensions struct
183typedef bool(Extensions::*ExtensionBool);
184
185// Check support for a single extension
186template <ExtensionBool bool1>
Geoff Langabce7622014-09-19 16:13:00 -0400187static bool RequireExt(GLuint, const Extensions & extensions)
Geoff Langcec35902014-04-16 10:52:36 -0400188{
Geoff Lange4a492b2014-06-19 14:14:41 -0400189 return extensions.*bool1;
190}
191
192// Check for a minimum client version or a single extension
193template <GLuint minCoreGLVersion, ExtensionBool bool1>
Geoff Langabce7622014-09-19 16:13:00 -0400194static bool RequireESOrExt(GLuint clientVersion, const Extensions &extensions)
Geoff Lange4a492b2014-06-19 14:14:41 -0400195{
196 return clientVersion >= minCoreGLVersion || extensions.*bool1;
197}
198
199// Check for a minimum client version or two extensions
200template <GLuint minCoreGLVersion, ExtensionBool bool1, ExtensionBool bool2>
Geoff Langabce7622014-09-19 16:13:00 -0400201static bool RequireESOrExtAndExt(GLuint clientVersion, const Extensions &extensions)
Geoff Lange4a492b2014-06-19 14:14:41 -0400202{
Geoff Langabce7622014-09-19 16:13:00 -0400203 return clientVersion >= minCoreGLVersion || (extensions.*bool1 && extensions.*bool2);
204}
205
206// Check for a minimum client version or at least one of two extensions
207template <GLuint minCoreGLVersion, ExtensionBool bool1, ExtensionBool bool2>
208static bool RequireESOrExtOrExt(GLuint clientVersion, const Extensions &extensions)
209{
210 return clientVersion >= minCoreGLVersion || extensions.*bool1 || extensions.*bool2;
Geoff Langcec35902014-04-16 10:52:36 -0400211}
212
213// Check support for two extensions
214template <ExtensionBool bool1, ExtensionBool bool2>
Geoff Langabce7622014-09-19 16:13:00 -0400215static bool RequireExtAndExt(GLuint, const Extensions &extensions)
Geoff Langcec35902014-04-16 10:52:36 -0400216{
Geoff Langabce7622014-09-19 16:13:00 -0400217 return extensions.*bool1 && extensions.*bool2;
Geoff Langcec35902014-04-16 10:52:36 -0400218}
219
Geoff Lang5d601382014-07-22 15:14:06 -0400220InternalFormat::InternalFormat()
221 : redBits(0),
222 greenBits(0),
223 blueBits(0),
224 luminanceBits(0),
225 alphaBits(0),
226 sharedBits(0),
227 depthBits(0),
228 stencilBits(0),
229 pixelBytes(0),
230 componentCount(0),
Corentin Wallezbc99bb62015-05-14 17:42:20 -0400231 compressed(false),
Geoff Lang5d601382014-07-22 15:14:06 -0400232 compressedBlockWidth(0),
233 compressedBlockHeight(0),
234 format(GL_NONE),
235 type(GL_NONE),
236 componentType(GL_NONE),
237 colorEncoding(GL_NONE),
Geoff Lang5d601382014-07-22 15:14:06 -0400238 textureSupport(NeverSupported),
239 renderSupport(NeverSupported),
240 filterSupport(NeverSupported)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000241{
Geoff Lang5d601382014-07-22 15:14:06 -0400242}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000243
Geoff Lang5d601382014-07-22 15:14:06 -0400244static InternalFormat UnsizedFormat(GLenum format, InternalFormat::SupportCheckFunction textureSupport,
245 InternalFormat::SupportCheckFunction renderSupport,
246 InternalFormat::SupportCheckFunction filterSupport)
247{
248 InternalFormat formatInfo;
249 formatInfo.format = format;
250 formatInfo.textureSupport = textureSupport;
251 formatInfo.renderSupport = renderSupport;
252 formatInfo.filterSupport = filterSupport;
253 return formatInfo;
254}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000255
Geoff Lang5d601382014-07-22 15:14:06 -0400256static InternalFormat RGBAFormat(GLuint red, GLuint green, GLuint blue, GLuint alpha, GLuint shared,
257 GLenum format, GLenum type, GLenum componentType, bool srgb,
258 InternalFormat::SupportCheckFunction textureSupport,
259 InternalFormat::SupportCheckFunction renderSupport,
260 InternalFormat::SupportCheckFunction filterSupport)
261{
262 InternalFormat formatInfo;
263 formatInfo.redBits = red;
264 formatInfo.greenBits = green;
265 formatInfo.blueBits = blue;
266 formatInfo.alphaBits = alpha;
267 formatInfo.sharedBits = shared;
268 formatInfo.pixelBytes = (red + green + blue + alpha + shared) / 8;
269 formatInfo.componentCount = ((red > 0) ? 1 : 0) + ((green > 0) ? 1 : 0) + ((blue > 0) ? 1 : 0) + ((alpha > 0) ? 1 : 0);
270 formatInfo.format = format;
271 formatInfo.type = type;
272 formatInfo.componentType = componentType;
273 formatInfo.colorEncoding = (srgb ? GL_SRGB : GL_LINEAR);
274 formatInfo.textureSupport = textureSupport;
275 formatInfo.renderSupport = renderSupport;
276 formatInfo.filterSupport = filterSupport;
277 return formatInfo;
278}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000279
Geoff Lang5d601382014-07-22 15:14:06 -0400280static InternalFormat LUMAFormat(GLuint luminance, GLuint alpha, GLenum format, GLenum type, GLenum componentType,
281 InternalFormat::SupportCheckFunction textureSupport,
282 InternalFormat::SupportCheckFunction renderSupport,
283 InternalFormat::SupportCheckFunction filterSupport)
284{
285 InternalFormat formatInfo;
286 formatInfo.luminanceBits = luminance;
287 formatInfo.alphaBits = alpha;
288 formatInfo.pixelBytes = (luminance + alpha) / 8;
289 formatInfo.componentCount = ((luminance > 0) ? 1 : 0) + ((alpha > 0) ? 1 : 0);
290 formatInfo.format = format;
291 formatInfo.type = type;
292 formatInfo.componentType = componentType;
293 formatInfo.colorEncoding = GL_LINEAR;
294 formatInfo.textureSupport = textureSupport;
295 formatInfo.renderSupport = renderSupport;
296 formatInfo.filterSupport = filterSupport;
297 return formatInfo;
298}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000299
Geoff Lang5d601382014-07-22 15:14:06 -0400300static InternalFormat DepthStencilFormat(GLuint depthBits, GLuint stencilBits, GLuint unusedBits, GLenum format,
301 GLenum type, GLenum componentType, InternalFormat::SupportCheckFunction textureSupport,
302 InternalFormat::SupportCheckFunction renderSupport,
303 InternalFormat::SupportCheckFunction filterSupport)
304{
305 InternalFormat formatInfo;
306 formatInfo.depthBits = depthBits;
307 formatInfo.stencilBits = stencilBits;
308 formatInfo.pixelBytes = (depthBits + stencilBits + unusedBits) / 8;
309 formatInfo.componentCount = ((depthBits > 0) ? 1 : 0) + ((stencilBits > 0) ? 1 : 0);
310 formatInfo.format = format;
311 formatInfo.type = type;
312 formatInfo.componentType = componentType;
313 formatInfo.colorEncoding = GL_LINEAR;
314 formatInfo.textureSupport = textureSupport;
315 formatInfo.renderSupport = renderSupport;
316 formatInfo.filterSupport = filterSupport;
317 return formatInfo;
318}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000319
Geoff Lang5d601382014-07-22 15:14:06 -0400320static InternalFormat CompressedFormat(GLuint compressedBlockWidth, GLuint compressedBlockHeight, GLuint compressedBlockSize,
321 GLuint componentCount, GLenum format, GLenum type, bool srgb,
322 InternalFormat::SupportCheckFunction textureSupport,
323 InternalFormat::SupportCheckFunction renderSupport,
324 InternalFormat::SupportCheckFunction filterSupport)
325{
326 InternalFormat formatInfo;
327 formatInfo.compressedBlockWidth = compressedBlockWidth;
328 formatInfo.compressedBlockHeight = compressedBlockHeight;
329 formatInfo.pixelBytes = compressedBlockSize / 8;
330 formatInfo.componentCount = componentCount;
331 formatInfo.format = format;
332 formatInfo.type = type;
333 formatInfo.componentType = GL_UNSIGNED_NORMALIZED;
334 formatInfo.colorEncoding = (srgb ? GL_SRGB : GL_LINEAR);
335 formatInfo.compressed = true;
336 formatInfo.textureSupport = textureSupport;
337 formatInfo.renderSupport = renderSupport;
338 formatInfo.filterSupport = filterSupport;
339 return formatInfo;
340}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000341
Geoff Lang5d601382014-07-22 15:14:06 -0400342typedef std::pair<GLenum, InternalFormat> InternalFormatInfoPair;
343typedef std::map<GLenum, InternalFormat> InternalFormatInfoMap;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000344
Geoff Lange4a492b2014-06-19 14:14:41 -0400345static InternalFormatInfoMap BuildInternalFormatInfoMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000346{
347 InternalFormatInfoMap map;
348
349 // From ES 3.0.1 spec, table 3.12
Geoff Lang5d601382014-07-22 15:14:06 -0400350 map.insert(InternalFormatInfoPair(GL_NONE, InternalFormat()));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000351
Geoff Langabce7622014-09-19 16:13:00 -0400352 // | Internal format | | R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Renderable | Filterable |
353 map.insert(InternalFormatInfoPair(GL_R8, RGBAFormat( 8, 0, 0, 0, 0, GL_RED, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, &Extensions::textureRG>, RequireESOrExt<3, &Extensions::textureRG>, AlwaysSupported)));
354 map.insert(InternalFormatInfoPair(GL_R8_SNORM, RGBAFormat( 8, 0, 0, 0, 0, GL_RED, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3>, NeverSupported, AlwaysSupported)));
355 map.insert(InternalFormatInfoPair(GL_RG8, RGBAFormat( 8, 8, 0, 0, 0, GL_RG, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, &Extensions::textureRG>, RequireESOrExt<3, &Extensions::textureRG>, AlwaysSupported)));
356 map.insert(InternalFormatInfoPair(GL_RG8_SNORM, RGBAFormat( 8, 8, 0, 0, 0, GL_RG, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3>, NeverSupported, AlwaysSupported)));
357 map.insert(InternalFormatInfoPair(GL_RGB8, RGBAFormat( 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, &Extensions::rgb8rgba8>, RequireESOrExt<3, &Extensions::rgb8rgba8>, AlwaysSupported)));
358 map.insert(InternalFormatInfoPair(GL_RGB8_SNORM, RGBAFormat( 8, 8, 8, 0, 0, GL_RGB, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3>, NeverSupported, AlwaysSupported)));
359 map.insert(InternalFormatInfoPair(GL_RGB565, RGBAFormat( 5, 6, 5, 0, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, RequireES<2>, RequireES<2>, AlwaysSupported)));
360 map.insert(InternalFormatInfoPair(GL_RGBA4, RGBAFormat( 4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_NORMALIZED, false, RequireES<2>, RequireES<2>, AlwaysSupported)));
361 map.insert(InternalFormatInfoPair(GL_RGB5_A1, RGBAFormat( 5, 5, 5, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_NORMALIZED, false, RequireES<2>, RequireES<2>, AlwaysSupported)));
362 map.insert(InternalFormatInfoPair(GL_RGBA8, RGBAFormat( 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, &Extensions::rgb8rgba8>, RequireESOrExt<3, &Extensions::rgb8rgba8>, AlwaysSupported)));
363 map.insert(InternalFormatInfoPair(GL_RGBA8_SNORM, RGBAFormat( 8, 8, 8, 8, 0, GL_RGBA, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3>, NeverSupported, AlwaysSupported)));
364 map.insert(InternalFormatInfoPair(GL_RGB10_A2, RGBAFormat(10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireES<3>, RequireES<3>, AlwaysSupported)));
365 map.insert(InternalFormatInfoPair(GL_RGB10_A2UI, RGBAFormat(10, 10, 10, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT, false, RequireES<3>, NeverSupported, NeverSupported)));
366 map.insert(InternalFormatInfoPair(GL_SRGB8, RGBAFormat( 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireESOrExt<3, &Extensions::sRGB>, NeverSupported, AlwaysSupported)));
367 map.insert(InternalFormatInfoPair(GL_SRGB8_ALPHA8, RGBAFormat( 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireESOrExt<3, &Extensions::sRGB>, RequireESOrExt<3, &Extensions::sRGB>, AlwaysSupported)));
368 map.insert(InternalFormatInfoPair(GL_R11F_G11F_B10F, RGBAFormat(11, 11, 10, 0, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT, false, RequireES<3>, RequireExt<&Extensions::colorBufferFloat>, AlwaysSupported)));
369 map.insert(InternalFormatInfoPair(GL_RGB9_E5, RGBAFormat( 9, 9, 9, 0, 5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_FLOAT, false, RequireES<3>, NeverSupported, AlwaysSupported)));
370 map.insert(InternalFormatInfoPair(GL_R8I, RGBAFormat( 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
371 map.insert(InternalFormatInfoPair(GL_R8UI, RGBAFormat( 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
372 map.insert(InternalFormatInfoPair(GL_R16I, RGBAFormat(16, 0, 0, 0, 0, GL_RED_INTEGER, GL_SHORT, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
373 map.insert(InternalFormatInfoPair(GL_R16UI, RGBAFormat(16, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
374 map.insert(InternalFormatInfoPair(GL_R32I, RGBAFormat(32, 0, 0, 0, 0, GL_RED_INTEGER, GL_INT, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
375 map.insert(InternalFormatInfoPair(GL_R32UI, RGBAFormat(32, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
376 map.insert(InternalFormatInfoPair(GL_RG8I, RGBAFormat( 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_BYTE, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
377 map.insert(InternalFormatInfoPair(GL_RG8UI, RGBAFormat( 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
378 map.insert(InternalFormatInfoPair(GL_RG16I, RGBAFormat(16, 16, 0, 0, 0, GL_RG_INTEGER, GL_SHORT, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
379 map.insert(InternalFormatInfoPair(GL_RG16UI, RGBAFormat(16, 16, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
380 map.insert(InternalFormatInfoPair(GL_RG32I, RGBAFormat(32, 32, 0, 0, 0, GL_RG_INTEGER, GL_INT, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
381 map.insert(InternalFormatInfoPair(GL_RG32UI, RGBAFormat(32, 32, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
382 map.insert(InternalFormatInfoPair(GL_RGB8I, RGBAFormat( 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_BYTE, GL_INT, false, RequireES<3>, NeverSupported, NeverSupported)));
383 map.insert(InternalFormatInfoPair(GL_RGB8UI, RGBAFormat( 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3>, NeverSupported, NeverSupported)));
384 map.insert(InternalFormatInfoPair(GL_RGB16I, RGBAFormat(16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_SHORT, GL_INT, false, RequireES<3>, NeverSupported, NeverSupported)));
385 map.insert(InternalFormatInfoPair(GL_RGB16UI, RGBAFormat(16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3>, NeverSupported, NeverSupported)));
386 map.insert(InternalFormatInfoPair(GL_RGB32I, RGBAFormat(32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_INT, GL_INT, false, RequireES<3>, NeverSupported, NeverSupported)));
387 map.insert(InternalFormatInfoPair(GL_RGB32UI, RGBAFormat(32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3>, NeverSupported, NeverSupported)));
388 map.insert(InternalFormatInfoPair(GL_RGBA8I, RGBAFormat( 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_BYTE, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
389 map.insert(InternalFormatInfoPair(GL_RGBA8UI, RGBAFormat( 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
390 map.insert(InternalFormatInfoPair(GL_RGBA16I, RGBAFormat(16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_SHORT, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
391 map.insert(InternalFormatInfoPair(GL_RGBA16UI, RGBAFormat(16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
392 map.insert(InternalFormatInfoPair(GL_RGBA32I, RGBAFormat(32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, GL_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
393 map.insert(InternalFormatInfoPair(GL_RGBA32UI, RGBAFormat(32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3>, RequireES<3>, NeverSupported)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000394
Geoff Langabce7622014-09-19 16:13:00 -0400395 map.insert(InternalFormatInfoPair(GL_BGRA8_EXT, RGBAFormat( 8, 8, 8, 8, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported)));
396 map.insert(InternalFormatInfoPair(GL_BGRA4_ANGLEX, RGBAFormat( 4, 4, 4, 4, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported)));
397 map.insert(InternalFormatInfoPair(GL_BGR5_A1_ANGLEX, RGBAFormat( 5, 5, 5, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000398
399 // Floating point renderability and filtering is provided by OES_texture_float and OES_texture_half_float
Geoff Langabce7622014-09-19 16:13:00 -0400400 // | Internal format | | D |S | Format | Type | Comp | SRGB | Texture supported | Renderable | Filterable |
401 // | | | | | | | type | | | | |
402 map.insert(InternalFormatInfoPair(GL_R16F, RGBAFormat(16, 0, 0, 0, 0, GL_RED, GL_HALF_FLOAT, GL_FLOAT, false, RequireESOrExtAndExt<3, &Extensions::textureHalfFloat, &Extensions::textureRG>, RequireESOrExtAndExt<3, &Extensions::textureHalfFloat, &Extensions::textureRG>, RequireExt<&Extensions::textureHalfFloatLinear>)));
403 map.insert(InternalFormatInfoPair(GL_RG16F, RGBAFormat(16, 16, 0, 0, 0, GL_RG, GL_HALF_FLOAT, GL_FLOAT, false, RequireESOrExtAndExt<3, &Extensions::textureHalfFloat, &Extensions::textureRG>, RequireESOrExtAndExt<3, &Extensions::textureHalfFloat, &Extensions::textureRG>, RequireExt<&Extensions::textureHalfFloatLinear>)));
404 map.insert(InternalFormatInfoPair(GL_RGB16F, RGBAFormat(16, 16, 16, 0, 0, GL_RGB, GL_HALF_FLOAT, GL_FLOAT, false, RequireESOrExt<3, &Extensions::textureHalfFloat>, RequireESOrExt<3, &Extensions::textureHalfFloat>, RequireExt<&Extensions::textureHalfFloatLinear>)));
405 map.insert(InternalFormatInfoPair(GL_RGBA16F, RGBAFormat(16, 16, 16, 16, 0, GL_RGBA, GL_HALF_FLOAT, GL_FLOAT, false, RequireESOrExt<3, &Extensions::textureHalfFloat>, RequireESOrExt<3, &Extensions::textureHalfFloat>, RequireExt<&Extensions::textureHalfFloatLinear>)));
406 map.insert(InternalFormatInfoPair(GL_R32F, RGBAFormat(32, 0, 0, 0, 0, GL_RED, GL_FLOAT, GL_FLOAT, false, RequireESOrExtAndExt<3, &Extensions::textureFloat, &Extensions::textureRG>, RequireESOrExtAndExt<3, &Extensions::textureFloat, &Extensions::textureRG>, RequireExt<&Extensions::textureFloatLinear> )));
407 map.insert(InternalFormatInfoPair(GL_RG32F, RGBAFormat(32, 32, 0, 0, 0, GL_RG, GL_FLOAT, GL_FLOAT, false, RequireESOrExtAndExt<3, &Extensions::textureFloat, &Extensions::textureRG>, RequireESOrExtAndExt<3, &Extensions::textureFloat, &Extensions::textureRG>, RequireExt<&Extensions::textureFloatLinear> )));
408 map.insert(InternalFormatInfoPair(GL_RGB32F, RGBAFormat(32, 32, 32, 0, 0, GL_RGB, GL_FLOAT, GL_FLOAT, false, RequireESOrExt<3, &Extensions::textureFloat>, RequireESOrExt<3, &Extensions::textureFloat>, RequireExt<&Extensions::textureFloatLinear> )));
409 map.insert(InternalFormatInfoPair(GL_RGBA32F, RGBAFormat(32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, GL_FLOAT, false, RequireESOrExt<3, &Extensions::textureFloat>, RequireESOrExt<3, &Extensions::textureFloat>, RequireExt<&Extensions::textureFloatLinear> )));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000410
411 // Depth stencil formats
Geoff Langabce7622014-09-19 16:13:00 -0400412 // | Internal format | | D |S | X | Format | Type | Component type | Supported | Renderable | Filterable |
413 map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT16, DepthStencilFormat(16, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, RequireES<2>, RequireES<2>, RequireESOrExt<3, &Extensions::depthTextures>)));
414 map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT24, DepthStencilFormat(24, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireES<3>, RequireES<3>, RequireESOrExt<3, &Extensions::depthTextures>)));
415 map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT32F, DepthStencilFormat(32, 0, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_FLOAT, RequireES<3>, RequireES<3>, RequireESOrExt<3, &Extensions::depthTextures>)));
416 map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT32_OES, DepthStencilFormat(32, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::depthTextures>, RequireExt<&Extensions::depthTextures>, AlwaysSupported )));
417 map.insert(InternalFormatInfoPair(GL_DEPTH24_STENCIL8, DepthStencilFormat(24, 8, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_NORMALIZED, RequireESOrExt<3, &Extensions::depthTextures>, RequireESOrExtOrExt<3, &Extensions::depthTextures, &Extensions::packedDepthStencil>, AlwaysSupported )));
418 map.insert(InternalFormatInfoPair(GL_DEPTH32F_STENCIL8, DepthStencilFormat(32, 8, 24, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT, RequireES<3>, RequireES<3>, AlwaysSupported )));
Corentin Walleze0902642014-11-04 12:32:15 -0800419 // STENCIL_INDEX8 is special-cased, see around the bottom of the list.
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000420
421 // Luminance alpha formats
Geoff Lang5d601382014-07-22 15:14:06 -0400422 // | Internal format | | L | A | Format | Type | Component type | Supported | Renderable | Filterable |
Geoff Langabce7622014-09-19 16:13:00 -0400423 map.insert(InternalFormatInfoPair(GL_ALPHA8_EXT, LUMAFormat( 0, 8, GL_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported)));
424 map.insert(InternalFormatInfoPair(GL_LUMINANCE8_EXT, LUMAFormat( 8, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported)));
425 map.insert(InternalFormatInfoPair(GL_ALPHA32F_EXT, LUMAFormat( 0, 32, GL_ALPHA, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, AlwaysSupported)));
426 map.insert(InternalFormatInfoPair(GL_LUMINANCE32F_EXT, LUMAFormat(32, 0, GL_LUMINANCE, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, AlwaysSupported)));
427 map.insert(InternalFormatInfoPair(GL_ALPHA16F_EXT, LUMAFormat( 0, 16, GL_ALPHA, GL_HALF_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, AlwaysSupported)));
428 map.insert(InternalFormatInfoPair(GL_LUMINANCE16F_EXT, LUMAFormat(16, 0, GL_LUMINANCE, GL_HALF_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, AlwaysSupported)));
429 map.insert(InternalFormatInfoPair(GL_LUMINANCE8_ALPHA8_EXT, LUMAFormat( 8, 8, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported)));
430 map.insert(InternalFormatInfoPair(GL_LUMINANCE_ALPHA32F_EXT, LUMAFormat(32, 32, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, AlwaysSupported)));
431 map.insert(InternalFormatInfoPair(GL_LUMINANCE_ALPHA16F_EXT, LUMAFormat(16, 16, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, AlwaysSupported)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000432
433 // Unsized formats
Geoff Langabce7622014-09-19 16:13:00 -0400434 // | Internal format | | Format | Supported | Renderable | Filterable |
435 map.insert(InternalFormatInfoPair(GL_ALPHA, UnsizedFormat(GL_ALPHA, RequireES<2>, NeverSupported, AlwaysSupported)));
436 map.insert(InternalFormatInfoPair(GL_LUMINANCE, UnsizedFormat(GL_LUMINANCE, RequireES<2>, NeverSupported, AlwaysSupported)));
437 map.insert(InternalFormatInfoPair(GL_LUMINANCE_ALPHA, UnsizedFormat(GL_LUMINANCE_ALPHA, RequireES<2>, NeverSupported, AlwaysSupported)));
438 map.insert(InternalFormatInfoPair(GL_RED, UnsizedFormat(GL_RED, RequireESOrExt<3, &Extensions::textureRG>, NeverSupported, AlwaysSupported)));
439 map.insert(InternalFormatInfoPair(GL_RG, UnsizedFormat(GL_RG, RequireESOrExt<3, &Extensions::textureRG>, NeverSupported, AlwaysSupported)));
440 map.insert(InternalFormatInfoPair(GL_RGB, UnsizedFormat(GL_RGB, RequireES<2>, RequireES<2>, AlwaysSupported)));
441 map.insert(InternalFormatInfoPair(GL_RGBA, UnsizedFormat(GL_RGBA, RequireES<2>, RequireES<2>, AlwaysSupported)));
442 map.insert(InternalFormatInfoPair(GL_RED_INTEGER, UnsizedFormat(GL_RED_INTEGER, RequireES<3>, NeverSupported, NeverSupported )));
443 map.insert(InternalFormatInfoPair(GL_RG_INTEGER, UnsizedFormat(GL_RG_INTEGER, RequireES<3>, NeverSupported, NeverSupported )));
444 map.insert(InternalFormatInfoPair(GL_RGB_INTEGER, UnsizedFormat(GL_RGB_INTEGER, RequireES<3>, NeverSupported, NeverSupported )));
445 map.insert(InternalFormatInfoPair(GL_RGBA_INTEGER, UnsizedFormat(GL_RGBA_INTEGER, RequireES<3>, NeverSupported, NeverSupported )));
446 map.insert(InternalFormatInfoPair(GL_BGRA_EXT, UnsizedFormat(GL_BGRA_EXT, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported)));
447 map.insert(InternalFormatInfoPair(GL_DEPTH_COMPONENT, UnsizedFormat(GL_DEPTH_COMPONENT, RequireES<2>, RequireES<2>, AlwaysSupported)));
448 map.insert(InternalFormatInfoPair(GL_DEPTH_STENCIL, UnsizedFormat(GL_DEPTH_STENCIL, RequireESOrExt<3, &Extensions::packedDepthStencil>, RequireESOrExt<3, &Extensions::packedDepthStencil>, AlwaysSupported)));
449 map.insert(InternalFormatInfoPair(GL_SRGB_EXT, UnsizedFormat(GL_RGB, RequireESOrExt<3, &Extensions::sRGB>, NeverSupported, AlwaysSupported)));
450 map.insert(InternalFormatInfoPair(GL_SRGB_ALPHA_EXT, UnsizedFormat(GL_RGBA, RequireESOrExt<3, &Extensions::sRGB>, RequireESOrExt<3, &Extensions::sRGB>, AlwaysSupported)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000451
452 // Compressed formats, From ES 3.0.1 spec, table 3.16
Geoff Lang5d601382014-07-22 15:14:06 -0400453 // | Internal format | |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
454 map.insert(InternalFormatInfoPair(GL_COMPRESSED_R11_EAC, CompressedFormat(4, 4, 64, 1, GL_COMPRESSED_R11_EAC, GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
455 map.insert(InternalFormatInfoPair(GL_COMPRESSED_SIGNED_R11_EAC, CompressedFormat(4, 4, 64, 1, GL_COMPRESSED_SIGNED_R11_EAC, GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
456 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RG11_EAC, CompressedFormat(4, 4, 128, 2, GL_COMPRESSED_RG11_EAC, GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
457 map.insert(InternalFormatInfoPair(GL_COMPRESSED_SIGNED_RG11_EAC, CompressedFormat(4, 4, 128, 2, GL_COMPRESSED_SIGNED_RG11_EAC, GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
458 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB8_ETC2, CompressedFormat(4, 4, 64, 3, GL_COMPRESSED_RGB8_ETC2, GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
459 map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ETC2, CompressedFormat(4, 4, 64, 3, GL_COMPRESSED_SRGB8_ETC2, GL_UNSIGNED_BYTE, true, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
460 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, CompressedFormat(4, 4, 64, 3, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
461 map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, CompressedFormat(4, 4, 64, 3, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_UNSIGNED_BYTE, true, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
462 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA8_ETC2_EAC, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA8_ETC2_EAC, GL_UNSIGNED_BYTE, false, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
463 map.insert(InternalFormatInfoPair(GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, GL_UNSIGNED_BYTE, true, UnimplementedSupport, UnimplementedSupport, UnimplementedSupport)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000464
465 // From GL_EXT_texture_compression_dxt1
Geoff Langabce7622014-09-19 16:13:00 -0400466 // | Internal format | |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
467 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGB_S3TC_DXT1_EXT, CompressedFormat(4, 4, 64, 3, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, NeverSupported, AlwaysSupported)));
468 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, CompressedFormat(4, 4, 64, 4, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, NeverSupported, AlwaysSupported)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000469
470 // From GL_ANGLE_texture_compression_dxt3
Geoff Langabce7622014-09-19 16:13:00 -0400471 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT5>, NeverSupported, AlwaysSupported)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000472
473 // From GL_ANGLE_texture_compression_dxt5
Geoff Langabce7622014-09-19 16:13:00 -0400474 map.insert(InternalFormatInfoPair(GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, CompressedFormat(4, 4, 128, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT5>, NeverSupported, AlwaysSupported)));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000475
Corentin Walleze0902642014-11-04 12:32:15 -0800476 // For STENCIL_INDEX8 we chose a normalized component type for the following reasons:
477 // - Multisampled buffer are disallowed for non-normalized integer component types and we want to support it for STENCIL_INDEX8
478 // - All other stencil formats (all depth-stencil) are either float or normalized
479 // - It affects only validation of internalformat in RenderbufferStorageMultisample.
480 // | Internal format | |D |S |X | Format | Type | Component type | Supported | Renderable | Filterable |
481 map.insert(InternalFormatInfoPair(GL_STENCIL_INDEX8, DepthStencilFormat(0, 8, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2>, RequireES<2>, NeverSupported)));
482
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000483 return map;
484}
485
Geoff Lange4a492b2014-06-19 14:14:41 -0400486static const InternalFormatInfoMap &GetInternalFormatMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000487{
Geoff Lange4a492b2014-06-19 14:14:41 -0400488 static const InternalFormatInfoMap formatMap = BuildInternalFormatInfoMap();
489 return formatMap;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000490}
491
Geoff Lange4a492b2014-06-19 14:14:41 -0400492static FormatSet BuildAllSizedInternalFormatSet()
Geoff Langcec35902014-04-16 10:52:36 -0400493{
494 FormatSet result;
495
Geoff Lange4a492b2014-06-19 14:14:41 -0400496 const InternalFormatInfoMap &formats = GetInternalFormatMap();
Geoff Langcec35902014-04-16 10:52:36 -0400497 for (InternalFormatInfoMap::const_iterator i = formats.begin(); i != formats.end(); i++)
498 {
Geoff Lang5d601382014-07-22 15:14:06 -0400499 if (i->second.pixelBytes > 0)
Geoff Langcec35902014-04-16 10:52:36 -0400500 {
501 result.insert(i->first);
502 }
503 }
504
505 return result;
506}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000507
Geoff Lang5d601382014-07-22 15:14:06 -0400508const Type &GetTypeInfo(GLenum type)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000509{
Olli Etuaho31f8f4f2015-03-25 16:03:57 +0200510 switch (type)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000511 {
Olli Etuaho31f8f4f2015-03-25 16:03:57 +0200512 case GL_UNSIGNED_BYTE:
513 case GL_BYTE:
514 {
515 static const Type info = GenTypeInfo(1, false);
516 return info;
517 }
518 case GL_UNSIGNED_SHORT:
519 case GL_SHORT:
520 case GL_HALF_FLOAT:
521 case GL_HALF_FLOAT_OES:
522 {
523 static const Type info = GenTypeInfo(2, false);
524 return info;
525 }
526 case GL_UNSIGNED_INT:
527 case GL_INT:
528 case GL_FLOAT:
529 {
530 static const Type info = GenTypeInfo(4, false);
531 return info;
532 }
533 case GL_UNSIGNED_SHORT_5_6_5:
534 case GL_UNSIGNED_SHORT_4_4_4_4:
535 case GL_UNSIGNED_SHORT_5_5_5_1:
536 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
537 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
538 {
539 static const Type info = GenTypeInfo(2, true);
540 return info;
541 }
542 case GL_UNSIGNED_INT_2_10_10_10_REV:
543 case GL_UNSIGNED_INT_24_8:
544 case GL_UNSIGNED_INT_10F_11F_11F_REV:
545 case GL_UNSIGNED_INT_5_9_9_9_REV:
546 {
547 ASSERT(GL_UNSIGNED_INT_24_8_OES == GL_UNSIGNED_INT_24_8);
548 static const Type info = GenTypeInfo(4, true);
549 return info;
550 }
551 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
552 {
553 static const Type info = GenTypeInfo(8, true);
554 return info;
555 }
556 default:
557 {
558 static const Type defaultInfo;
559 return defaultInfo;
560 }
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000561 }
562}
563
Geoff Lang5d601382014-07-22 15:14:06 -0400564const InternalFormat &GetInternalFormatInfo(GLenum internalFormat)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000565{
Geoff Lang5d601382014-07-22 15:14:06 -0400566 const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
567 InternalFormatInfoMap::const_iterator iter = formatMap.find(internalFormat);
568 if (iter != formatMap.end())
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000569 {
Geoff Lang5d601382014-07-22 15:14:06 -0400570 return iter->second;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000571 }
572 else
573 {
Geoff Lang5d601382014-07-22 15:14:06 -0400574 static const InternalFormat defaultInternalFormat;
575 return defaultInternalFormat;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000576 }
577}
578
Minmin Gongb8aee3b2015-01-27 14:42:36 -0800579GLuint InternalFormat::computeRowPitch(GLenum formatType, GLsizei width, GLint alignment, GLint rowLength) const
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000580{
581 ASSERT(alignment > 0 && isPow2(alignment));
Minmin Gongb8aee3b2015-01-27 14:42:36 -0800582 GLuint rowBytes;
583 if (rowLength > 0)
584 {
585 ASSERT(!compressed);
586 rowBytes = pixelBytes * rowLength;
587 }
588 else
589 {
590 rowBytes = computeBlockSize(formatType, width, 1);
591 }
592 return rx::roundUp(rowBytes, static_cast<GLuint>(alignment));
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000593}
594
Minmin Gongb8aee3b2015-01-27 14:42:36 -0800595GLuint InternalFormat::computeDepthPitch(GLenum formatType, GLsizei width, GLsizei height, GLint alignment, GLint rowLength) const
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000596{
Minmin Gongb8aee3b2015-01-27 14:42:36 -0800597 return computeRowPitch(formatType, width, alignment, rowLength) * height;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000598}
599
Austin Kinross3ae64652015-01-26 15:51:39 -0800600GLuint InternalFormat::computeBlockSize(GLenum formatType, GLsizei width, GLsizei height) const
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000601{
Geoff Lang5d601382014-07-22 15:14:06 -0400602 if (compressed)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000603 {
Geoff Lang5d601382014-07-22 15:14:06 -0400604 GLsizei numBlocksWide = (width + compressedBlockWidth - 1) / compressedBlockWidth;
605 GLsizei numBlocksHight = (height + compressedBlockHeight - 1) / compressedBlockHeight;
606 return (pixelBytes * numBlocksWide * numBlocksHight);
607 }
608 else
609 {
Austin Kinross3ae64652015-01-26 15:51:39 -0800610 const Type &typeInfo = GetTypeInfo(formatType);
Geoff Lang5d601382014-07-22 15:14:06 -0400611 if (typeInfo.specialInterpretation)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000612 {
Geoff Lang5d601382014-07-22 15:14:06 -0400613 return typeInfo.bytes * width * height;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000614 }
615 else
616 {
Geoff Lang5d601382014-07-22 15:14:06 -0400617 return componentCount * typeInfo.bytes * width * height;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000618 }
619 }
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000620}
621
Geoff Lang5d601382014-07-22 15:14:06 -0400622GLenum GetSizedInternalFormat(GLenum internalFormat, GLenum type)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000623{
Geoff Lang5d601382014-07-22 15:14:06 -0400624 const InternalFormat& formatInfo = GetInternalFormatInfo(internalFormat);
Geoff Lang051dbc72015-01-05 15:48:58 -0500625 if (formatInfo.pixelBytes > 0)
626 {
627 return internalFormat;
628 }
629 else
630 {
631 static const FormatMap formatMap = BuildFormatMap();
632 FormatMap::const_iterator iter = formatMap.find(FormatTypePair(internalFormat, type));
633 if (iter != formatMap.end())
634 {
635 return iter->second;
636 }
637 else
638 {
639 return GL_NONE;
640 }
641 }
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000642}
643
Geoff Lange4a492b2014-06-19 14:14:41 -0400644const FormatSet &GetAllSizedInternalFormats()
Geoff Langcec35902014-04-16 10:52:36 -0400645{
Geoff Lange4a492b2014-06-19 14:14:41 -0400646 static FormatSet formatSet = BuildAllSizedInternalFormatSet();
Geoff Langcec35902014-04-16 10:52:36 -0400647 return formatSet;
648}
649
Jamie Madilld3dfda22015-07-06 08:28:49 -0400650VertexFormatType GetVertexFormatType(GLenum type, GLboolean normalized, GLuint components, bool pureInteger)
651{
652 switch (type)
653 {
654 case GL_BYTE:
655 switch (components)
656 {
657 case 1:
658 if (pureInteger)
659 return VERTEX_FORMAT_SBYTE1_INT;
660 if (normalized)
661 return VERTEX_FORMAT_SBYTE1_NORM;
662 return VERTEX_FORMAT_SBYTE1;
663 case 2:
664 if (pureInteger)
665 return VERTEX_FORMAT_SBYTE2_INT;
666 if (normalized)
667 return VERTEX_FORMAT_SBYTE2_NORM;
668 return VERTEX_FORMAT_SBYTE2;
669 case 3:
670 if (pureInteger)
671 return VERTEX_FORMAT_SBYTE3_INT;
672 if (normalized)
673 return VERTEX_FORMAT_SBYTE3_NORM;
674 return VERTEX_FORMAT_SBYTE3;
675 case 4:
676 if (pureInteger)
677 return VERTEX_FORMAT_SBYTE4_INT;
678 if (normalized)
679 return VERTEX_FORMAT_SBYTE4_NORM;
680 return VERTEX_FORMAT_SBYTE4;
681 default:
682 UNREACHABLE();
683 break;
684 }
685 case GL_UNSIGNED_BYTE:
686 switch (components)
687 {
688 case 1:
689 if (pureInteger)
690 return VERTEX_FORMAT_UBYTE1_INT;
691 if (normalized)
692 return VERTEX_FORMAT_UBYTE1_NORM;
693 return VERTEX_FORMAT_UBYTE1;
694 case 2:
695 if (pureInteger)
696 return VERTEX_FORMAT_UBYTE2_INT;
697 if (normalized)
698 return VERTEX_FORMAT_UBYTE2_NORM;
699 return VERTEX_FORMAT_UBYTE2;
700 case 3:
701 if (pureInteger)
702 return VERTEX_FORMAT_UBYTE3_INT;
703 if (normalized)
704 return VERTEX_FORMAT_UBYTE3_NORM;
705 return VERTEX_FORMAT_UBYTE3;
706 case 4:
707 if (pureInteger)
708 return VERTEX_FORMAT_UBYTE4_INT;
709 if (normalized)
710 return VERTEX_FORMAT_UBYTE4_NORM;
711 return VERTEX_FORMAT_UBYTE4;
712 default:
713 UNREACHABLE();
714 break;
715 }
716 case GL_SHORT:
717 switch (components)
718 {
719 case 1:
720 if (pureInteger)
721 return VERTEX_FORMAT_SSHORT1_INT;
722 if (normalized)
723 return VERTEX_FORMAT_SSHORT1_NORM;
724 return VERTEX_FORMAT_SSHORT1;
725 case 2:
726 if (pureInteger)
727 return VERTEX_FORMAT_SSHORT2_INT;
728 if (normalized)
729 return VERTEX_FORMAT_SSHORT2_NORM;
730 return VERTEX_FORMAT_SSHORT2;
731 case 3:
732 if (pureInteger)
733 return VERTEX_FORMAT_SSHORT3_INT;
734 if (normalized)
735 return VERTEX_FORMAT_SSHORT3_NORM;
736 return VERTEX_FORMAT_SSHORT3;
737 case 4:
738 if (pureInteger)
739 return VERTEX_FORMAT_SSHORT4_INT;
740 if (normalized)
741 return VERTEX_FORMAT_SSHORT4_NORM;
742 return VERTEX_FORMAT_SSHORT4;
743 default:
744 UNREACHABLE();
745 break;
746 }
747 case GL_UNSIGNED_SHORT:
748 switch (components)
749 {
750 case 1:
751 if (pureInteger)
752 return VERTEX_FORMAT_USHORT1_INT;
753 if (normalized)
754 return VERTEX_FORMAT_USHORT1_NORM;
755 return VERTEX_FORMAT_USHORT1;
756 case 2:
757 if (pureInteger)
758 return VERTEX_FORMAT_USHORT2_INT;
759 if (normalized)
760 return VERTEX_FORMAT_USHORT2_NORM;
761 return VERTEX_FORMAT_USHORT2;
762 case 3:
763 if (pureInteger)
764 return VERTEX_FORMAT_USHORT3_INT;
765 if (normalized)
766 return VERTEX_FORMAT_USHORT3_NORM;
767 return VERTEX_FORMAT_USHORT3;
768 case 4:
769 if (pureInteger)
770 return VERTEX_FORMAT_USHORT4_INT;
771 if (normalized)
772 return VERTEX_FORMAT_USHORT4_NORM;
773 return VERTEX_FORMAT_USHORT4;
774 default:
775 UNREACHABLE();
776 break;
777 }
778 case GL_INT:
779 switch (components)
780 {
781 case 1:
782 if (pureInteger)
783 return VERTEX_FORMAT_SINT1_INT;
784 if (normalized)
785 return VERTEX_FORMAT_SINT1_NORM;
786 return VERTEX_FORMAT_SINT1;
787 case 2:
788 if (pureInteger)
789 return VERTEX_FORMAT_SINT2_INT;
790 if (normalized)
791 return VERTEX_FORMAT_SINT2_NORM;
792 return VERTEX_FORMAT_SINT2;
793 case 3:
794 if (pureInteger)
795 return VERTEX_FORMAT_SINT3_INT;
796 if (normalized)
797 return VERTEX_FORMAT_SINT3_NORM;
798 return VERTEX_FORMAT_SINT3;
799 case 4:
800 if (pureInteger)
801 return VERTEX_FORMAT_SINT4_INT;
802 if (normalized)
803 return VERTEX_FORMAT_SINT4_NORM;
804 return VERTEX_FORMAT_SINT4;
805 default:
806 UNREACHABLE();
807 break;
808 }
809 case GL_UNSIGNED_INT:
810 switch (components)
811 {
812 case 1:
813 if (pureInteger)
814 return VERTEX_FORMAT_UINT1_INT;
815 if (normalized)
816 return VERTEX_FORMAT_UINT1_NORM;
817 return VERTEX_FORMAT_UINT1;
818 case 2:
819 if (pureInteger)
820 return VERTEX_FORMAT_UINT2_INT;
821 if (normalized)
822 return VERTEX_FORMAT_UINT2_NORM;
823 return VERTEX_FORMAT_UINT2;
824 case 3:
825 if (pureInteger)
826 return VERTEX_FORMAT_UINT3_INT;
827 if (normalized)
828 return VERTEX_FORMAT_UINT3_NORM;
829 return VERTEX_FORMAT_UINT3;
830 case 4:
831 if (pureInteger)
832 return VERTEX_FORMAT_UINT4_INT;
833 if (normalized)
834 return VERTEX_FORMAT_UINT4_NORM;
835 return VERTEX_FORMAT_UINT4;
836 default:
837 UNREACHABLE();
838 break;
839 }
840 case GL_FLOAT:
841 switch (components)
842 {
843 case 1:
844 return VERTEX_FORMAT_FLOAT1;
845 case 2:
846 return VERTEX_FORMAT_FLOAT2;
847 case 3:
848 return VERTEX_FORMAT_FLOAT3;
849 case 4:
850 return VERTEX_FORMAT_FLOAT4;
851 default:
852 UNREACHABLE();
853 break;
854 }
855 case GL_HALF_FLOAT:
856 switch (components)
857 {
858 case 1:
859 return VERTEX_FORMAT_HALF1;
860 case 2:
861 return VERTEX_FORMAT_HALF2;
862 case 3:
863 return VERTEX_FORMAT_HALF3;
864 case 4:
865 return VERTEX_FORMAT_HALF4;
866 default:
867 UNREACHABLE();
868 break;
869 }
870 case GL_FIXED:
871 switch (components)
872 {
873 case 1:
874 return VERTEX_FORMAT_FIXED1;
875 case 2:
876 return VERTEX_FORMAT_FIXED2;
877 case 3:
878 return VERTEX_FORMAT_FIXED3;
879 case 4:
880 return VERTEX_FORMAT_FIXED4;
881 default:
882 UNREACHABLE();
883 break;
884 }
885 case GL_INT_2_10_10_10_REV:
886 if (pureInteger)
887 return VERTEX_FORMAT_SINT210_INT;
888 if (normalized)
889 return VERTEX_FORMAT_SINT210_NORM;
890 return VERTEX_FORMAT_SINT210;
891 case GL_UNSIGNED_INT_2_10_10_10_REV:
892 if (pureInteger)
893 return VERTEX_FORMAT_UINT210_INT;
894 if (normalized)
895 return VERTEX_FORMAT_UINT210_NORM;
896 return VERTEX_FORMAT_UINT210;
897 default:
898 UNREACHABLE();
899 break;
900 }
901 return VERTEX_FORMAT_UBYTE1;
902}
903
904VertexFormatType GetVertexFormatType(const VertexAttribute &attrib)
905{
906 return GetVertexFormatType(attrib.type, attrib.normalized, attrib.size, attrib.pureInteger);
907}
908
909VertexFormatType GetVertexFormatType(const VertexAttribute &attrib, GLenum currentValueType)
910{
911 if (!attrib.enabled)
912 {
913 return GetVertexFormatType(currentValueType, GL_FALSE, 4, (currentValueType != GL_FLOAT));
914 }
915 return GetVertexFormatType(attrib);
916}
917
918const VertexFormat &GetVertexFormatFromType(VertexFormatType vertexFormatType)
919{
920 switch (vertexFormatType)
921 {
922 case VERTEX_FORMAT_SBYTE1:
923 {
924 static const VertexFormat format(GL_BYTE, GL_FALSE, 1, false);
925 return format;
926 }
927 case VERTEX_FORMAT_SBYTE1_NORM:
928 {
929 static const VertexFormat format(GL_BYTE, GL_TRUE, 1, false);
930 return format;
931 }
932 case VERTEX_FORMAT_SBYTE2:
933 {
934 static const VertexFormat format(GL_BYTE, GL_FALSE, 2, false);
935 return format;
936 }
937 case VERTEX_FORMAT_SBYTE2_NORM:
938 {
939 static const VertexFormat format(GL_BYTE, GL_TRUE, 2, false);
940 return format;
941 }
942 case VERTEX_FORMAT_SBYTE3:
943 {
944 static const VertexFormat format(GL_BYTE, GL_FALSE, 3, false);
945 return format;
946 }
947 case VERTEX_FORMAT_SBYTE3_NORM:
948 {
949 static const VertexFormat format(GL_BYTE, GL_TRUE, 3, false);
950 return format;
951 }
952 case VERTEX_FORMAT_SBYTE4:
953 {
954 static const VertexFormat format(GL_BYTE, GL_FALSE, 4, false);
955 return format;
956 }
957 case VERTEX_FORMAT_SBYTE4_NORM:
958 {
959 static const VertexFormat format(GL_BYTE, GL_TRUE, 4, false);
960 return format;
961 }
962 case VERTEX_FORMAT_UBYTE1:
963 {
964 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, false);
965 return format;
966 }
967 case VERTEX_FORMAT_UBYTE1_NORM:
968 {
969 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 1, false);
970 return format;
971 }
972 case VERTEX_FORMAT_UBYTE2:
973 {
974 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, false);
975 return format;
976 }
977 case VERTEX_FORMAT_UBYTE2_NORM:
978 {
979 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 2, false);
980 return format;
981 }
982 case VERTEX_FORMAT_UBYTE3:
983 {
984 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, false);
985 return format;
986 }
987 case VERTEX_FORMAT_UBYTE3_NORM:
988 {
989 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 3, false);
990 return format;
991 }
992 case VERTEX_FORMAT_UBYTE4:
993 {
994 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, false);
995 return format;
996 }
997 case VERTEX_FORMAT_UBYTE4_NORM:
998 {
999 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 4, false);
1000 return format;
1001 }
1002 case VERTEX_FORMAT_SSHORT1:
1003 {
1004 static const VertexFormat format(GL_SHORT, GL_FALSE, 1, false);
1005 return format;
1006 }
1007 case VERTEX_FORMAT_SSHORT1_NORM:
1008 {
1009 static const VertexFormat format(GL_SHORT, GL_TRUE, 1, false);
1010 return format;
1011 }
1012 case VERTEX_FORMAT_SSHORT2:
1013 {
1014 static const VertexFormat format(GL_SHORT, GL_FALSE, 2, false);
1015 return format;
1016 }
1017 case VERTEX_FORMAT_SSHORT2_NORM:
1018 {
1019 static const VertexFormat format(GL_SHORT, GL_TRUE, 2, false);
1020 return format;
1021 }
1022 case VERTEX_FORMAT_SSHORT3:
1023 {
1024 static const VertexFormat format(GL_SHORT, GL_FALSE, 3, false);
1025 return format;
1026 }
1027 case VERTEX_FORMAT_SSHORT3_NORM:
1028 {
1029 static const VertexFormat format(GL_SHORT, GL_TRUE, 3, false);
1030 return format;
1031 }
1032 case VERTEX_FORMAT_SSHORT4:
1033 {
1034 static const VertexFormat format(GL_SHORT, GL_FALSE, 4, false);
1035 return format;
1036 }
1037 case VERTEX_FORMAT_SSHORT4_NORM:
1038 {
1039 static const VertexFormat format(GL_SHORT, GL_TRUE, 4, false);
1040 return format;
1041 }
1042 case VERTEX_FORMAT_USHORT1:
1043 {
1044 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, false);
1045 return format;
1046 }
1047 case VERTEX_FORMAT_USHORT1_NORM:
1048 {
1049 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 1, false);
1050 return format;
1051 }
1052 case VERTEX_FORMAT_USHORT2:
1053 {
1054 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, false);
1055 return format;
1056 }
1057 case VERTEX_FORMAT_USHORT2_NORM:
1058 {
1059 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 2, false);
1060 return format;
1061 }
1062 case VERTEX_FORMAT_USHORT3:
1063 {
1064 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, false);
1065 return format;
1066 }
1067 case VERTEX_FORMAT_USHORT3_NORM:
1068 {
1069 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 3, false);
1070 return format;
1071 }
1072 case VERTEX_FORMAT_USHORT4:
1073 {
1074 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, false);
1075 return format;
1076 }
1077 case VERTEX_FORMAT_USHORT4_NORM:
1078 {
1079 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 4, false);
1080 return format;
1081 }
1082 case VERTEX_FORMAT_SINT1:
1083 {
1084 static const VertexFormat format(GL_INT, GL_FALSE, 1, false);
1085 return format;
1086 }
1087 case VERTEX_FORMAT_SINT1_NORM:
1088 {
1089 static const VertexFormat format(GL_INT, GL_TRUE, 1, false);
1090 return format;
1091 }
1092 case VERTEX_FORMAT_SINT2:
1093 {
1094 static const VertexFormat format(GL_INT, GL_FALSE, 2, false);
1095 return format;
1096 }
1097 case VERTEX_FORMAT_SINT2_NORM:
1098 {
1099 static const VertexFormat format(GL_INT, GL_TRUE, 2, false);
1100 return format;
1101 }
1102 case VERTEX_FORMAT_SINT3:
1103 {
1104 static const VertexFormat format(GL_INT, GL_FALSE, 3, false);
1105 return format;
1106 }
1107 case VERTEX_FORMAT_SINT3_NORM:
1108 {
1109 static const VertexFormat format(GL_INT, GL_TRUE, 3, false);
1110 return format;
1111 }
1112 case VERTEX_FORMAT_SINT4:
1113 {
1114 static const VertexFormat format(GL_INT, GL_FALSE, 4, false);
1115 return format;
1116 }
1117 case VERTEX_FORMAT_SINT4_NORM:
1118 {
1119 static const VertexFormat format(GL_INT, GL_TRUE, 4, false);
1120 return format;
1121 }
1122 case VERTEX_FORMAT_UINT1:
1123 {
1124 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, false);
1125 return format;
1126 }
1127 case VERTEX_FORMAT_UINT1_NORM:
1128 {
1129 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 1, false);
1130 return format;
1131 }
1132 case VERTEX_FORMAT_UINT2:
1133 {
1134 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, false);
1135 return format;
1136 }
1137 case VERTEX_FORMAT_UINT2_NORM:
1138 {
1139 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 2, false);
1140 return format;
1141 }
1142 case VERTEX_FORMAT_UINT3:
1143 {
1144 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, false);
1145 return format;
1146 }
1147 case VERTEX_FORMAT_UINT3_NORM:
1148 {
1149 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 3, false);
1150 return format;
1151 }
1152 case VERTEX_FORMAT_UINT4:
1153 {
1154 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, false);
1155 return format;
1156 }
1157 case VERTEX_FORMAT_UINT4_NORM:
1158 {
1159 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 4, false);
1160 return format;
1161 }
1162 case VERTEX_FORMAT_SBYTE1_INT:
1163 {
1164 static const VertexFormat format(GL_BYTE, GL_FALSE, 1, true);
1165 return format;
1166 }
1167 case VERTEX_FORMAT_SBYTE2_INT:
1168 {
1169 static const VertexFormat format(GL_BYTE, GL_FALSE, 2, true);
1170 return format;
1171 }
1172 case VERTEX_FORMAT_SBYTE3_INT:
1173 {
1174 static const VertexFormat format(GL_BYTE, GL_FALSE, 3, true);
1175 return format;
1176 }
1177 case VERTEX_FORMAT_SBYTE4_INT:
1178 {
1179 static const VertexFormat format(GL_BYTE, GL_FALSE, 4, true);
1180 return format;
1181 }
1182 case VERTEX_FORMAT_UBYTE1_INT:
1183 {
1184 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, true);
1185 return format;
1186 }
1187 case VERTEX_FORMAT_UBYTE2_INT:
1188 {
1189 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, true);
1190 return format;
1191 }
1192 case VERTEX_FORMAT_UBYTE3_INT:
1193 {
1194 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, true);
1195 return format;
1196 }
1197 case VERTEX_FORMAT_UBYTE4_INT:
1198 {
1199 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, true);
1200 return format;
1201 }
1202 case VERTEX_FORMAT_SSHORT1_INT:
1203 {
1204 static const VertexFormat format(GL_SHORT, GL_FALSE, 1, true);
1205 return format;
1206 }
1207 case VERTEX_FORMAT_SSHORT2_INT:
1208 {
1209 static const VertexFormat format(GL_SHORT, GL_FALSE, 2, true);
1210 return format;
1211 }
1212 case VERTEX_FORMAT_SSHORT3_INT:
1213 {
1214 static const VertexFormat format(GL_SHORT, GL_FALSE, 3, true);
1215 return format;
1216 }
1217 case VERTEX_FORMAT_SSHORT4_INT:
1218 {
1219 static const VertexFormat format(GL_SHORT, GL_FALSE, 4, true);
1220 return format;
1221 }
1222 case VERTEX_FORMAT_USHORT1_INT:
1223 {
1224 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, true);
1225 return format;
1226 }
1227 case VERTEX_FORMAT_USHORT2_INT:
1228 {
1229 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, true);
1230 return format;
1231 }
1232 case VERTEX_FORMAT_USHORT3_INT:
1233 {
1234 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, true);
1235 return format;
1236 }
1237 case VERTEX_FORMAT_USHORT4_INT:
1238 {
1239 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, true);
1240 return format;
1241 }
1242 case VERTEX_FORMAT_SINT1_INT:
1243 {
1244 static const VertexFormat format(GL_INT, GL_FALSE, 1, true);
1245 return format;
1246 }
1247 case VERTEX_FORMAT_SINT2_INT:
1248 {
1249 static const VertexFormat format(GL_INT, GL_FALSE, 2, true);
1250 return format;
1251 }
1252 case VERTEX_FORMAT_SINT3_INT:
1253 {
1254 static const VertexFormat format(GL_INT, GL_FALSE, 3, true);
1255 return format;
1256 }
1257 case VERTEX_FORMAT_SINT4_INT:
1258 {
1259 static const VertexFormat format(GL_INT, GL_FALSE, 4, true);
1260 return format;
1261 }
1262 case VERTEX_FORMAT_UINT1_INT:
1263 {
1264 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, true);
1265 return format;
1266 }
1267 case VERTEX_FORMAT_UINT2_INT:
1268 {
1269 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, true);
1270 return format;
1271 }
1272 case VERTEX_FORMAT_UINT3_INT:
1273 {
1274 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, true);
1275 return format;
1276 }
1277 case VERTEX_FORMAT_UINT4_INT:
1278 {
1279 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, true);
1280 return format;
1281 }
1282 case VERTEX_FORMAT_FIXED1:
1283 {
1284 static const VertexFormat format(GL_FIXED, GL_FALSE, 1, false);
1285 return format;
1286 }
1287 case VERTEX_FORMAT_FIXED2:
1288 {
1289 static const VertexFormat format(GL_FIXED, GL_FALSE, 2, false);
1290 return format;
1291 }
1292 case VERTEX_FORMAT_FIXED3:
1293 {
1294 static const VertexFormat format(GL_FIXED, GL_FALSE, 3, false);
1295 return format;
1296 }
1297 case VERTEX_FORMAT_FIXED4:
1298 {
1299 static const VertexFormat format(GL_FIXED, GL_FALSE, 4, false);
1300 return format;
1301 }
1302 case VERTEX_FORMAT_HALF1:
1303 {
1304 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 1, false);
1305 return format;
1306 }
1307 case VERTEX_FORMAT_HALF2:
1308 {
1309 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 2, false);
1310 return format;
1311 }
1312 case VERTEX_FORMAT_HALF3:
1313 {
1314 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 3, false);
1315 return format;
1316 }
1317 case VERTEX_FORMAT_HALF4:
1318 {
1319 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 4, false);
1320 return format;
1321 }
1322 case VERTEX_FORMAT_FLOAT1:
1323 {
1324 static const VertexFormat format(GL_FLOAT, GL_FALSE, 1, false);
1325 return format;
1326 }
1327 case VERTEX_FORMAT_FLOAT2:
1328 {
1329 static const VertexFormat format(GL_FLOAT, GL_FALSE, 2, false);
1330 return format;
1331 }
1332 case VERTEX_FORMAT_FLOAT3:
1333 {
1334 static const VertexFormat format(GL_FLOAT, GL_FALSE, 3, false);
1335 return format;
1336 }
1337 case VERTEX_FORMAT_FLOAT4:
1338 {
1339 static const VertexFormat format(GL_FLOAT, GL_FALSE, 4, false);
1340 return format;
1341 }
1342 case VERTEX_FORMAT_SINT210:
1343 {
1344 static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, false);
1345 return format;
1346 }
1347 case VERTEX_FORMAT_UINT210:
1348 {
1349 static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, false);
1350 return format;
1351 }
1352 case VERTEX_FORMAT_SINT210_NORM:
1353 {
1354 static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_TRUE, 4, false);
1355 return format;
1356 }
1357 case VERTEX_FORMAT_UINT210_NORM:
1358 {
1359 static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 4, false);
1360 return format;
1361 }
1362 case VERTEX_FORMAT_SINT210_INT:
1363 {
1364 static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, true);
1365 return format;
1366 }
1367 case VERTEX_FORMAT_UINT210_INT:
1368 {
1369 static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, true);
1370 return format;
1371 }
1372 default:
1373 {
1374 static const VertexFormat format(GL_NONE, GL_FALSE, 0, false);
1375 return format;
1376 }
1377 }
1378}
1379
1380VertexFormat::VertexFormat(GLenum typeIn, GLboolean normalizedIn, GLuint componentsIn, bool pureIntegerIn)
1381 : type(typeIn),
1382 normalized(normalizedIn),
1383 components(componentsIn),
1384 pureInteger(pureIntegerIn)
1385{
1386 // float -> !normalized
1387 ASSERT(!(type == GL_FLOAT || type == GL_HALF_FLOAT || type == GL_FIXED) || normalized == GL_FALSE);
1388}
1389
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001390}