blob: 8e316c4519ccc1b97a412674f574fdf3d3b1eeea [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
Jamie Madill6a6b09c2017-01-12 21:52:29 +00009#include "libANGLE/formatutils.h"
Yuly Novikovd73f8522017-01-13 17:48:57 -050010
11#include "common/mathutil.h"
Geoff Lang2b5420c2014-11-19 14:20:15 -050012#include "libANGLE/Context.h"
13#include "libANGLE/Framebuffer.h"
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000014
Jamie Madille2e406c2016-06-02 13:04:10 -040015using namespace angle;
16
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000017namespace gl
18{
19
20// ES2 requires that format is equal to internal format at all glTex*Image2D entry points and the implementation
21// can decide the true, sized, internal format. The ES2FormatMap determines the internal format for all valid
22// format and type combinations.
Jamie Madilled4d3422016-10-03 15:45:35 -040023GLenum GetSizedFormatInternal(GLenum format, GLenum type);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000024
Jamie Madilled4d3422016-10-03 15:45:35 -040025namespace
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000026{
Geoff Langca271392017-04-05 12:30:00 -040027using InternalFormatInfoMap =
28 std::unordered_map<GLenum, std::unordered_map<GLenum, InternalFormat>>;
Jamie Madilla3944d42016-07-22 22:13:26 -040029
30} // anonymous namespace
31
32FormatType::FormatType() : format(GL_NONE), type(GL_NONE)
33{
34}
35
36FormatType::FormatType(GLenum format_, GLenum type_) : format(format_), type(type_)
37{
38}
39
40bool FormatType::operator<(const FormatType &other) const
41{
42 if (format != other.format)
43 return format < other.format;
44 return type < other.type;
45}
46
Geoff Lang5d601382014-07-22 15:14:06 -040047Type::Type()
48 : bytes(0),
Olli Etuaho11ffe1b2015-03-24 17:28:18 +020049 bytesShift(0),
Geoff Lang5d601382014-07-22 15:14:06 -040050 specialInterpretation(false)
Geoff Langfe28ca02013-06-04 10:10:48 -040051{
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000052}
53
Olli Etuaho31f8f4f2015-03-25 16:03:57 +020054static Type GenTypeInfo(GLuint bytes, bool specialInterpretation)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000055{
Geoff Lang5d601382014-07-22 15:14:06 -040056 Type info;
57 info.bytes = bytes;
Olli Etuaho11ffe1b2015-03-24 17:28:18 +020058 GLuint i = 0;
59 while ((1u << i) < bytes)
60 {
61 ++i;
62 }
63 info.bytesShift = i;
64 ASSERT((1u << info.bytesShift) == bytes);
Geoff Lang5d601382014-07-22 15:14:06 -040065 info.specialInterpretation = specialInterpretation;
Olli Etuaho31f8f4f2015-03-25 16:03:57 +020066 return info;
Geoff Lang5d601382014-07-22 15:14:06 -040067}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000068
Geoff Lang5d601382014-07-22 15:14:06 -040069bool operator<(const Type& a, const Type& b)
70{
71 return memcmp(&a, &b, sizeof(Type)) < 0;
72}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000073
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000074// Information about internal formats
Geoff Langeb66a6e2016-10-31 13:06:12 -040075static bool AlwaysSupported(const Version &, const Extensions &)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000076{
Geoff Lang493daf52014-07-03 13:38:44 -040077 return true;
78}
79
Geoff Langeb66a6e2016-10-31 13:06:12 -040080static bool NeverSupported(const Version &, const Extensions &)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000081{
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +000082 return false;
83}
84
Geoff Langeb66a6e2016-10-31 13:06:12 -040085template <GLuint minCoreGLMajorVersion, GLuint minCoreGLMinorVersion>
86static bool RequireES(const Version &clientVersion, const Extensions &)
Geoff Lange4a492b2014-06-19 14:14:41 -040087{
Geoff Langeb66a6e2016-10-31 13:06:12 -040088 return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion);
Geoff Lange4a492b2014-06-19 14:14:41 -040089}
90
Geoff Langcec35902014-04-16 10:52:36 -040091// Pointer to a boolean memeber of the Extensions struct
92typedef bool(Extensions::*ExtensionBool);
93
94// Check support for a single extension
95template <ExtensionBool bool1>
Geoff Langeb66a6e2016-10-31 13:06:12 -040096static bool RequireExt(const Version &, const Extensions &extensions)
Geoff Langcec35902014-04-16 10:52:36 -040097{
Geoff Lange4a492b2014-06-19 14:14:41 -040098 return extensions.*bool1;
99}
100
101// Check for a minimum client version or a single extension
Geoff Langeb66a6e2016-10-31 13:06:12 -0400102template <GLuint minCoreGLMajorVersion, GLuint minCoreGLMinorVersion, ExtensionBool bool1>
103static bool RequireESOrExt(const Version &clientVersion, const Extensions &extensions)
Geoff Lange4a492b2014-06-19 14:14:41 -0400104{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400105 return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion) ||
106 extensions.*bool1;
Geoff Lange4a492b2014-06-19 14:14:41 -0400107}
108
109// Check for a minimum client version or two extensions
Geoff Langeb66a6e2016-10-31 13:06:12 -0400110template <GLuint minCoreGLMajorVersion,
111 GLuint minCoreGLMinorVersion,
112 ExtensionBool bool1,
113 ExtensionBool bool2>
114static bool RequireESOrExtAndExt(const Version &clientVersion, const Extensions &extensions)
Geoff Lange4a492b2014-06-19 14:14:41 -0400115{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400116 return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion) ||
117 (extensions.*bool1 && extensions.*bool2);
Geoff Langabce7622014-09-19 16:13:00 -0400118}
119
120// Check for a minimum client version or at least one of two extensions
Geoff Langeb66a6e2016-10-31 13:06:12 -0400121template <GLuint minCoreGLMajorVersion,
122 GLuint minCoreGLMinorVersion,
123 ExtensionBool bool1,
124 ExtensionBool bool2>
125static bool RequireESOrExtOrExt(const Version &clientVersion, const Extensions &extensions)
Geoff Langabce7622014-09-19 16:13:00 -0400126{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400127 return clientVersion >= Version(minCoreGLMajorVersion, minCoreGLMinorVersion) ||
128 extensions.*bool1 || extensions.*bool2;
Geoff Langcec35902014-04-16 10:52:36 -0400129}
130
131// Check support for two extensions
132template <ExtensionBool bool1, ExtensionBool bool2>
Geoff Langeb66a6e2016-10-31 13:06:12 -0400133static bool RequireExtAndExt(const Version &, const Extensions &extensions)
Geoff Langcec35902014-04-16 10:52:36 -0400134{
Geoff Langabce7622014-09-19 16:13:00 -0400135 return extensions.*bool1 && extensions.*bool2;
Geoff Langcec35902014-04-16 10:52:36 -0400136}
137
Geoff Lang60ad73d2015-10-23 10:08:44 -0400138// Check support for either of two extensions
139template <ExtensionBool bool1, ExtensionBool bool2>
Geoff Langeb66a6e2016-10-31 13:06:12 -0400140static bool RequireExtOrExt(const Version &, const Extensions &extensions)
Geoff Lang60ad73d2015-10-23 10:08:44 -0400141{
142 return extensions.*bool1 || extensions.*bool2;
143}
144
Jamie Madillcd089732015-12-17 09:53:09 -0500145// Special function for half float formats with three or four channels.
Geoff Langeb66a6e2016-10-31 13:06:12 -0400146static bool HalfFloatSupport(const Version &clientVersion, const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500147{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400148 return clientVersion >= Version(3, 0) || extensions.textureHalfFloat;
Jamie Madillcd089732015-12-17 09:53:09 -0500149}
150
Geoff Lang677bb6f2017-04-05 12:40:40 -0400151static bool HalfFloatRGBRenderableSupport(const Version &clientVersion,
152 const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500153{
154 return HalfFloatSupport(clientVersion, extensions) && extensions.colorBufferHalfFloat;
155}
156
Geoff Lang677bb6f2017-04-05 12:40:40 -0400157static bool HalfFloatRGBARenderableSupport(const Version &clientVersion,
158 const Extensions &extensions)
159{
160 return HalfFloatSupport(clientVersion, extensions) &&
161 (extensions.colorBufferHalfFloat || extensions.colorBufferFloat);
162}
163
Jamie Madillcd089732015-12-17 09:53:09 -0500164// Special function for half float formats with one or two channels.
Geoff Lang677bb6f2017-04-05 12:40:40 -0400165
166// R16F, RG16F
167static bool HalfFloatRGSupport(const Version &clientVersion, const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500168{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400169 return clientVersion >= Version(3, 0) || (extensions.textureHalfFloat && extensions.textureRG);
Jamie Madillcd089732015-12-17 09:53:09 -0500170}
171
Geoff Lang677bb6f2017-04-05 12:40:40 -0400172// R16F, RG16F
173static bool HalfFloatRGRenderableSupport(const Version &clientVersion, const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500174{
Geoff Lang677bb6f2017-04-05 12:40:40 -0400175 // It's unclear if EXT_color_buffer_half_float gives renderability to non-OES half float
176 // textures
177 return HalfFloatRGSupport(clientVersion, extensions) &&
178 (extensions.colorBufferHalfFloat || extensions.colorBufferFloat);
179}
180
181// RED + HALF_FLOAT_OES, RG + HALF_FLOAT_OES
182static bool UnsizedHalfFloatOESRGSupport(const Version &, const Extensions &extensions)
183{
184 return extensions.textureHalfFloat && extensions.textureRG;
185}
186
187// RED + HALF_FLOAT_OES, RG + HALF_FLOAT_OES
188static bool UnsizedHalfFloatOESRGRenderableSupport(const Version &clientVersion,
189 const Extensions &extensions)
190{
191 return UnsizedHalfFloatOESRGSupport(clientVersion, extensions) &&
192 extensions.colorBufferHalfFloat;
193}
194
195// RGB + HALF_FLOAT_OES, RGBA + HALF_FLOAT_OES
196static bool UnsizedHalfFloatOESSupport(const Version &clientVersion, const Extensions &extensions)
197{
198 return extensions.textureHalfFloat;
199}
200
201// RGB + HALF_FLOAT_OES, RGBA + HALF_FLOAT_OES
202static bool UnsizedHalfFloatOESRenderableSupport(const Version &clientVersion,
203 const Extensions &extensions)
204{
205 return UnsizedHalfFloatOESSupport(clientVersion, extensions) && extensions.colorBufferHalfFloat;
Jamie Madillcd089732015-12-17 09:53:09 -0500206}
207
208// Special function for float formats with three or four channels.
Geoff Lang677bb6f2017-04-05 12:40:40 -0400209
210// RGB32F, RGBA32F
Geoff Langeb66a6e2016-10-31 13:06:12 -0400211static bool FloatSupport(const Version &clientVersion, const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500212{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400213 return clientVersion >= Version(3, 0) || extensions.textureFloat;
Jamie Madillcd089732015-12-17 09:53:09 -0500214}
215
Geoff Lang677bb6f2017-04-05 12:40:40 -0400216// RGB32F
217static bool FloatRGBRenderableSupport(const Version &clientVersion, const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500218{
Geoff Lang677bb6f2017-04-05 12:40:40 -0400219 return FloatSupport(clientVersion, extensions) && extensions.colorBufferFloatRGB;
220}
221
222// RGBA32F
223static bool FloatRGBARenderableSupport(const Version &clientVersion, const Extensions &extensions)
224{
Jamie Madillcd089732015-12-17 09:53:09 -0500225 return FloatSupport(clientVersion, extensions) &&
Geoff Lang677bb6f2017-04-05 12:40:40 -0400226 (extensions.colorBufferFloat || extensions.colorBufferFloatRGBA);
227}
228
229// RGB + FLOAT, RGBA + FLOAT
230static bool UnsizedFloatSupport(const Version &clientVersion, const Extensions &extensions)
231{
232 return extensions.textureFloat;
233}
234
235// RGB + FLOAT
236static bool UnsizedFloatRGBRenderableSupport(const Version &clientVersion,
237 const Extensions &extensions)
238{
239 return UnsizedFloatSupport(clientVersion, extensions) && extensions.colorBufferFloatRGB;
240}
241
242// RGBA + FLOAT
243static bool UnsizedFloatRGBARenderableSupport(const Version &clientVersion,
244 const Extensions &extensions)
245{
246 return UnsizedFloatSupport(clientVersion, extensions) &&
247 (extensions.colorBufferFloatRGBA || extensions.colorBufferFloat);
Jamie Madillcd089732015-12-17 09:53:09 -0500248}
249
250// Special function for float formats with one or two channels.
Geoff Lang677bb6f2017-04-05 12:40:40 -0400251
252// R32F, RG32F
253static bool FloatRGSupport(const Version &clientVersion, const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500254{
Geoff Langeb66a6e2016-10-31 13:06:12 -0400255 return clientVersion >= Version(3, 0) || (extensions.textureFloat && extensions.textureRG);
Jamie Madillcd089732015-12-17 09:53:09 -0500256}
257
Geoff Lang677bb6f2017-04-05 12:40:40 -0400258// R32F, RG32F
259static bool FloatRGRenderableSupport(const Version &clientVersion, const Extensions &extensions)
Jamie Madillcd089732015-12-17 09:53:09 -0500260{
Geoff Lang677bb6f2017-04-05 12:40:40 -0400261 return FloatRGSupport(clientVersion, extensions) && extensions.colorBufferFloat;
262}
263
264// RED + FLOAT, RG + FLOAT
265static bool UnsizedFloatRGSupport(const Version &clientVersion, const Extensions &extensions)
266{
267 return extensions.textureFloat && extensions.textureRG;
268}
269
270// RED + FLOAT, RG + FLOAT
271static bool UnsizedFloatRGRenderableSupport(const Version &clientVersion,
272 const Extensions &extensions)
273{
274 return FloatRGSupport(clientVersion, extensions) && extensions.colorBufferFloat;
Jamie Madillcd089732015-12-17 09:53:09 -0500275}
276
Geoff Lang5d601382014-07-22 15:14:06 -0400277InternalFormat::InternalFormat()
Jamie Madilla3944d42016-07-22 22:13:26 -0400278 : internalFormat(GL_NONE),
Geoff Langca271392017-04-05 12:30:00 -0400279 sized(false),
280 sizedInternalFormat(GL_NONE),
Jamie Madilla3944d42016-07-22 22:13:26 -0400281 redBits(0),
Geoff Lang5d601382014-07-22 15:14:06 -0400282 greenBits(0),
283 blueBits(0),
284 luminanceBits(0),
285 alphaBits(0),
286 sharedBits(0),
287 depthBits(0),
288 stencilBits(0),
289 pixelBytes(0),
290 componentCount(0),
Corentin Wallezbc99bb62015-05-14 17:42:20 -0400291 compressed(false),
Geoff Lang5d601382014-07-22 15:14:06 -0400292 compressedBlockWidth(0),
293 compressedBlockHeight(0),
294 format(GL_NONE),
295 type(GL_NONE),
296 componentType(GL_NONE),
297 colorEncoding(GL_NONE),
Geoff Lang5d601382014-07-22 15:14:06 -0400298 textureSupport(NeverSupported),
299 renderSupport(NeverSupported),
300 filterSupport(NeverSupported)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000301{
Geoff Lang5d601382014-07-22 15:14:06 -0400302}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000303
Jamie Madilla3944d42016-07-22 22:13:26 -0400304bool InternalFormat::isLUMA() const
305{
306 return ((redBits + greenBits + blueBits + depthBits + stencilBits) == 0 &&
307 (luminanceBits + alphaBits) > 0);
308}
309
Geoff Langf607c602016-09-21 11:46:48 -0400310GLenum InternalFormat::getReadPixelsFormat() const
311{
312 return format;
313}
314
Geoff Langc71ea662017-09-26 17:06:02 -0400315GLenum InternalFormat::getReadPixelsType(const Version &version) const
Geoff Langf607c602016-09-21 11:46:48 -0400316{
317 switch (type)
318 {
319 case GL_HALF_FLOAT:
Geoff Langc71ea662017-09-26 17:06:02 -0400320 case GL_HALF_FLOAT_OES:
321 if (version < Version(3, 0))
322 {
323 // The internal format may have a type of GL_HALF_FLOAT but when exposing this type
324 // as the IMPLEMENTATION_READ_TYPE, only HALF_FLOAT_OES is allowed by
325 // OES_texture_half_float. HALF_FLOAT becomes core in ES3 and is acceptable to use
326 // as an IMPLEMENTATION_READ_TYPE.
327 return GL_HALF_FLOAT_OES;
328 }
329 else
330 {
331 return GL_HALF_FLOAT;
332 }
Geoff Langf607c602016-09-21 11:46:48 -0400333
334 default:
335 return type;
336 }
337}
338
Olli Etuaho50c562d2017-06-06 14:43:30 +0300339bool InternalFormat::isRequiredRenderbufferFormat(const Version &version) const
340{
341 // GLES 3.0.5 section 4.4.2.2:
342 // "Implementations are required to support the same internal formats for renderbuffers as the
343 // required formats for textures enumerated in section 3.8.3.1, with the exception of the color
344 // formats labelled "texture-only"."
345 if (!sized || compressed)
346 {
347 return false;
348 }
349
350 // Luma formats.
351 if (isLUMA())
352 {
353 return false;
354 }
355
356 // Depth/stencil formats.
357 if (depthBits > 0 || stencilBits > 0)
358 {
359 // GLES 2.0.25 table 4.5.
360 // GLES 3.0.5 section 3.8.3.1.
361 // GLES 3.1 table 8.14.
362
363 // Required formats in all versions.
364 switch (internalFormat)
365 {
366 case GL_DEPTH_COMPONENT16:
367 case GL_STENCIL_INDEX8:
368 // Note that STENCIL_INDEX8 is not mentioned in GLES 3.0.5 section 3.8.3.1, but it
369 // is in section 4.4.2.2.
370 return true;
371 default:
372 break;
373 }
374 if (version.major < 3)
375 {
376 return false;
377 }
378 // Required formats in GLES 3.0 and up.
379 switch (internalFormat)
380 {
381 case GL_DEPTH_COMPONENT32F:
382 case GL_DEPTH_COMPONENT24:
383 case GL_DEPTH32F_STENCIL8:
384 case GL_DEPTH24_STENCIL8:
385 return true;
386 default:
387 return false;
388 }
389 }
390
391 // RGBA formats.
392 // GLES 2.0.25 table 4.5.
393 // GLES 3.0.5 section 3.8.3.1.
394 // GLES 3.1 table 8.13.
395
396 // Required formats in all versions.
397 switch (internalFormat)
398 {
399 case GL_RGBA4:
400 case GL_RGB5_A1:
401 case GL_RGB565:
402 return true;
403 default:
404 break;
405 }
406 if (version.major < 3)
407 {
408 return false;
409 }
410
411 if (format == GL_BGRA_EXT)
412 {
413 return false;
414 }
415
416 switch (componentType)
417 {
418 case GL_SIGNED_NORMALIZED:
419 case GL_FLOAT:
420 return false;
421 case GL_UNSIGNED_INT:
422 case GL_INT:
423 // Integer RGB formats are not required renderbuffer formats.
424 if (alphaBits == 0 && blueBits != 0)
425 {
426 return false;
427 }
428 // All integer R and RG formats are required.
429 // Integer RGBA formats including RGB10_A2_UI are required.
430 return true;
431 case GL_UNSIGNED_NORMALIZED:
432 if (internalFormat == GL_SRGB8)
433 {
434 return false;
435 }
436 return true;
437 default:
438 UNREACHABLE();
439 return false;
440 }
441}
442
Geoff Langca271392017-04-05 12:30:00 -0400443Format::Format(GLenum internalFormat) : Format(GetSizedInternalFormatInfo(internalFormat))
Jamie Madilla3944d42016-07-22 22:13:26 -0400444{
445}
446
Geoff Langca271392017-04-05 12:30:00 -0400447Format::Format(const InternalFormat &internalFormat) : info(&internalFormat)
Jamie Madilla3944d42016-07-22 22:13:26 -0400448{
Jamie Madilla3944d42016-07-22 22:13:26 -0400449}
450
Geoff Langca271392017-04-05 12:30:00 -0400451Format::Format(GLenum internalFormat, GLenum type)
452 : info(&GetInternalFormatInfo(internalFormat, type))
Jamie Madilla3944d42016-07-22 22:13:26 -0400453{
Jamie Madilla3944d42016-07-22 22:13:26 -0400454}
455
456Format::Format(const Format &other) = default;
457Format &Format::operator=(const Format &other) = default;
458
Jamie Madilla3944d42016-07-22 22:13:26 -0400459bool Format::valid() const
460{
Geoff Langca271392017-04-05 12:30:00 -0400461 return info->internalFormat != GL_NONE;
Jamie Madilla3944d42016-07-22 22:13:26 -0400462}
463
464// static
465bool Format::SameSized(const Format &a, const Format &b)
466{
Geoff Langca271392017-04-05 12:30:00 -0400467 return a.info->sizedInternalFormat == b.info->sizedInternalFormat;
Jamie Madilla3944d42016-07-22 22:13:26 -0400468}
469
Kenneth Russell69382852017-07-21 16:38:44 -0400470static GLenum EquivalentBlitInternalFormat(GLenum internalformat)
471{
472 // BlitFramebuffer works if the color channels are identically
473 // sized, even if there is a swizzle (for example, blitting from a
474 // multisampled RGBA8 renderbuffer to a BGRA8 texture). This could
475 // be expanded and/or autogenerated if that is found necessary.
476 if (internalformat == GL_BGRA8_EXT)
477 return GL_RGBA8;
478 return internalformat;
479}
480
481// static
482bool Format::EquivalentForBlit(const Format &a, const Format &b)
483{
484 return (EquivalentBlitInternalFormat(a.info->sizedInternalFormat) ==
485 EquivalentBlitInternalFormat(b.info->sizedInternalFormat));
486}
487
Jamie Madilla3944d42016-07-22 22:13:26 -0400488// static
489Format Format::Invalid()
490{
Geoff Langca271392017-04-05 12:30:00 -0400491 static Format invalid(GL_NONE, GL_NONE);
Jamie Madilla3944d42016-07-22 22:13:26 -0400492 return invalid;
493}
494
Yuly Novikovd73f8522017-01-13 17:48:57 -0500495std::ostream &operator<<(std::ostream &os, const Format &fmt)
496{
497 // TODO(ynovikov): return string representation when available
Geoff Langca271392017-04-05 12:30:00 -0400498 return FmtHexShort(os, fmt.info->sizedInternalFormat);
Yuly Novikovd73f8522017-01-13 17:48:57 -0500499}
500
Jamie Madilla3944d42016-07-22 22:13:26 -0400501bool InternalFormat::operator==(const InternalFormat &other) const
502{
Geoff Langca271392017-04-05 12:30:00 -0400503 // We assume all internal formats are unique if they have the same internal format and type
504 return internalFormat == other.internalFormat && type == other.type;
Jamie Madilla3944d42016-07-22 22:13:26 -0400505}
506
507bool InternalFormat::operator!=(const InternalFormat &other) const
508{
Geoff Langca271392017-04-05 12:30:00 -0400509 return !(*this == other);
Jamie Madilla3944d42016-07-22 22:13:26 -0400510}
511
Geoff Langca271392017-04-05 12:30:00 -0400512void InsertFormatInfo(InternalFormatInfoMap *map, const InternalFormat &formatInfo)
Geoff Lang5d601382014-07-22 15:14:06 -0400513{
Geoff Langca271392017-04-05 12:30:00 -0400514 ASSERT(!formatInfo.sized || (*map).count(formatInfo.internalFormat) == 0);
515 ASSERT((*map)[formatInfo.internalFormat].count(formatInfo.type) == 0);
516 (*map)[formatInfo.internalFormat][formatInfo.type] = formatInfo;
Geoff Lang5d601382014-07-22 15:14:06 -0400517}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000518
Jamie Madilla3944d42016-07-22 22:13:26 -0400519void AddRGBAFormat(InternalFormatInfoMap *map,
520 GLenum internalFormat,
Geoff Langca271392017-04-05 12:30:00 -0400521 bool sized,
Jamie Madilla3944d42016-07-22 22:13:26 -0400522 GLuint red,
523 GLuint green,
524 GLuint blue,
525 GLuint alpha,
526 GLuint shared,
527 GLenum format,
528 GLenum type,
529 GLenum componentType,
530 bool srgb,
531 InternalFormat::SupportCheckFunction textureSupport,
532 InternalFormat::SupportCheckFunction renderSupport,
533 InternalFormat::SupportCheckFunction filterSupport)
Geoff Lang5d601382014-07-22 15:14:06 -0400534{
535 InternalFormat formatInfo;
Jamie Madilla3944d42016-07-22 22:13:26 -0400536 formatInfo.internalFormat = internalFormat;
Geoff Langca271392017-04-05 12:30:00 -0400537 formatInfo.sized = sized;
538 formatInfo.sizedInternalFormat =
539 sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
Geoff Lang5d601382014-07-22 15:14:06 -0400540 formatInfo.redBits = red;
541 formatInfo.greenBits = green;
542 formatInfo.blueBits = blue;
543 formatInfo.alphaBits = alpha;
544 formatInfo.sharedBits = shared;
545 formatInfo.pixelBytes = (red + green + blue + alpha + shared) / 8;
Geoff Langca271392017-04-05 12:30:00 -0400546 formatInfo.componentCount =
547 ((red > 0) ? 1 : 0) + ((green > 0) ? 1 : 0) + ((blue > 0) ? 1 : 0) + ((alpha > 0) ? 1 : 0);
Geoff Lang5d601382014-07-22 15:14:06 -0400548 formatInfo.format = format;
549 formatInfo.type = type;
550 formatInfo.componentType = componentType;
551 formatInfo.colorEncoding = (srgb ? GL_SRGB : GL_LINEAR);
552 formatInfo.textureSupport = textureSupport;
553 formatInfo.renderSupport = renderSupport;
554 formatInfo.filterSupport = filterSupport;
Geoff Langca271392017-04-05 12:30:00 -0400555
556 InsertFormatInfo(map, formatInfo);
Geoff Lang5d601382014-07-22 15:14:06 -0400557}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000558
Geoff Langca271392017-04-05 12:30:00 -0400559static void AddLUMAFormat(InternalFormatInfoMap *map,
560 GLenum internalFormat,
561 bool sized,
562 GLuint luminance,
563 GLuint alpha,
564 GLenum format,
565 GLenum type,
566 GLenum componentType,
567 InternalFormat::SupportCheckFunction textureSupport,
568 InternalFormat::SupportCheckFunction renderSupport,
569 InternalFormat::SupportCheckFunction filterSupport)
Geoff Lang5d601382014-07-22 15:14:06 -0400570{
571 InternalFormat formatInfo;
Geoff Langca271392017-04-05 12:30:00 -0400572 formatInfo.internalFormat = internalFormat;
573 formatInfo.sized = sized;
574 formatInfo.sizedInternalFormat =
575 sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
Geoff Lang5d601382014-07-22 15:14:06 -0400576 formatInfo.luminanceBits = luminance;
577 formatInfo.alphaBits = alpha;
578 formatInfo.pixelBytes = (luminance + alpha) / 8;
579 formatInfo.componentCount = ((luminance > 0) ? 1 : 0) + ((alpha > 0) ? 1 : 0);
580 formatInfo.format = format;
581 formatInfo.type = type;
582 formatInfo.componentType = componentType;
583 formatInfo.colorEncoding = GL_LINEAR;
584 formatInfo.textureSupport = textureSupport;
585 formatInfo.renderSupport = renderSupport;
586 formatInfo.filterSupport = filterSupport;
Geoff Langca271392017-04-05 12:30:00 -0400587
588 InsertFormatInfo(map, formatInfo);
Geoff Lang5d601382014-07-22 15:14:06 -0400589}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000590
Jamie Madilla3944d42016-07-22 22:13:26 -0400591void AddDepthStencilFormat(InternalFormatInfoMap *map,
592 GLenum internalFormat,
Geoff Langca271392017-04-05 12:30:00 -0400593 bool sized,
Jamie Madilla3944d42016-07-22 22:13:26 -0400594 GLuint depthBits,
595 GLuint stencilBits,
596 GLuint unusedBits,
597 GLenum format,
598 GLenum type,
599 GLenum componentType,
600 InternalFormat::SupportCheckFunction textureSupport,
601 InternalFormat::SupportCheckFunction renderSupport,
602 InternalFormat::SupportCheckFunction filterSupport)
Geoff Lang5d601382014-07-22 15:14:06 -0400603{
604 InternalFormat formatInfo;
Jamie Madilla3944d42016-07-22 22:13:26 -0400605 formatInfo.internalFormat = internalFormat;
Geoff Langca271392017-04-05 12:30:00 -0400606 formatInfo.sized = sized;
607 formatInfo.sizedInternalFormat =
608 sized ? internalFormat : GetSizedFormatInternal(internalFormat, type);
Geoff Lang5d601382014-07-22 15:14:06 -0400609 formatInfo.depthBits = depthBits;
610 formatInfo.stencilBits = stencilBits;
611 formatInfo.pixelBytes = (depthBits + stencilBits + unusedBits) / 8;
612 formatInfo.componentCount = ((depthBits > 0) ? 1 : 0) + ((stencilBits > 0) ? 1 : 0);
613 formatInfo.format = format;
614 formatInfo.type = type;
615 formatInfo.componentType = componentType;
616 formatInfo.colorEncoding = GL_LINEAR;
617 formatInfo.textureSupport = textureSupport;
618 formatInfo.renderSupport = renderSupport;
619 formatInfo.filterSupport = filterSupport;
Geoff Langca271392017-04-05 12:30:00 -0400620
621 InsertFormatInfo(map, formatInfo);
Geoff Lang5d601382014-07-22 15:14:06 -0400622}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000623
Geoff Langca271392017-04-05 12:30:00 -0400624void AddCompressedFormat(InternalFormatInfoMap *map,
625 GLenum internalFormat,
626 GLuint compressedBlockWidth,
627 GLuint compressedBlockHeight,
628 GLuint compressedBlockSize,
629 GLuint componentCount,
630 GLenum format,
631 GLenum type,
632 bool srgb,
633 InternalFormat::SupportCheckFunction textureSupport,
634 InternalFormat::SupportCheckFunction renderSupport,
635 InternalFormat::SupportCheckFunction filterSupport)
Geoff Lang5d601382014-07-22 15:14:06 -0400636{
637 InternalFormat formatInfo;
Geoff Langca271392017-04-05 12:30:00 -0400638 formatInfo.internalFormat = internalFormat;
639 formatInfo.sized = true;
640 formatInfo.sizedInternalFormat = internalFormat;
Geoff Lang5d601382014-07-22 15:14:06 -0400641 formatInfo.compressedBlockWidth = compressedBlockWidth;
642 formatInfo.compressedBlockHeight = compressedBlockHeight;
643 formatInfo.pixelBytes = compressedBlockSize / 8;
644 formatInfo.componentCount = componentCount;
645 formatInfo.format = format;
646 formatInfo.type = type;
647 formatInfo.componentType = GL_UNSIGNED_NORMALIZED;
648 formatInfo.colorEncoding = (srgb ? GL_SRGB : GL_LINEAR);
649 formatInfo.compressed = true;
650 formatInfo.textureSupport = textureSupport;
651 formatInfo.renderSupport = renderSupport;
652 formatInfo.filterSupport = filterSupport;
Geoff Langca271392017-04-05 12:30:00 -0400653
654 InsertFormatInfo(map, formatInfo);
Geoff Lang5d601382014-07-22 15:14:06 -0400655}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000656
Geoff Lange4a492b2014-06-19 14:14:41 -0400657static InternalFormatInfoMap BuildInternalFormatInfoMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000658{
659 InternalFormatInfoMap map;
660
661 // From ES 3.0.1 spec, table 3.12
Geoff Langca271392017-04-05 12:30:00 -0400662 map[GL_NONE][GL_NONE] = InternalFormat();
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000663
Jamie Madilla3944d42016-07-22 22:13:26 -0400664 // clang-format off
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000665
Geoff Langca271392017-04-05 12:30:00 -0400666 // | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Renderable | Filterable |
667 AddRGBAFormat(&map, GL_R8, true, 8, 0, 0, 0, 0, GL_RED, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::textureRG>, RequireESOrExt<3, 0, &Extensions::textureRG>, AlwaysSupported);
668 AddRGBAFormat(&map, GL_R8_SNORM, true, 8, 0, 0, 0, 0, GL_RED, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
669 AddRGBAFormat(&map, GL_RG8, true, 8, 8, 0, 0, 0, GL_RG, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::textureRG>, RequireESOrExt<3, 0, &Extensions::textureRG>, AlwaysSupported);
670 AddRGBAFormat(&map, GL_RG8_SNORM, true, 8, 8, 0, 0, 0, GL_RG, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
671 AddRGBAFormat(&map, GL_RGB8, true, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, AlwaysSupported);
672 AddRGBAFormat(&map, GL_RGB8_SNORM, true, 8, 8, 8, 0, 0, GL_RGB, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
673 AddRGBAFormat(&map, GL_RGB565, true, 5, 6, 5, 0, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
674 AddRGBAFormat(&map, GL_RGBA4, true, 4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
675 AddRGBAFormat(&map, GL_RGB5_A1, true, 5, 5, 5, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
676 AddRGBAFormat(&map, GL_RGBA8, true, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, RequireESOrExt<3, 0, &Extensions::rgb8rgba8>, AlwaysSupported);
677 AddRGBAFormat(&map, GL_RGBA8_SNORM, true, 8, 8, 8, 8, 0, GL_RGBA, GL_BYTE, GL_SIGNED_NORMALIZED, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
678 AddRGBAFormat(&map, GL_RGB10_A2, true, 10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireES<3, 0>, RequireES<3, 0>, AlwaysSupported);
679 AddRGBAFormat(&map, GL_RGB10_A2UI, true, 10, 10, 10, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
680 AddRGBAFormat(&map, GL_SRGB8, true, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireESOrExt<3, 0, &Extensions::sRGB>, NeverSupported, AlwaysSupported);
681 AddRGBAFormat(&map, GL_SRGB8_ALPHA8, true, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireESOrExt<3, 0, &Extensions::sRGB>, RequireESOrExt<3, 0, &Extensions::sRGB>, AlwaysSupported);
682 AddRGBAFormat(&map, GL_RGB9_E5, true, 9, 9, 9, 0, 5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_FLOAT, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
683 AddRGBAFormat(&map, GL_R8I, true, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
684 AddRGBAFormat(&map, GL_R8UI, true, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
685 AddRGBAFormat(&map, GL_R16I, true, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
686 AddRGBAFormat(&map, GL_R16UI, true, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
687 AddRGBAFormat(&map, GL_R32I, true, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
688 AddRGBAFormat(&map, GL_R32UI, true, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
689 AddRGBAFormat(&map, GL_RG8I, true, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
690 AddRGBAFormat(&map, GL_RG8UI, true, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
691 AddRGBAFormat(&map, GL_RG16I, true, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
692 AddRGBAFormat(&map, GL_RG16UI, true, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
693 AddRGBAFormat(&map, GL_RG32I, true, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
694 AddRGBAFormat(&map, GL_R11F_G11F_B10F, true, 11, 11, 10, 0, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT, false, RequireES<3, 0>, RequireExt<&Extensions::colorBufferFloat>, AlwaysSupported);
695 AddRGBAFormat(&map, GL_RG32UI, true, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
696 AddRGBAFormat(&map, GL_RGB8I, true, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
697 AddRGBAFormat(&map, GL_RGB8UI, true, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
698 AddRGBAFormat(&map, GL_RGB16I, true, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
699 AddRGBAFormat(&map, GL_RGB16UI, true, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
700 AddRGBAFormat(&map, GL_RGB32I, true, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
701 AddRGBAFormat(&map, GL_RGB32UI, true, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
702 AddRGBAFormat(&map, GL_RGBA8I, true, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
703 AddRGBAFormat(&map, GL_RGBA8UI, true, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
704 AddRGBAFormat(&map, GL_RGBA16I, true, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
705 AddRGBAFormat(&map, GL_RGBA16UI, true, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
706 AddRGBAFormat(&map, GL_RGBA32I, true, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
707 AddRGBAFormat(&map, GL_RGBA32UI, true, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, RequireES<3, 0>, NeverSupported);
Jamie Madilla3944d42016-07-22 22:13:26 -0400708
Geoff Langca271392017-04-05 12:30:00 -0400709 AddRGBAFormat(&map, GL_BGRA8_EXT, true, 8, 8, 8, 8, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported);
710 AddRGBAFormat(&map, GL_BGRA4_ANGLEX, true, 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);
711 AddRGBAFormat(&map, GL_BGR5_A1_ANGLEX, true, 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 +0000712
Jamie Madillec0b5802016-07-04 13:11:59 -0400713 // Special format which is not really supported, so always false for all supports.
Geoff Langca271392017-04-05 12:30:00 -0400714 AddRGBAFormat(&map, GL_BGR565_ANGLEX, true, 5, 6, 5, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported);
Jamie Madillec0b5802016-07-04 13:11:59 -0400715
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000716 // Floating point renderability and filtering is provided by OES_texture_float and OES_texture_half_float
Geoff Lang677bb6f2017-04-05 12:40:40 -0400717 // | Internal format |sized| D |S | Format | Type | Comp | SRGB | Texture supported | Renderable | Filterable |
718 // | | | | | | | type | | | | |
719 AddRGBAFormat(&map, GL_R16F, true, 16, 0, 0, 0, 0, GL_RED, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatRGSupport, HalfFloatRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
720 AddRGBAFormat(&map, GL_RG16F, true, 16, 16, 0, 0, 0, GL_RG, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatRGSupport, HalfFloatRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
721 AddRGBAFormat(&map, GL_RGB16F, true, 16, 16, 16, 0, 0, GL_RGB, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatSupport, HalfFloatRGBRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
722 AddRGBAFormat(&map, GL_RGBA16F, true, 16, 16, 16, 16, 0, GL_RGBA, GL_HALF_FLOAT, GL_FLOAT, false, HalfFloatSupport, HalfFloatRGBARenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
723 AddRGBAFormat(&map, GL_R32F, true, 32, 0, 0, 0, 0, GL_RED, GL_FLOAT, GL_FLOAT, false, FloatRGSupport, FloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
724 AddRGBAFormat(&map, GL_RG32F, true, 32, 32, 0, 0, 0, GL_RG, GL_FLOAT, GL_FLOAT, false, FloatRGSupport, FloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
725 AddRGBAFormat(&map, GL_RGB32F, true, 32, 32, 32, 0, 0, GL_RGB, GL_FLOAT, GL_FLOAT, false, FloatSupport, FloatRGBRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
726 AddRGBAFormat(&map, GL_RGBA32F, true, 32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, GL_FLOAT, false, FloatSupport, FloatRGBARenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000727
728 // Depth stencil formats
Geoff Langca271392017-04-05 12:30:00 -0400729 // | Internal format |sized| D |S | X | Format | Type | Component type | Supported | Renderable | Filterable |
730 AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT16, true, 16, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, RequireESOrExt<3, 0, &Extensions::depthTextures>);
731 AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT24, true, 24, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireES<3, 0>, RequireES<3, 0>, RequireESOrExt<3, 0, &Extensions::depthTextures>);
732 AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32F, true, 32, 0, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_FLOAT, RequireES<3, 0>, RequireES<3, 0>, RequireESOrExt<3, 0, &Extensions::depthTextures>);
733 AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT32_OES, true, 32, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireExtOrExt<&Extensions::depthTextures, &Extensions::depth32>, RequireExtOrExt<&Extensions::depthTextures, &Extensions::depth32>, AlwaysSupported );
734 AddDepthStencilFormat(&map, GL_DEPTH24_STENCIL8, true, 24, 8, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_NORMALIZED, RequireESOrExt<3, 0, &Extensions::depthTextures>, RequireESOrExtOrExt<3, 0, &Extensions::depthTextures, &Extensions::packedDepthStencil>, AlwaysSupported );
735 AddDepthStencilFormat(&map, GL_DEPTH32F_STENCIL8, true, 32, 8, 24, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT, RequireES<3, 0>, RequireES<3, 0>, AlwaysSupported );
Corentin Walleze0902642014-11-04 12:32:15 -0800736 // STENCIL_INDEX8 is special-cased, see around the bottom of the list.
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000737
738 // Luminance alpha formats
Geoff Lang677bb6f2017-04-05 12:40:40 -0400739 // | Internal format |sized| L | A | Format | Type | Component type | Supported | Renderable | Filterable |
740 AddLUMAFormat(&map, GL_ALPHA8_EXT, true, 0, 8, GL_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported);
741 AddLUMAFormat(&map, GL_LUMINANCE8_EXT, true, 8, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported);
742 AddLUMAFormat(&map, GL_LUMINANCE8_ALPHA8_EXT, true, 8, 8, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireExt<&Extensions::textureStorage>, NeverSupported, AlwaysSupported);
743 AddLUMAFormat(&map, GL_ALPHA16F_EXT, true, 0, 16, GL_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
744 AddLUMAFormat(&map, GL_LUMINANCE16F_EXT, true, 16, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
745 AddLUMAFormat(&map, GL_LUMINANCE_ALPHA16F_EXT, true, 16, 16, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureHalfFloat>, NeverSupported, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
746 AddLUMAFormat(&map, GL_ALPHA32F_EXT, true, 0, 32, GL_ALPHA, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear>);
747 AddLUMAFormat(&map, GL_LUMINANCE32F_EXT, true, 32, 0, GL_LUMINANCE, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear>);
748 AddLUMAFormat(&map, GL_LUMINANCE_ALPHA32F_EXT, true, 32, 32, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_FLOAT, RequireExtAndExt<&Extensions::textureStorage, &Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear>);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000749
750 // Compressed formats, From ES 3.0.1 spec, table 3.16
Geoff Langca271392017-04-05 12:30:00 -0400751 // | Internal format |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
752 AddCompressedFormat(&map, GL_COMPRESSED_R11_EAC, 4, 4, 64, 1, GL_RED, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
753 AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_R11_EAC, 4, 4, 64, 1, GL_RED, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
754 AddCompressedFormat(&map, GL_COMPRESSED_RG11_EAC, 4, 4, 128, 2, GL_RG, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
755 AddCompressedFormat(&map, GL_COMPRESSED_SIGNED_RG11_EAC, 4, 4, 128, 2, GL_RG, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
756 AddCompressedFormat(&map, GL_COMPRESSED_RGB8_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
757 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireES<3, 0>, NeverSupported, AlwaysSupported);
758 AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
759 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireES<3, 0>, NeverSupported, AlwaysSupported);
760 AddCompressedFormat(&map, GL_COMPRESSED_RGBA8_ETC2_EAC, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireES<3, 0>, NeverSupported, AlwaysSupported);
761 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireES<3, 0>, NeverSupported, AlwaysSupported);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000762
763 // From GL_EXT_texture_compression_dxt1
Geoff Langca271392017-04-05 12:30:00 -0400764 // | Internal format |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
765 AddCompressedFormat(&map, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, NeverSupported, AlwaysSupported);
766 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT1>, NeverSupported, AlwaysSupported);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000767
768 // From GL_ANGLE_texture_compression_dxt3
Geoff Lang86f81162017-10-30 15:10:45 -0400769 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT3>, NeverSupported, AlwaysSupported);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000770
771 // From GL_ANGLE_texture_compression_dxt5
Geoff Langca271392017-04-05 12:30:00 -0400772 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::textureCompressionDXT5>, NeverSupported, AlwaysSupported);
Geoff Lang6ea6f942015-09-11 13:11:22 -0400773
774 // From GL_OES_compressed_ETC1_RGB8_texture
Geoff Langca271392017-04-05 12:30:00 -0400775 AddCompressedFormat(&map, GL_ETC1_RGB8_OES, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::compressedETC1RGB8Texture>, NeverSupported, AlwaysSupported);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000776
Kai Ninomiya02f075c2016-12-22 14:55:46 -0800777 // From GL_EXT_texture_compression_s3tc_srgb
Geoff Langca271392017-04-05 12:30:00 -0400778 // | Internal format |W |H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
779 AddCompressedFormat(&map, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
780 AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 4, 4, 64, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
781 AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
782 AddCompressedFormat(&map, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::textureCompressionS3TCsRGB>, NeverSupported, AlwaysSupported);
Kai Ninomiya02f075c2016-12-22 14:55:46 -0800783
Geoff Lang60ad73d2015-10-23 10:08:44 -0400784 // From KHR_texture_compression_astc_hdr
Geoff Langca271392017-04-05 12:30:00 -0400785 // | Internal format | W | H | BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
786 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
787 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 5, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
788 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 5, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
789 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 6, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
790 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 6, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
791 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 8, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
792 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 8, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
793 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 8, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
794 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 10, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
795 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 10, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
796 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 10, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
797 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 10, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
798 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 12, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
799 AddCompressedFormat(&map, GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 12, 12, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
Geoff Lang60ad73d2015-10-23 10:08:44 -0400800
Geoff Langca271392017-04-05 12:30:00 -0400801 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 4, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
802 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 5, 4, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
803 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 5, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
804 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 6, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
805 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 6, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
806 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 8, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
807 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 8, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
808 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 8, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
809 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 10, 5, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
810 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 10, 6, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
811 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 10, 8, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
812 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 10, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
813 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 12, 10, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
814 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 12, 12, 128, 4, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExtOrExt<&Extensions::textureCompressionASTCHDR, &Extensions::textureCompressionASTCLDR>, NeverSupported, AlwaysSupported);
Geoff Lang60ad73d2015-10-23 10:08:44 -0400815
Corentin Walleze0902642014-11-04 12:32:15 -0800816 // For STENCIL_INDEX8 we chose a normalized component type for the following reasons:
817 // - Multisampled buffer are disallowed for non-normalized integer component types and we want to support it for STENCIL_INDEX8
818 // - All other stencil formats (all depth-stencil) are either float or normalized
819 // - It affects only validation of internalformat in RenderbufferStorageMultisample.
Geoff Langca271392017-04-05 12:30:00 -0400820 // | Internal format |sized|D |S |X | Format | Type | Component type | Supported | Renderable | Filterable |
821 AddDepthStencilFormat(&map, GL_STENCIL_INDEX8, true, 0, 8, 0, GL_STENCIL, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, NeverSupported);
Minmin Gonge3939b92015-12-01 15:36:51 -0800822
823 // From GL_ANGLE_lossy_etc_decode
Geoff Langca271392017-04-05 12:30:00 -0400824 // | Internal format |W |H |BS |CC| Format | Type | SRGB | Supported | Renderable | Filterable |
825 AddCompressedFormat(&map, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
826 AddCompressedFormat(&map, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
827 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGB, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
828 AddCompressedFormat(&map, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGBA, GL_UNSIGNED_BYTE, false, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
829 AddCompressedFormat(&map, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4, 64, 3, GL_RGBA, GL_UNSIGNED_BYTE, true, RequireExt<&Extensions::lossyETCDecode>, NeverSupported, AlwaysSupported);
Minmin Gonge3939b92015-12-01 15:36:51 -0800830
Vincent Lang25ab4512016-05-13 18:13:59 +0200831 // From GL_EXT_texture_norm16
Geoff Langca271392017-04-05 12:30:00 -0400832 // | Internal format |sized| R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Renderable | Filterable |
833 AddRGBAFormat(&map, GL_R16_EXT, true, 16, 0, 0, 0, 0, GL_RED, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, RequireExt<&Extensions::textureNorm16>, AlwaysSupported);
834 AddRGBAFormat(&map, GL_R16_SNORM_EXT, true, 16, 0, 0, 0, 0, GL_RED, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
835 AddRGBAFormat(&map, GL_RG16_EXT, true, 16, 16, 0, 0, 0, GL_RG, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, RequireExt<&Extensions::textureNorm16>, AlwaysSupported);
836 AddRGBAFormat(&map, GL_RG16_SNORM_EXT, true, 16, 16, 0, 0, 0, GL_RG, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
837 AddRGBAFormat(&map, GL_RGB16_EXT, true, 16, 16, 16, 0, 0, GL_RGB, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
838 AddRGBAFormat(&map, GL_RGB16_SNORM_EXT, true, 16, 16, 16, 0, 0, GL_RGB, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
839 AddRGBAFormat(&map, GL_RGBA16_EXT, true, 16, 16, 16, 16, 0, GL_RGBA, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, RequireExt<&Extensions::textureNorm16>, AlwaysSupported);
840 AddRGBAFormat(&map, GL_RGBA16_SNORM_EXT, true, 16, 16, 16, 16, 0, GL_RGBA, GL_SHORT, GL_SIGNED_NORMALIZED, false, RequireExt<&Extensions::textureNorm16>, NeverSupported, AlwaysSupported);
Vincent Lang25ab4512016-05-13 18:13:59 +0200841
Geoff Langca271392017-04-05 12:30:00 -0400842 // Unsized formats
843 // | Internal format |sized | R | G | B | A |S | Format | Type | Component type | SRGB | Texture supported | Renderable | Filterable |
Geoff Lang8d4db1f2017-06-02 14:32:01 -0400844 AddRGBAFormat(&map, GL_RED, false, 8, 0, 0, 0, 0, GL_RED, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>, AlwaysSupported, AlwaysSupported);
Geoff Langdbcced82017-06-06 15:55:54 -0400845 AddRGBAFormat(&map, GL_RED, false, 8, 0, 0, 0, 0, GL_RED, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
Geoff Lang8d4db1f2017-06-02 14:32:01 -0400846 AddRGBAFormat(&map, GL_RG, false, 8, 8, 0, 0, 0, GL_RG, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureRG>, AlwaysSupported, AlwaysSupported);
Geoff Langdbcced82017-06-06 15:55:54 -0400847 AddRGBAFormat(&map, GL_RG, false, 8, 8, 0, 0, 0, GL_RG, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
Geoff Langd84a00b2017-10-27 17:27:26 -0400848 AddRGBAFormat(&map, GL_RGB, false, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, AlwaysSupported, AlwaysSupported);
Geoff Langca271392017-04-05 12:30:00 -0400849 AddRGBAFormat(&map, GL_RGB, false, 5, 6, 5, 0, 0, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
Geoff Langdbcced82017-06-06 15:55:54 -0400850 AddRGBAFormat(&map, GL_RGB, false, 8, 8, 8, 0, 0, GL_RGB, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
Geoff Langca271392017-04-05 12:30:00 -0400851 AddRGBAFormat(&map, GL_RGBA, false, 4, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
852 AddRGBAFormat(&map, GL_RGBA, false, 5, 5, 5, 1, 0, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
853 AddRGBAFormat(&map, GL_RGBA, false, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
854 AddRGBAFormat(&map, GL_RGBA, false, 10, 10, 10, 2, 0, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_NORMALIZED, false, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
Geoff Langdbcced82017-06-06 15:55:54 -0400855 AddRGBAFormat(&map, GL_RGBA, false, 8, 8, 8, 8, 0, GL_RGBA, GL_BYTE, GL_SIGNED_NORMALIZED, false, NeverSupported, NeverSupported, NeverSupported );
Geoff Langca271392017-04-05 12:30:00 -0400856 AddRGBAFormat(&map, GL_SRGB, false, 8, 8, 8, 0, 0, GL_RGB, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireExt<&Extensions::sRGB>, NeverSupported, AlwaysSupported);
857 AddRGBAFormat(&map, GL_SRGB_ALPHA_EXT, false, 8, 8, 8, 8, 0, GL_RGBA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, true, RequireExt<&Extensions::sRGB>, RequireExt<&Extensions::sRGB>, AlwaysSupported);
858
859 AddRGBAFormat(&map, GL_BGRA_EXT, false, 8, 8, 8, 8, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, false, RequireExt<&Extensions::textureFormatBGRA8888>, RequireExt<&Extensions::textureFormatBGRA8888>, AlwaysSupported);
860
861 // Unsized integer formats
862 // |Internal format |sized | R | G | B | A |S | Format | Type | Component type | SRGB | Texture | Renderable | Filterable |
863 AddRGBAFormat(&map, GL_RED_INTEGER, false, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
864 AddRGBAFormat(&map, GL_RED_INTEGER, false, 8, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
865 AddRGBAFormat(&map, GL_RED_INTEGER, false, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
866 AddRGBAFormat(&map, GL_RED_INTEGER, false, 16, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
867 AddRGBAFormat(&map, GL_RED_INTEGER, false, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
868 AddRGBAFormat(&map, GL_RED_INTEGER, false, 32, 0, 0, 0, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
869 AddRGBAFormat(&map, GL_RG_INTEGER, false, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
870 AddRGBAFormat(&map, GL_RG_INTEGER, false, 8, 8, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
871 AddRGBAFormat(&map, GL_RG_INTEGER, false, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
872 AddRGBAFormat(&map, GL_RG_INTEGER, false, 16, 16, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
873 AddRGBAFormat(&map, GL_RG_INTEGER, false, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
874 AddRGBAFormat(&map, GL_RG_INTEGER, false, 32, 32, 0, 0, 0, GL_RG_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
875 AddRGBAFormat(&map, GL_RGB_INTEGER, false, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
876 AddRGBAFormat(&map, GL_RGB_INTEGER, false, 8, 8, 8, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
877 AddRGBAFormat(&map, GL_RGB_INTEGER, false, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
878 AddRGBAFormat(&map, GL_RGB_INTEGER, false, 16, 16, 16, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
879 AddRGBAFormat(&map, GL_RGB_INTEGER, false, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
880 AddRGBAFormat(&map, GL_RGB_INTEGER, false, 32, 32, 32, 0, 0, GL_RGB_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
881 AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_BYTE, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
882 AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 8, 8, 8, 8, 0, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
883 AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_SHORT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
884 AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 16, 16, 16, 16, 0, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
885 AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_INT, GL_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
886 AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 32, 32, 32, 32, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
887 AddRGBAFormat(&map, GL_RGBA_INTEGER, false, 10, 10, 10, 2, 0, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV, GL_UNSIGNED_INT, false, RequireES<3, 0>, NeverSupported, NeverSupported);
888
889 // Unsized floating point formats
Geoff Lang677bb6f2017-04-05 12:40:40 -0400890 // |Internal format |sized | R | G | B | A |S | Format | Type | Comp | SRGB | Texture supported | Renderable | Filterable |
891 AddRGBAFormat(&map, GL_RED, false, 16, 0, 0, 0, 0, GL_RED, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
892 AddRGBAFormat(&map, GL_RG, false, 16, 16, 0, 0, 0, GL_RG, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
893 AddRGBAFormat(&map, GL_RGB, false, 16, 16, 16, 0, 0, GL_RGB, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
894 AddRGBAFormat(&map, GL_RGBA, false, 16, 16, 16, 16, 0, GL_RGBA, GL_HALF_FLOAT, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
895 AddRGBAFormat(&map, GL_RED, false, 16, 0, 0, 0, 0, GL_RED, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESRGSupport, UnsizedHalfFloatOESRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
896 AddRGBAFormat(&map, GL_RG, false, 16, 16, 0, 0, 0, GL_RG, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESRGSupport, UnsizedHalfFloatOESRGRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
897 AddRGBAFormat(&map, GL_RGB, false, 16, 16, 16, 0, 0, GL_RGB, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESSupport, UnsizedHalfFloatOESRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
898 AddRGBAFormat(&map, GL_RGBA, false, 16, 16, 16, 16, 0, GL_RGBA, GL_HALF_FLOAT_OES, GL_FLOAT, false, UnsizedHalfFloatOESSupport, UnsizedHalfFloatOESRenderableSupport, RequireESOrExt<3, 0, &Extensions::textureHalfFloatLinear>);
899 AddRGBAFormat(&map, GL_RED, false, 32, 0, 0, 0, 0, GL_RED, GL_FLOAT, GL_FLOAT, false, UnsizedFloatRGSupport, UnsizedFloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
900 AddRGBAFormat(&map, GL_RG, false, 32, 32, 0, 0, 0, GL_RG, GL_FLOAT, GL_FLOAT, false, UnsizedFloatRGSupport, UnsizedFloatRGRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
901 AddRGBAFormat(&map, GL_RGB, false, 32, 32, 32, 0, 0, GL_RGB, GL_FLOAT, GL_FLOAT, false, UnsizedFloatSupport, UnsizedFloatRGBRenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
Geoff Langdbcced82017-06-06 15:55:54 -0400902 AddRGBAFormat(&map, GL_RGB, false, 9, 9, 9, 0, 5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
903 AddRGBAFormat(&map, GL_RGB, false, 11, 11, 10, 0, 0, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV, GL_FLOAT, false, NeverSupported, NeverSupported, NeverSupported );
Geoff Lang677bb6f2017-04-05 12:40:40 -0400904 AddRGBAFormat(&map, GL_RGBA, false, 32, 32, 32, 32, 0, GL_RGBA, GL_FLOAT, GL_FLOAT, false, UnsizedFloatSupport, UnsizedFloatRGBARenderableSupport, RequireExt<&Extensions::textureFloatLinear> );
Geoff Langca271392017-04-05 12:30:00 -0400905
906 // Unsized luminance alpha formats
Geoff Lang677bb6f2017-04-05 12:40:40 -0400907 // | Internal format |sized | L | A | Format | Type | Component type | Supported | Renderable | Filterable |
908 AddLUMAFormat(&map, GL_ALPHA, false, 0, 8, GL_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, NeverSupported, AlwaysSupported );
909 AddLUMAFormat(&map, GL_LUMINANCE, false, 8, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, NeverSupported, AlwaysSupported );
910 AddLUMAFormat(&map, GL_LUMINANCE_ALPHA, false, 8, 8, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, NeverSupported, AlwaysSupported );
911 AddLUMAFormat(&map, GL_ALPHA, false, 0, 16, GL_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExt<&Extensions::textureHalfFloat>, NeverSupported, RequireExt<&Extensions::textureHalfFloatLinear>);
912 AddLUMAFormat(&map, GL_LUMINANCE, false, 16, 0, GL_LUMINANCE, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExt<&Extensions::textureHalfFloat>, NeverSupported, RequireExt<&Extensions::textureHalfFloatLinear>);
913 AddLUMAFormat(&map, GL_LUMINANCE_ALPHA ,false, 16, 16, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES, GL_FLOAT, RequireExt<&Extensions::textureHalfFloat>, NeverSupported, RequireExt<&Extensions::textureHalfFloatLinear>);
914 AddLUMAFormat(&map, GL_ALPHA, false, 0, 32, GL_ALPHA, GL_FLOAT, GL_FLOAT, RequireExt<&Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear> );
915 AddLUMAFormat(&map, GL_LUMINANCE, false, 32, 0, GL_LUMINANCE, GL_FLOAT, GL_FLOAT, RequireExt<&Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear> );
916 AddLUMAFormat(&map, GL_LUMINANCE_ALPHA, false, 32, 32, GL_LUMINANCE_ALPHA, GL_FLOAT, GL_FLOAT, RequireExt<&Extensions::textureFloat>, NeverSupported, RequireExt<&Extensions::textureFloatLinear> );
Geoff Langca271392017-04-05 12:30:00 -0400917
918 // Unsized depth stencil formats
919 // | Internal format |sized | D |S | X | Format | Type | Component type | Supported | Renderable | Filterable |
920 AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT, false, 16, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
921 AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT, false, 24, 0, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
922 AddDepthStencilFormat(&map, GL_DEPTH_COMPONENT, false, 32, 0, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_FLOAT, RequireES<2, 0>, RequireES<2, 0>, AlwaysSupported);
923 AddDepthStencilFormat(&map, GL_DEPTH_STENCIL, false, 24, 8, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_UNSIGNED_NORMALIZED, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, AlwaysSupported);
924 AddDepthStencilFormat(&map, GL_DEPTH_STENCIL, false, 32, 8, 24, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, GL_FLOAT, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, RequireESOrExt<3, 0, &Extensions::packedDepthStencil>, AlwaysSupported);
925 AddDepthStencilFormat(&map, GL_STENCIL, false, 0, 8, 0, GL_STENCIL, GL_UNSIGNED_BYTE, GL_UNSIGNED_NORMALIZED, RequireES<2, 0>, RequireES<2, 0>, NeverSupported);
Geoff Lang9bbad182015-09-04 11:07:29 -0400926 // clang-format on
Corentin Walleze0902642014-11-04 12:32:15 -0800927
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000928 return map;
929}
930
Geoff Lange4a492b2014-06-19 14:14:41 -0400931static const InternalFormatInfoMap &GetInternalFormatMap()
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000932{
Geoff Lange4a492b2014-06-19 14:14:41 -0400933 static const InternalFormatInfoMap formatMap = BuildInternalFormatInfoMap();
934 return formatMap;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000935}
936
Geoff Lange4a492b2014-06-19 14:14:41 -0400937static FormatSet BuildAllSizedInternalFormatSet()
Geoff Langcec35902014-04-16 10:52:36 -0400938{
939 FormatSet result;
940
Geoff Langca271392017-04-05 12:30:00 -0400941 for (const auto &internalFormat : GetInternalFormatMap())
Geoff Langcec35902014-04-16 10:52:36 -0400942 {
Geoff Langca271392017-04-05 12:30:00 -0400943 for (const auto &type : internalFormat.second)
Geoff Langcec35902014-04-16 10:52:36 -0400944 {
Geoff Langca271392017-04-05 12:30:00 -0400945 if (type.second.sized)
946 {
947 // TODO(jmadill): Fix this hack.
948 if (internalFormat.first == GL_BGR565_ANGLEX)
949 continue;
Jamie Madillec0b5802016-07-04 13:11:59 -0400950
Geoff Langca271392017-04-05 12:30:00 -0400951 result.insert(internalFormat.first);
952 }
Geoff Langcec35902014-04-16 10:52:36 -0400953 }
954 }
955
956 return result;
957}
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000958
Geoff Lang5d601382014-07-22 15:14:06 -0400959const Type &GetTypeInfo(GLenum type)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000960{
Olli Etuaho31f8f4f2015-03-25 16:03:57 +0200961 switch (type)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +0000962 {
Olli Etuaho31f8f4f2015-03-25 16:03:57 +0200963 case GL_UNSIGNED_BYTE:
964 case GL_BYTE:
965 {
966 static const Type info = GenTypeInfo(1, false);
967 return info;
968 }
969 case GL_UNSIGNED_SHORT:
970 case GL_SHORT:
971 case GL_HALF_FLOAT:
972 case GL_HALF_FLOAT_OES:
973 {
974 static const Type info = GenTypeInfo(2, false);
975 return info;
976 }
977 case GL_UNSIGNED_INT:
978 case GL_INT:
979 case GL_FLOAT:
980 {
981 static const Type info = GenTypeInfo(4, false);
982 return info;
983 }
984 case GL_UNSIGNED_SHORT_5_6_5:
985 case GL_UNSIGNED_SHORT_4_4_4_4:
986 case GL_UNSIGNED_SHORT_5_5_5_1:
987 case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
988 case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
989 {
990 static const Type info = GenTypeInfo(2, true);
991 return info;
992 }
993 case GL_UNSIGNED_INT_2_10_10_10_REV:
994 case GL_UNSIGNED_INT_24_8:
995 case GL_UNSIGNED_INT_10F_11F_11F_REV:
996 case GL_UNSIGNED_INT_5_9_9_9_REV:
997 {
998 ASSERT(GL_UNSIGNED_INT_24_8_OES == GL_UNSIGNED_INT_24_8);
999 static const Type info = GenTypeInfo(4, true);
1000 return info;
1001 }
1002 case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
1003 {
1004 static const Type info = GenTypeInfo(8, true);
1005 return info;
1006 }
1007 default:
1008 {
1009 static const Type defaultInfo;
1010 return defaultInfo;
1011 }
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001012 }
1013}
1014
Geoff Langca271392017-04-05 12:30:00 -04001015const InternalFormat &GetSizedInternalFormatInfo(GLenum internalFormat)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001016{
Geoff Langca271392017-04-05 12:30:00 -04001017 static const InternalFormat defaultInternalFormat;
Geoff Lang5d601382014-07-22 15:14:06 -04001018 const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
Jamie Madillec0b5802016-07-04 13:11:59 -04001019 auto iter = formatMap.find(internalFormat);
Geoff Langca271392017-04-05 12:30:00 -04001020
1021 // Sized internal formats only have one type per entry
1022 if (iter == formatMap.end() || iter->second.size() != 1)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001023 {
Geoff Lang5d601382014-07-22 15:14:06 -04001024 return defaultInternalFormat;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001025 }
Geoff Langca271392017-04-05 12:30:00 -04001026
1027 const InternalFormat &internalFormatInfo = iter->second.begin()->second;
1028 if (!internalFormatInfo.sized)
1029 {
1030 return defaultInternalFormat;
1031 }
1032
1033 return internalFormatInfo;
1034}
1035
1036const InternalFormat &GetInternalFormatInfo(GLenum internalFormat, GLenum type)
1037{
1038 static const InternalFormat defaultInternalFormat;
1039 const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
1040
1041 auto internalFormatIter = formatMap.find(internalFormat);
1042 if (internalFormatIter == formatMap.end())
1043 {
1044 return defaultInternalFormat;
1045 }
1046
1047 // If the internal format is sized, simply return it without the type check.
1048 if (internalFormatIter->second.size() == 1 && internalFormatIter->second.begin()->second.sized)
1049 {
1050 return internalFormatIter->second.begin()->second;
1051 }
1052
1053 auto typeIter = internalFormatIter->second.find(type);
1054 if (typeIter == internalFormatIter->second.end())
1055 {
1056 return defaultInternalFormat;
1057 }
1058
1059 return typeIter->second;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001060}
1061
Corentin Wallezc5cacd62016-09-14 14:50:24 -04001062GLuint InternalFormat::computePixelBytes(GLenum formatType) const
1063{
1064 const auto &typeInfo = GetTypeInfo(formatType);
1065 GLuint components = typeInfo.specialInterpretation ? 1u : componentCount;
1066 return components * typeInfo.bytes;
1067}
1068
Corentin Wallez886de362016-09-27 10:49:35 -04001069ErrorOrResult<GLuint> InternalFormat::computeRowPitch(GLenum formatType,
Jamie Madille2e406c2016-06-02 13:04:10 -04001070 GLsizei width,
1071 GLint alignment,
1072 GLint rowLength) const
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001073{
Jamie Madill4b4cdff2016-06-06 13:53:38 -07001074 // Compressed images do not use pack/unpack parameters.
1075 if (compressed)
1076 {
1077 ASSERT(rowLength == 0);
Jeff Gilbert48590352017-11-07 16:03:38 -08001078 return computeCompressedImageSize(Extents(width, 1, 1));
Jamie Madill4b4cdff2016-06-06 13:53:38 -07001079 }
1080
Geoff Lang3f234062016-07-13 15:35:45 -04001081 CheckedNumeric<GLuint> checkedWidth(rowLength > 0 ? rowLength : width);
Corentin Wallezc5cacd62016-09-14 14:50:24 -04001082 CheckedNumeric<GLuint> checkedRowBytes = checkedWidth * computePixelBytes(formatType);
Jamie Madill4b4cdff2016-06-06 13:53:38 -07001083
1084 ASSERT(alignment > 0 && isPow2(alignment));
1085 CheckedNumeric<GLuint> checkedAlignment(alignment);
1086 auto aligned = rx::roundUp(checkedRowBytes, checkedAlignment);
1087 ANGLE_TRY_CHECKED_MATH(aligned);
1088 return aligned.ValueOrDie();
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001089}
1090
Corentin Wallez0e487192016-10-03 16:30:38 -04001091ErrorOrResult<GLuint> InternalFormat::computeDepthPitch(GLsizei height,
1092 GLint imageHeight,
1093 GLuint rowPitch) const
1094{
1095 GLuint rows =
1096 (imageHeight > 0 ? static_cast<GLuint>(imageHeight) : static_cast<GLuint>(height));
1097 CheckedNumeric<GLuint> checkedRowPitch(rowPitch);
1098
1099 auto depthPitch = checkedRowPitch * rows;
1100 ANGLE_TRY_CHECKED_MATH(depthPitch);
1101 return depthPitch.ValueOrDie();
1102}
1103
Corentin Wallez886de362016-09-27 10:49:35 -04001104ErrorOrResult<GLuint> InternalFormat::computeDepthPitch(GLenum formatType,
Jamie Madille2e406c2016-06-02 13:04:10 -04001105 GLsizei width,
1106 GLsizei height,
1107 GLint alignment,
1108 GLint rowLength,
1109 GLint imageHeight) const
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001110{
Jamie Madille2e406c2016-06-02 13:04:10 -04001111 GLuint rowPitch = 0;
1112 ANGLE_TRY_RESULT(computeRowPitch(formatType, width, alignment, rowLength), rowPitch);
Corentin Wallez0e487192016-10-03 16:30:38 -04001113 return computeDepthPitch(height, imageHeight, rowPitch);
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001114}
1115
Jeff Gilbert48590352017-11-07 16:03:38 -08001116ErrorOrResult<GLuint> InternalFormat::computeCompressedImageSize(const Extents &size) const
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001117{
Jamie Madill513558d2016-06-02 13:04:11 -04001118 CheckedNumeric<GLuint> checkedWidth(size.width);
1119 CheckedNumeric<GLuint> checkedHeight(size.height);
1120 CheckedNumeric<GLuint> checkedDepth(size.depth);
Jamie Madill4b4cdff2016-06-06 13:53:38 -07001121 CheckedNumeric<GLuint> checkedBlockWidth(compressedBlockWidth);
1122 CheckedNumeric<GLuint> checkedBlockHeight(compressedBlockHeight);
Jamie Madille2e406c2016-06-02 13:04:10 -04001123
Jamie Madill4b4cdff2016-06-06 13:53:38 -07001124 ASSERT(compressed);
1125 auto numBlocksWide = (checkedWidth + checkedBlockWidth - 1u) / checkedBlockWidth;
1126 auto numBlocksHigh = (checkedHeight + checkedBlockHeight - 1u) / checkedBlockHeight;
1127 auto bytes = numBlocksWide * numBlocksHigh * pixelBytes * checkedDepth;
1128 ANGLE_TRY_CHECKED_MATH(bytes);
1129 return bytes.ValueOrDie();
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001130}
1131
Corentin Wallez886de362016-09-27 10:49:35 -04001132ErrorOrResult<GLuint> InternalFormat::computeSkipBytes(GLuint rowPitch,
Olli Etuaho989cac32016-06-08 16:18:49 -07001133 GLuint depthPitch,
Corentin Wallez886de362016-09-27 10:49:35 -04001134 const PixelStoreStateBase &state,
1135 bool is3D) const
Minmin Gongadff67b2015-10-14 10:34:45 -04001136{
Olli Etuaho989cac32016-06-08 16:18:49 -07001137 CheckedNumeric<GLuint> checkedRowPitch(rowPitch);
1138 CheckedNumeric<GLuint> checkedDepthPitch(depthPitch);
Corentin Wallez886de362016-09-27 10:49:35 -04001139 CheckedNumeric<GLuint> checkedSkipImages(static_cast<GLuint>(state.skipImages));
1140 CheckedNumeric<GLuint> checkedSkipRows(static_cast<GLuint>(state.skipRows));
1141 CheckedNumeric<GLuint> checkedSkipPixels(static_cast<GLuint>(state.skipPixels));
Olli Etuaho989cac32016-06-08 16:18:49 -07001142 CheckedNumeric<GLuint> checkedPixelBytes(pixelBytes);
1143 auto checkedSkipImagesBytes = checkedSkipImages * checkedDepthPitch;
Corentin Wallez886de362016-09-27 10:49:35 -04001144 if (!is3D)
Olli Etuaho989cac32016-06-08 16:18:49 -07001145 {
1146 checkedSkipImagesBytes = 0;
1147 }
1148 auto skipBytes = checkedSkipImagesBytes + checkedSkipRows * checkedRowPitch +
1149 checkedSkipPixels * checkedPixelBytes;
1150 ANGLE_TRY_CHECKED_MATH(skipBytes);
1151 return skipBytes.ValueOrDie();
Minmin Gongadff67b2015-10-14 10:34:45 -04001152}
1153
Corentin Wallez886de362016-09-27 10:49:35 -04001154ErrorOrResult<GLuint> InternalFormat::computePackUnpackEndByte(
1155 GLenum formatType,
1156 const Extents &size,
1157 const PixelStoreStateBase &state,
1158 bool is3D) const
Corentin Wallezece7c5a2016-09-21 15:28:23 -04001159{
Corentin Wallez886de362016-09-27 10:49:35 -04001160 GLuint rowPitch = 0;
1161 ANGLE_TRY_RESULT(computeRowPitch(formatType, size.width, state.alignment, state.rowLength),
Corentin Wallezece7c5a2016-09-21 15:28:23 -04001162 rowPitch);
1163
Corentin Wallez0e487192016-10-03 16:30:38 -04001164 GLuint depthPitch = 0;
1165 if (is3D)
1166 {
1167 ANGLE_TRY_RESULT(computeDepthPitch(size.height, state.imageHeight, rowPitch), depthPitch);
1168 }
1169
Corentin Wallez886de362016-09-27 10:49:35 -04001170 CheckedNumeric<GLuint> checkedCopyBytes = 0;
Jamie Madill4b4cdff2016-06-06 13:53:38 -07001171 if (compressed)
1172 {
Jeff Gilbert48590352017-11-07 16:03:38 -08001173 ANGLE_TRY_RESULT(computeCompressedImageSize(size), checkedCopyBytes);
Jamie Madill4b4cdff2016-06-06 13:53:38 -07001174 }
Corentin Wallez886de362016-09-27 10:49:35 -04001175 else if (size.height != 0 && (!is3D || size.depth != 0))
Corentin Wallezece7c5a2016-09-21 15:28:23 -04001176 {
Corentin Wallez886de362016-09-27 10:49:35 -04001177 CheckedNumeric<GLuint> bytes = computePixelBytes(formatType);
1178 checkedCopyBytes += size.width * bytes;
1179
1180 CheckedNumeric<GLuint> heightMinusOne = size.height - 1;
1181 checkedCopyBytes += heightMinusOne * rowPitch;
1182
1183 if (is3D)
1184 {
1185 CheckedNumeric<GLuint> depthMinusOne = size.depth - 1;
1186 checkedCopyBytes += depthMinusOne * depthPitch;
1187 }
Corentin Wallezece7c5a2016-09-21 15:28:23 -04001188 }
1189
Corentin Wallez886de362016-09-27 10:49:35 -04001190 CheckedNumeric<GLuint> checkedSkipBytes = 0;
1191 ANGLE_TRY_RESULT(computeSkipBytes(rowPitch, depthPitch, state, is3D), checkedSkipBytes);
Corentin Wallezc5cacd62016-09-14 14:50:24 -04001192
1193 CheckedNumeric<GLuint> endByte = checkedCopyBytes + checkedSkipBytes;
1194
1195 ANGLE_TRY_CHECKED_MATH(endByte);
1196 return endByte.ValueOrDie();
1197}
1198
Geoff Langca271392017-04-05 12:30:00 -04001199GLenum GetUnsizedFormat(GLenum internalFormat)
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001200{
Geoff Langca271392017-04-05 12:30:00 -04001201 auto sizedFormatInfo = GetSizedInternalFormatInfo(internalFormat);
1202 if (sizedFormatInfo.internalFormat != GL_NONE)
Geoff Lang051dbc72015-01-05 15:48:58 -05001203 {
Geoff Langca271392017-04-05 12:30:00 -04001204 return sizedFormatInfo.format;
Geoff Lang051dbc72015-01-05 15:48:58 -05001205 }
Geoff Langca271392017-04-05 12:30:00 -04001206
1207 return internalFormat;
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00001208}
1209
Geoff Lange4a492b2014-06-19 14:14:41 -04001210const FormatSet &GetAllSizedInternalFormats()
Geoff Langcec35902014-04-16 10:52:36 -04001211{
Geoff Lange4a492b2014-06-19 14:14:41 -04001212 static FormatSet formatSet = BuildAllSizedInternalFormatSet();
Geoff Langcec35902014-04-16 10:52:36 -04001213 return formatSet;
1214}
1215
Jamie Madill09e2d932015-07-14 16:40:31 -04001216AttributeType GetAttributeType(GLenum enumValue)
1217{
1218 switch (enumValue)
1219 {
1220 case GL_FLOAT:
1221 return ATTRIBUTE_FLOAT;
1222 case GL_FLOAT_VEC2:
1223 return ATTRIBUTE_VEC2;
1224 case GL_FLOAT_VEC3:
1225 return ATTRIBUTE_VEC3;
1226 case GL_FLOAT_VEC4:
1227 return ATTRIBUTE_VEC4;
1228 case GL_INT:
1229 return ATTRIBUTE_INT;
1230 case GL_INT_VEC2:
1231 return ATTRIBUTE_IVEC2;
1232 case GL_INT_VEC3:
1233 return ATTRIBUTE_IVEC3;
1234 case GL_INT_VEC4:
1235 return ATTRIBUTE_IVEC4;
1236 case GL_UNSIGNED_INT:
1237 return ATTRIBUTE_UINT;
1238 case GL_UNSIGNED_INT_VEC2:
1239 return ATTRIBUTE_UVEC2;
1240 case GL_UNSIGNED_INT_VEC3:
1241 return ATTRIBUTE_UVEC3;
1242 case GL_UNSIGNED_INT_VEC4:
1243 return ATTRIBUTE_UVEC4;
1244 case GL_FLOAT_MAT2:
1245 return ATTRIBUTE_MAT2;
1246 case GL_FLOAT_MAT3:
1247 return ATTRIBUTE_MAT3;
1248 case GL_FLOAT_MAT4:
1249 return ATTRIBUTE_MAT4;
1250 case GL_FLOAT_MAT2x3:
1251 return ATTRIBUTE_MAT2x3;
1252 case GL_FLOAT_MAT2x4:
1253 return ATTRIBUTE_MAT2x4;
1254 case GL_FLOAT_MAT3x2:
1255 return ATTRIBUTE_MAT3x2;
1256 case GL_FLOAT_MAT3x4:
1257 return ATTRIBUTE_MAT3x4;
1258 case GL_FLOAT_MAT4x2:
1259 return ATTRIBUTE_MAT4x2;
1260 case GL_FLOAT_MAT4x3:
1261 return ATTRIBUTE_MAT4x3;
1262 default:
1263 UNREACHABLE();
1264 return ATTRIBUTE_FLOAT;
1265 }
1266}
1267
Jamie Madilld3dfda22015-07-06 08:28:49 -04001268VertexFormatType GetVertexFormatType(GLenum type, GLboolean normalized, GLuint components, bool pureInteger)
1269{
1270 switch (type)
1271 {
1272 case GL_BYTE:
1273 switch (components)
1274 {
1275 case 1:
1276 if (pureInteger)
1277 return VERTEX_FORMAT_SBYTE1_INT;
1278 if (normalized)
1279 return VERTEX_FORMAT_SBYTE1_NORM;
1280 return VERTEX_FORMAT_SBYTE1;
1281 case 2:
1282 if (pureInteger)
1283 return VERTEX_FORMAT_SBYTE2_INT;
1284 if (normalized)
1285 return VERTEX_FORMAT_SBYTE2_NORM;
1286 return VERTEX_FORMAT_SBYTE2;
1287 case 3:
1288 if (pureInteger)
1289 return VERTEX_FORMAT_SBYTE3_INT;
1290 if (normalized)
1291 return VERTEX_FORMAT_SBYTE3_NORM;
1292 return VERTEX_FORMAT_SBYTE3;
1293 case 4:
1294 if (pureInteger)
1295 return VERTEX_FORMAT_SBYTE4_INT;
1296 if (normalized)
1297 return VERTEX_FORMAT_SBYTE4_NORM;
1298 return VERTEX_FORMAT_SBYTE4;
1299 default:
1300 UNREACHABLE();
1301 break;
1302 }
1303 case GL_UNSIGNED_BYTE:
1304 switch (components)
1305 {
1306 case 1:
1307 if (pureInteger)
1308 return VERTEX_FORMAT_UBYTE1_INT;
1309 if (normalized)
1310 return VERTEX_FORMAT_UBYTE1_NORM;
1311 return VERTEX_FORMAT_UBYTE1;
1312 case 2:
1313 if (pureInteger)
1314 return VERTEX_FORMAT_UBYTE2_INT;
1315 if (normalized)
1316 return VERTEX_FORMAT_UBYTE2_NORM;
1317 return VERTEX_FORMAT_UBYTE2;
1318 case 3:
1319 if (pureInteger)
1320 return VERTEX_FORMAT_UBYTE3_INT;
1321 if (normalized)
1322 return VERTEX_FORMAT_UBYTE3_NORM;
1323 return VERTEX_FORMAT_UBYTE3;
1324 case 4:
1325 if (pureInteger)
1326 return VERTEX_FORMAT_UBYTE4_INT;
1327 if (normalized)
1328 return VERTEX_FORMAT_UBYTE4_NORM;
1329 return VERTEX_FORMAT_UBYTE4;
1330 default:
1331 UNREACHABLE();
1332 break;
1333 }
1334 case GL_SHORT:
1335 switch (components)
1336 {
1337 case 1:
1338 if (pureInteger)
1339 return VERTEX_FORMAT_SSHORT1_INT;
1340 if (normalized)
1341 return VERTEX_FORMAT_SSHORT1_NORM;
1342 return VERTEX_FORMAT_SSHORT1;
1343 case 2:
1344 if (pureInteger)
1345 return VERTEX_FORMAT_SSHORT2_INT;
1346 if (normalized)
1347 return VERTEX_FORMAT_SSHORT2_NORM;
1348 return VERTEX_FORMAT_SSHORT2;
1349 case 3:
1350 if (pureInteger)
1351 return VERTEX_FORMAT_SSHORT3_INT;
1352 if (normalized)
1353 return VERTEX_FORMAT_SSHORT3_NORM;
1354 return VERTEX_FORMAT_SSHORT3;
1355 case 4:
1356 if (pureInteger)
1357 return VERTEX_FORMAT_SSHORT4_INT;
1358 if (normalized)
1359 return VERTEX_FORMAT_SSHORT4_NORM;
1360 return VERTEX_FORMAT_SSHORT4;
1361 default:
1362 UNREACHABLE();
1363 break;
1364 }
1365 case GL_UNSIGNED_SHORT:
1366 switch (components)
1367 {
1368 case 1:
1369 if (pureInteger)
1370 return VERTEX_FORMAT_USHORT1_INT;
1371 if (normalized)
1372 return VERTEX_FORMAT_USHORT1_NORM;
1373 return VERTEX_FORMAT_USHORT1;
1374 case 2:
1375 if (pureInteger)
1376 return VERTEX_FORMAT_USHORT2_INT;
1377 if (normalized)
1378 return VERTEX_FORMAT_USHORT2_NORM;
1379 return VERTEX_FORMAT_USHORT2;
1380 case 3:
1381 if (pureInteger)
1382 return VERTEX_FORMAT_USHORT3_INT;
1383 if (normalized)
1384 return VERTEX_FORMAT_USHORT3_NORM;
1385 return VERTEX_FORMAT_USHORT3;
1386 case 4:
1387 if (pureInteger)
1388 return VERTEX_FORMAT_USHORT4_INT;
1389 if (normalized)
1390 return VERTEX_FORMAT_USHORT4_NORM;
1391 return VERTEX_FORMAT_USHORT4;
1392 default:
1393 UNREACHABLE();
1394 break;
1395 }
1396 case GL_INT:
1397 switch (components)
1398 {
1399 case 1:
1400 if (pureInteger)
1401 return VERTEX_FORMAT_SINT1_INT;
1402 if (normalized)
1403 return VERTEX_FORMAT_SINT1_NORM;
1404 return VERTEX_FORMAT_SINT1;
1405 case 2:
1406 if (pureInteger)
1407 return VERTEX_FORMAT_SINT2_INT;
1408 if (normalized)
1409 return VERTEX_FORMAT_SINT2_NORM;
1410 return VERTEX_FORMAT_SINT2;
1411 case 3:
1412 if (pureInteger)
1413 return VERTEX_FORMAT_SINT3_INT;
1414 if (normalized)
1415 return VERTEX_FORMAT_SINT3_NORM;
1416 return VERTEX_FORMAT_SINT3;
1417 case 4:
1418 if (pureInteger)
1419 return VERTEX_FORMAT_SINT4_INT;
1420 if (normalized)
1421 return VERTEX_FORMAT_SINT4_NORM;
1422 return VERTEX_FORMAT_SINT4;
1423 default:
1424 UNREACHABLE();
1425 break;
1426 }
1427 case GL_UNSIGNED_INT:
1428 switch (components)
1429 {
1430 case 1:
1431 if (pureInteger)
1432 return VERTEX_FORMAT_UINT1_INT;
1433 if (normalized)
1434 return VERTEX_FORMAT_UINT1_NORM;
1435 return VERTEX_FORMAT_UINT1;
1436 case 2:
1437 if (pureInteger)
1438 return VERTEX_FORMAT_UINT2_INT;
1439 if (normalized)
1440 return VERTEX_FORMAT_UINT2_NORM;
1441 return VERTEX_FORMAT_UINT2;
1442 case 3:
1443 if (pureInteger)
1444 return VERTEX_FORMAT_UINT3_INT;
1445 if (normalized)
1446 return VERTEX_FORMAT_UINT3_NORM;
1447 return VERTEX_FORMAT_UINT3;
1448 case 4:
1449 if (pureInteger)
1450 return VERTEX_FORMAT_UINT4_INT;
1451 if (normalized)
1452 return VERTEX_FORMAT_UINT4_NORM;
1453 return VERTEX_FORMAT_UINT4;
1454 default:
1455 UNREACHABLE();
1456 break;
1457 }
1458 case GL_FLOAT:
1459 switch (components)
1460 {
1461 case 1:
1462 return VERTEX_FORMAT_FLOAT1;
1463 case 2:
1464 return VERTEX_FORMAT_FLOAT2;
1465 case 3:
1466 return VERTEX_FORMAT_FLOAT3;
1467 case 4:
1468 return VERTEX_FORMAT_FLOAT4;
1469 default:
1470 UNREACHABLE();
1471 break;
1472 }
1473 case GL_HALF_FLOAT:
1474 switch (components)
1475 {
1476 case 1:
1477 return VERTEX_FORMAT_HALF1;
1478 case 2:
1479 return VERTEX_FORMAT_HALF2;
1480 case 3:
1481 return VERTEX_FORMAT_HALF3;
1482 case 4:
1483 return VERTEX_FORMAT_HALF4;
1484 default:
1485 UNREACHABLE();
1486 break;
1487 }
1488 case GL_FIXED:
1489 switch (components)
1490 {
1491 case 1:
1492 return VERTEX_FORMAT_FIXED1;
1493 case 2:
1494 return VERTEX_FORMAT_FIXED2;
1495 case 3:
1496 return VERTEX_FORMAT_FIXED3;
1497 case 4:
1498 return VERTEX_FORMAT_FIXED4;
1499 default:
1500 UNREACHABLE();
1501 break;
1502 }
1503 case GL_INT_2_10_10_10_REV:
1504 if (pureInteger)
1505 return VERTEX_FORMAT_SINT210_INT;
1506 if (normalized)
1507 return VERTEX_FORMAT_SINT210_NORM;
1508 return VERTEX_FORMAT_SINT210;
1509 case GL_UNSIGNED_INT_2_10_10_10_REV:
1510 if (pureInteger)
1511 return VERTEX_FORMAT_UINT210_INT;
1512 if (normalized)
1513 return VERTEX_FORMAT_UINT210_NORM;
1514 return VERTEX_FORMAT_UINT210;
1515 default:
1516 UNREACHABLE();
1517 break;
1518 }
1519 return VERTEX_FORMAT_UBYTE1;
1520}
1521
1522VertexFormatType GetVertexFormatType(const VertexAttribute &attrib)
1523{
1524 return GetVertexFormatType(attrib.type, attrib.normalized, attrib.size, attrib.pureInteger);
1525}
1526
1527VertexFormatType GetVertexFormatType(const VertexAttribute &attrib, GLenum currentValueType)
1528{
1529 if (!attrib.enabled)
1530 {
1531 return GetVertexFormatType(currentValueType, GL_FALSE, 4, (currentValueType != GL_FLOAT));
1532 }
1533 return GetVertexFormatType(attrib);
1534}
1535
1536const VertexFormat &GetVertexFormatFromType(VertexFormatType vertexFormatType)
1537{
1538 switch (vertexFormatType)
1539 {
1540 case VERTEX_FORMAT_SBYTE1:
1541 {
1542 static const VertexFormat format(GL_BYTE, GL_FALSE, 1, false);
1543 return format;
1544 }
1545 case VERTEX_FORMAT_SBYTE1_NORM:
1546 {
1547 static const VertexFormat format(GL_BYTE, GL_TRUE, 1, false);
1548 return format;
1549 }
1550 case VERTEX_FORMAT_SBYTE2:
1551 {
1552 static const VertexFormat format(GL_BYTE, GL_FALSE, 2, false);
1553 return format;
1554 }
1555 case VERTEX_FORMAT_SBYTE2_NORM:
1556 {
1557 static const VertexFormat format(GL_BYTE, GL_TRUE, 2, false);
1558 return format;
1559 }
1560 case VERTEX_FORMAT_SBYTE3:
1561 {
1562 static const VertexFormat format(GL_BYTE, GL_FALSE, 3, false);
1563 return format;
1564 }
1565 case VERTEX_FORMAT_SBYTE3_NORM:
1566 {
1567 static const VertexFormat format(GL_BYTE, GL_TRUE, 3, false);
1568 return format;
1569 }
1570 case VERTEX_FORMAT_SBYTE4:
1571 {
1572 static const VertexFormat format(GL_BYTE, GL_FALSE, 4, false);
1573 return format;
1574 }
1575 case VERTEX_FORMAT_SBYTE4_NORM:
1576 {
1577 static const VertexFormat format(GL_BYTE, GL_TRUE, 4, false);
1578 return format;
1579 }
1580 case VERTEX_FORMAT_UBYTE1:
1581 {
1582 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, false);
1583 return format;
1584 }
1585 case VERTEX_FORMAT_UBYTE1_NORM:
1586 {
1587 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 1, false);
1588 return format;
1589 }
1590 case VERTEX_FORMAT_UBYTE2:
1591 {
1592 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, false);
1593 return format;
1594 }
1595 case VERTEX_FORMAT_UBYTE2_NORM:
1596 {
1597 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 2, false);
1598 return format;
1599 }
1600 case VERTEX_FORMAT_UBYTE3:
1601 {
1602 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, false);
1603 return format;
1604 }
1605 case VERTEX_FORMAT_UBYTE3_NORM:
1606 {
1607 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 3, false);
1608 return format;
1609 }
1610 case VERTEX_FORMAT_UBYTE4:
1611 {
1612 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, false);
1613 return format;
1614 }
1615 case VERTEX_FORMAT_UBYTE4_NORM:
1616 {
1617 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_TRUE, 4, false);
1618 return format;
1619 }
1620 case VERTEX_FORMAT_SSHORT1:
1621 {
1622 static const VertexFormat format(GL_SHORT, GL_FALSE, 1, false);
1623 return format;
1624 }
1625 case VERTEX_FORMAT_SSHORT1_NORM:
1626 {
1627 static const VertexFormat format(GL_SHORT, GL_TRUE, 1, false);
1628 return format;
1629 }
1630 case VERTEX_FORMAT_SSHORT2:
1631 {
1632 static const VertexFormat format(GL_SHORT, GL_FALSE, 2, false);
1633 return format;
1634 }
1635 case VERTEX_FORMAT_SSHORT2_NORM:
1636 {
1637 static const VertexFormat format(GL_SHORT, GL_TRUE, 2, false);
1638 return format;
1639 }
1640 case VERTEX_FORMAT_SSHORT3:
1641 {
1642 static const VertexFormat format(GL_SHORT, GL_FALSE, 3, false);
1643 return format;
1644 }
1645 case VERTEX_FORMAT_SSHORT3_NORM:
1646 {
1647 static const VertexFormat format(GL_SHORT, GL_TRUE, 3, false);
1648 return format;
1649 }
1650 case VERTEX_FORMAT_SSHORT4:
1651 {
1652 static const VertexFormat format(GL_SHORT, GL_FALSE, 4, false);
1653 return format;
1654 }
1655 case VERTEX_FORMAT_SSHORT4_NORM:
1656 {
1657 static const VertexFormat format(GL_SHORT, GL_TRUE, 4, false);
1658 return format;
1659 }
1660 case VERTEX_FORMAT_USHORT1:
1661 {
1662 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, false);
1663 return format;
1664 }
1665 case VERTEX_FORMAT_USHORT1_NORM:
1666 {
1667 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 1, false);
1668 return format;
1669 }
1670 case VERTEX_FORMAT_USHORT2:
1671 {
1672 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, false);
1673 return format;
1674 }
1675 case VERTEX_FORMAT_USHORT2_NORM:
1676 {
1677 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 2, false);
1678 return format;
1679 }
1680 case VERTEX_FORMAT_USHORT3:
1681 {
1682 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, false);
1683 return format;
1684 }
1685 case VERTEX_FORMAT_USHORT3_NORM:
1686 {
1687 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 3, false);
1688 return format;
1689 }
1690 case VERTEX_FORMAT_USHORT4:
1691 {
1692 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, false);
1693 return format;
1694 }
1695 case VERTEX_FORMAT_USHORT4_NORM:
1696 {
1697 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_TRUE, 4, false);
1698 return format;
1699 }
1700 case VERTEX_FORMAT_SINT1:
1701 {
1702 static const VertexFormat format(GL_INT, GL_FALSE, 1, false);
1703 return format;
1704 }
1705 case VERTEX_FORMAT_SINT1_NORM:
1706 {
1707 static const VertexFormat format(GL_INT, GL_TRUE, 1, false);
1708 return format;
1709 }
1710 case VERTEX_FORMAT_SINT2:
1711 {
1712 static const VertexFormat format(GL_INT, GL_FALSE, 2, false);
1713 return format;
1714 }
1715 case VERTEX_FORMAT_SINT2_NORM:
1716 {
1717 static const VertexFormat format(GL_INT, GL_TRUE, 2, false);
1718 return format;
1719 }
1720 case VERTEX_FORMAT_SINT3:
1721 {
1722 static const VertexFormat format(GL_INT, GL_FALSE, 3, false);
1723 return format;
1724 }
1725 case VERTEX_FORMAT_SINT3_NORM:
1726 {
1727 static const VertexFormat format(GL_INT, GL_TRUE, 3, false);
1728 return format;
1729 }
1730 case VERTEX_FORMAT_SINT4:
1731 {
1732 static const VertexFormat format(GL_INT, GL_FALSE, 4, false);
1733 return format;
1734 }
1735 case VERTEX_FORMAT_SINT4_NORM:
1736 {
1737 static const VertexFormat format(GL_INT, GL_TRUE, 4, false);
1738 return format;
1739 }
1740 case VERTEX_FORMAT_UINT1:
1741 {
1742 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, false);
1743 return format;
1744 }
1745 case VERTEX_FORMAT_UINT1_NORM:
1746 {
1747 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 1, false);
1748 return format;
1749 }
1750 case VERTEX_FORMAT_UINT2:
1751 {
1752 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, false);
1753 return format;
1754 }
1755 case VERTEX_FORMAT_UINT2_NORM:
1756 {
1757 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 2, false);
1758 return format;
1759 }
1760 case VERTEX_FORMAT_UINT3:
1761 {
1762 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, false);
1763 return format;
1764 }
1765 case VERTEX_FORMAT_UINT3_NORM:
1766 {
1767 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 3, false);
1768 return format;
1769 }
1770 case VERTEX_FORMAT_UINT4:
1771 {
1772 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, false);
1773 return format;
1774 }
1775 case VERTEX_FORMAT_UINT4_NORM:
1776 {
1777 static const VertexFormat format(GL_UNSIGNED_INT, GL_TRUE, 4, false);
1778 return format;
1779 }
1780 case VERTEX_FORMAT_SBYTE1_INT:
1781 {
1782 static const VertexFormat format(GL_BYTE, GL_FALSE, 1, true);
1783 return format;
1784 }
1785 case VERTEX_FORMAT_SBYTE2_INT:
1786 {
1787 static const VertexFormat format(GL_BYTE, GL_FALSE, 2, true);
1788 return format;
1789 }
1790 case VERTEX_FORMAT_SBYTE3_INT:
1791 {
1792 static const VertexFormat format(GL_BYTE, GL_FALSE, 3, true);
1793 return format;
1794 }
1795 case VERTEX_FORMAT_SBYTE4_INT:
1796 {
1797 static const VertexFormat format(GL_BYTE, GL_FALSE, 4, true);
1798 return format;
1799 }
1800 case VERTEX_FORMAT_UBYTE1_INT:
1801 {
1802 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 1, true);
1803 return format;
1804 }
1805 case VERTEX_FORMAT_UBYTE2_INT:
1806 {
1807 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 2, true);
1808 return format;
1809 }
1810 case VERTEX_FORMAT_UBYTE3_INT:
1811 {
1812 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 3, true);
1813 return format;
1814 }
1815 case VERTEX_FORMAT_UBYTE4_INT:
1816 {
1817 static const VertexFormat format(GL_UNSIGNED_BYTE, GL_FALSE, 4, true);
1818 return format;
1819 }
1820 case VERTEX_FORMAT_SSHORT1_INT:
1821 {
1822 static const VertexFormat format(GL_SHORT, GL_FALSE, 1, true);
1823 return format;
1824 }
1825 case VERTEX_FORMAT_SSHORT2_INT:
1826 {
1827 static const VertexFormat format(GL_SHORT, GL_FALSE, 2, true);
1828 return format;
1829 }
1830 case VERTEX_FORMAT_SSHORT3_INT:
1831 {
1832 static const VertexFormat format(GL_SHORT, GL_FALSE, 3, true);
1833 return format;
1834 }
1835 case VERTEX_FORMAT_SSHORT4_INT:
1836 {
1837 static const VertexFormat format(GL_SHORT, GL_FALSE, 4, true);
1838 return format;
1839 }
1840 case VERTEX_FORMAT_USHORT1_INT:
1841 {
1842 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 1, true);
1843 return format;
1844 }
1845 case VERTEX_FORMAT_USHORT2_INT:
1846 {
1847 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 2, true);
1848 return format;
1849 }
1850 case VERTEX_FORMAT_USHORT3_INT:
1851 {
1852 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 3, true);
1853 return format;
1854 }
1855 case VERTEX_FORMAT_USHORT4_INT:
1856 {
1857 static const VertexFormat format(GL_UNSIGNED_SHORT, GL_FALSE, 4, true);
1858 return format;
1859 }
1860 case VERTEX_FORMAT_SINT1_INT:
1861 {
1862 static const VertexFormat format(GL_INT, GL_FALSE, 1, true);
1863 return format;
1864 }
1865 case VERTEX_FORMAT_SINT2_INT:
1866 {
1867 static const VertexFormat format(GL_INT, GL_FALSE, 2, true);
1868 return format;
1869 }
1870 case VERTEX_FORMAT_SINT3_INT:
1871 {
1872 static const VertexFormat format(GL_INT, GL_FALSE, 3, true);
1873 return format;
1874 }
1875 case VERTEX_FORMAT_SINT4_INT:
1876 {
1877 static const VertexFormat format(GL_INT, GL_FALSE, 4, true);
1878 return format;
1879 }
1880 case VERTEX_FORMAT_UINT1_INT:
1881 {
1882 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 1, true);
1883 return format;
1884 }
1885 case VERTEX_FORMAT_UINT2_INT:
1886 {
1887 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 2, true);
1888 return format;
1889 }
1890 case VERTEX_FORMAT_UINT3_INT:
1891 {
1892 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 3, true);
1893 return format;
1894 }
1895 case VERTEX_FORMAT_UINT4_INT:
1896 {
1897 static const VertexFormat format(GL_UNSIGNED_INT, GL_FALSE, 4, true);
1898 return format;
1899 }
1900 case VERTEX_FORMAT_FIXED1:
1901 {
1902 static const VertexFormat format(GL_FIXED, GL_FALSE, 1, false);
1903 return format;
1904 }
1905 case VERTEX_FORMAT_FIXED2:
1906 {
1907 static const VertexFormat format(GL_FIXED, GL_FALSE, 2, false);
1908 return format;
1909 }
1910 case VERTEX_FORMAT_FIXED3:
1911 {
1912 static const VertexFormat format(GL_FIXED, GL_FALSE, 3, false);
1913 return format;
1914 }
1915 case VERTEX_FORMAT_FIXED4:
1916 {
1917 static const VertexFormat format(GL_FIXED, GL_FALSE, 4, false);
1918 return format;
1919 }
1920 case VERTEX_FORMAT_HALF1:
1921 {
1922 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 1, false);
1923 return format;
1924 }
1925 case VERTEX_FORMAT_HALF2:
1926 {
1927 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 2, false);
1928 return format;
1929 }
1930 case VERTEX_FORMAT_HALF3:
1931 {
1932 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 3, false);
1933 return format;
1934 }
1935 case VERTEX_FORMAT_HALF4:
1936 {
1937 static const VertexFormat format(GL_HALF_FLOAT, GL_FALSE, 4, false);
1938 return format;
1939 }
1940 case VERTEX_FORMAT_FLOAT1:
1941 {
1942 static const VertexFormat format(GL_FLOAT, GL_FALSE, 1, false);
1943 return format;
1944 }
1945 case VERTEX_FORMAT_FLOAT2:
1946 {
1947 static const VertexFormat format(GL_FLOAT, GL_FALSE, 2, false);
1948 return format;
1949 }
1950 case VERTEX_FORMAT_FLOAT3:
1951 {
1952 static const VertexFormat format(GL_FLOAT, GL_FALSE, 3, false);
1953 return format;
1954 }
1955 case VERTEX_FORMAT_FLOAT4:
1956 {
1957 static const VertexFormat format(GL_FLOAT, GL_FALSE, 4, false);
1958 return format;
1959 }
1960 case VERTEX_FORMAT_SINT210:
1961 {
1962 static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, false);
1963 return format;
1964 }
1965 case VERTEX_FORMAT_UINT210:
1966 {
1967 static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, false);
1968 return format;
1969 }
1970 case VERTEX_FORMAT_SINT210_NORM:
1971 {
1972 static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_TRUE, 4, false);
1973 return format;
1974 }
1975 case VERTEX_FORMAT_UINT210_NORM:
1976 {
1977 static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_TRUE, 4, false);
1978 return format;
1979 }
1980 case VERTEX_FORMAT_SINT210_INT:
1981 {
1982 static const VertexFormat format(GL_INT_2_10_10_10_REV, GL_FALSE, 4, true);
1983 return format;
1984 }
1985 case VERTEX_FORMAT_UINT210_INT:
1986 {
1987 static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, true);
1988 return format;
1989 }
1990 default:
1991 {
1992 static const VertexFormat format(GL_NONE, GL_FALSE, 0, false);
1993 return format;
1994 }
1995 }
1996}
1997
Corentin Wallez0c7baf12016-12-19 15:43:10 -05001998size_t GetVertexFormatTypeSize(VertexFormatType vertexFormatType)
1999{
2000 switch (vertexFormatType)
2001 {
2002 case VERTEX_FORMAT_SBYTE1:
2003 case VERTEX_FORMAT_SBYTE1_NORM:
2004 case VERTEX_FORMAT_UBYTE1:
2005 case VERTEX_FORMAT_UBYTE1_NORM:
2006 case VERTEX_FORMAT_SBYTE1_INT:
2007 case VERTEX_FORMAT_UBYTE1_INT:
2008 return 1;
2009
2010 case VERTEX_FORMAT_SBYTE2:
2011 case VERTEX_FORMAT_SBYTE2_NORM:
2012 case VERTEX_FORMAT_UBYTE2:
2013 case VERTEX_FORMAT_UBYTE2_NORM:
2014 case VERTEX_FORMAT_SBYTE2_INT:
2015 case VERTEX_FORMAT_UBYTE2_INT:
2016 case VERTEX_FORMAT_SSHORT1:
2017 case VERTEX_FORMAT_SSHORT1_NORM:
2018 case VERTEX_FORMAT_USHORT1:
2019 case VERTEX_FORMAT_USHORT1_NORM:
2020 case VERTEX_FORMAT_SSHORT1_INT:
2021 case VERTEX_FORMAT_USHORT1_INT:
2022 case VERTEX_FORMAT_HALF1:
2023 return 2;
2024
2025 case VERTEX_FORMAT_SBYTE3:
2026 case VERTEX_FORMAT_SBYTE3_NORM:
2027 case VERTEX_FORMAT_UBYTE3:
2028 case VERTEX_FORMAT_UBYTE3_NORM:
2029 case VERTEX_FORMAT_SBYTE3_INT:
2030 case VERTEX_FORMAT_UBYTE3_INT:
2031 return 3;
2032
2033 case VERTEX_FORMAT_SBYTE4:
2034 case VERTEX_FORMAT_SBYTE4_NORM:
2035 case VERTEX_FORMAT_UBYTE4:
2036 case VERTEX_FORMAT_UBYTE4_NORM:
2037 case VERTEX_FORMAT_SBYTE4_INT:
2038 case VERTEX_FORMAT_UBYTE4_INT:
2039 case VERTEX_FORMAT_SSHORT2:
2040 case VERTEX_FORMAT_SSHORT2_NORM:
2041 case VERTEX_FORMAT_USHORT2:
2042 case VERTEX_FORMAT_USHORT2_NORM:
2043 case VERTEX_FORMAT_SSHORT2_INT:
2044 case VERTEX_FORMAT_USHORT2_INT:
2045 case VERTEX_FORMAT_SINT1:
2046 case VERTEX_FORMAT_SINT1_NORM:
2047 case VERTEX_FORMAT_UINT1:
2048 case VERTEX_FORMAT_UINT1_NORM:
2049 case VERTEX_FORMAT_SINT1_INT:
2050 case VERTEX_FORMAT_UINT1_INT:
2051 case VERTEX_FORMAT_HALF2:
2052 case VERTEX_FORMAT_FIXED1:
2053 case VERTEX_FORMAT_FLOAT1:
2054 case VERTEX_FORMAT_SINT210:
2055 case VERTEX_FORMAT_UINT210:
2056 case VERTEX_FORMAT_SINT210_NORM:
2057 case VERTEX_FORMAT_UINT210_NORM:
2058 case VERTEX_FORMAT_SINT210_INT:
2059 case VERTEX_FORMAT_UINT210_INT:
2060 return 4;
2061
2062 case VERTEX_FORMAT_SSHORT3:
2063 case VERTEX_FORMAT_SSHORT3_NORM:
2064 case VERTEX_FORMAT_USHORT3:
2065 case VERTEX_FORMAT_USHORT3_NORM:
2066 case VERTEX_FORMAT_SSHORT3_INT:
2067 case VERTEX_FORMAT_USHORT3_INT:
2068 case VERTEX_FORMAT_HALF3:
2069 return 6;
2070
2071 case VERTEX_FORMAT_SSHORT4:
2072 case VERTEX_FORMAT_SSHORT4_NORM:
2073 case VERTEX_FORMAT_USHORT4:
2074 case VERTEX_FORMAT_USHORT4_NORM:
2075 case VERTEX_FORMAT_SSHORT4_INT:
2076 case VERTEX_FORMAT_USHORT4_INT:
2077 case VERTEX_FORMAT_SINT2:
2078 case VERTEX_FORMAT_SINT2_NORM:
2079 case VERTEX_FORMAT_UINT2:
2080 case VERTEX_FORMAT_UINT2_NORM:
2081 case VERTEX_FORMAT_SINT2_INT:
2082 case VERTEX_FORMAT_UINT2_INT:
2083 case VERTEX_FORMAT_HALF4:
2084 case VERTEX_FORMAT_FIXED2:
2085 case VERTEX_FORMAT_FLOAT2:
2086 return 8;
2087
2088 case VERTEX_FORMAT_SINT3:
2089 case VERTEX_FORMAT_SINT3_NORM:
2090 case VERTEX_FORMAT_UINT3:
2091 case VERTEX_FORMAT_UINT3_NORM:
2092 case VERTEX_FORMAT_SINT3_INT:
2093 case VERTEX_FORMAT_UINT3_INT:
2094 case VERTEX_FORMAT_FIXED3:
2095 case VERTEX_FORMAT_FLOAT3:
2096 return 12;
2097
2098 case VERTEX_FORMAT_SINT4:
2099 case VERTEX_FORMAT_SINT4_NORM:
2100 case VERTEX_FORMAT_UINT4:
2101 case VERTEX_FORMAT_UINT4_NORM:
2102 case VERTEX_FORMAT_SINT4_INT:
2103 case VERTEX_FORMAT_UINT4_INT:
2104 case VERTEX_FORMAT_FIXED4:
2105 case VERTEX_FORMAT_FLOAT4:
2106 return 16;
2107
2108 case VERTEX_FORMAT_INVALID:
2109 default:
2110 UNREACHABLE();
2111 return 0;
2112 }
2113}
2114
Geoff Lang6d1ccf02017-04-24 14:09:58 -04002115bool ValidES3InternalFormat(GLenum internalFormat)
2116{
2117 const InternalFormatInfoMap &formatMap = GetInternalFormatMap();
2118 return internalFormat != GL_NONE && formatMap.find(internalFormat) != formatMap.end();
2119}
2120
Jamie Madilld3dfda22015-07-06 08:28:49 -04002121VertexFormat::VertexFormat(GLenum typeIn, GLboolean normalizedIn, GLuint componentsIn, bool pureIntegerIn)
2122 : type(typeIn),
2123 normalized(normalizedIn),
2124 components(componentsIn),
2125 pureInteger(pureIntegerIn)
2126{
2127 // float -> !normalized
2128 ASSERT(!(type == GL_FLOAT || type == GL_HALF_FLOAT || type == GL_FIXED) || normalized == GL_FALSE);
2129}
2130
shannonwoods@chromium.orgb8490f32013-05-30 00:08:00 +00002131}