Commit 55e98210 by Jamie Madill Committed by Commit Bot

Make global ES3 formats STL map a switch.

This eliminates another global std::map, and replaces it with a json generated switch. This should be better for threading, better on memory use, and faster. BUG=angleproject:1389 BUG=angleproject:1459 Change-Id: I1d289637c00783690ec8ea743ea2aa17b0ab8e50 Reviewed-on: https://chromium-review.googlesource.com/394234Reviewed-by: 's avatarCorentin Wallez <cwallez@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 5878f832
{
"Format combinations from ES 3.0.1 spec, table 3.2":
[
[ "GL_RGBA8", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
[ "GL_RGB5_A1", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
[ "GL_RGBA4", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
[ "GL_SRGB8_ALPHA8", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
[ "GL_RGBA8_SNORM", "GL_RGBA", "GL_BYTE" ],
[ "GL_RGBA4", "GL_RGBA", "GL_UNSIGNED_SHORT_4_4_4_4" ],
[ "GL_RGB10_A2", "GL_RGBA", "GL_UNSIGNED_INT_2_10_10_10_REV" ],
[ "GL_RGB5_A1", "GL_RGBA", "GL_UNSIGNED_INT_2_10_10_10_REV" ],
[ "GL_RGB5_A1", "GL_RGBA", "GL_UNSIGNED_SHORT_5_5_5_1" ],
[ "GL_RGBA16F", "GL_RGBA", "GL_HALF_FLOAT" ],
[ "GL_RGBA16F", "GL_RGBA", "GL_HALF_FLOAT_OES" ],
[ "GL_RGBA32F", "GL_RGBA", "GL_FLOAT" ],
[ "GL_RGBA16F", "GL_RGBA", "GL_FLOAT" ],
[ "GL_RGBA8UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_BYTE" ],
[ "GL_RGBA8I", "GL_RGBA_INTEGER", "GL_BYTE" ],
[ "GL_RGBA16UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_SHORT" ],
[ "GL_RGBA16I", "GL_RGBA_INTEGER", "GL_SHORT" ],
[ "GL_RGBA32UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_INT" ],
[ "GL_RGBA32I", "GL_RGBA_INTEGER", "GL_INT" ],
[ "GL_RGB10_A2UI", "GL_RGBA_INTEGER", "GL_UNSIGNED_INT_2_10_10_10_REV" ],
[ "GL_RGB8", "GL_RGB", "GL_UNSIGNED_BYTE" ],
[ "GL_RGB565", "GL_RGB", "GL_UNSIGNED_BYTE" ],
[ "GL_SRGB8", "GL_RGB", "GL_UNSIGNED_BYTE" ],
[ "GL_RGB8_SNORM", "GL_RGB", "GL_BYTE" ],
[ "GL_RGB565", "GL_RGB", "GL_UNSIGNED_SHORT_5_6_5" ],
[ "GL_R11F_G11F_B10F", "GL_RGB", "GL_UNSIGNED_INT_10F_11F_11F_REV" ],
[ "GL_RGB9_E5", "GL_RGB", "GL_UNSIGNED_INT_5_9_9_9_REV" ],
[ "GL_RGB16F", "GL_RGB", "GL_HALF_FLOAT" ],
[ "GL_RGB16F", "GL_RGB", "GL_HALF_FLOAT_OES" ],
[ "GL_R11F_G11F_B10F", "GL_RGB", "GL_HALF_FLOAT" ],
[ "GL_R11F_G11F_B10F", "GL_RGB", "GL_HALF_FLOAT_OES" ],
[ "GL_RGB9_E5", "GL_RGB", "GL_HALF_FLOAT" ],
[ "GL_RGB9_E5", "GL_RGB", "GL_HALF_FLOAT_OES" ],
[ "GL_RGB32F", "GL_RGB", "GL_FLOAT" ],
[ "GL_RGB16F", "GL_RGB", "GL_FLOAT" ],
[ "GL_R11F_G11F_B10F", "GL_RGB", "GL_FLOAT" ],
[ "GL_RGB9_E5", "GL_RGB", "GL_FLOAT" ],
[ "GL_RGB8UI", "GL_RGB_INTEGER", "GL_UNSIGNED_BYTE" ],
[ "GL_RGB8I", "GL_RGB_INTEGER", "GL_BYTE" ],
[ "GL_RGB16UI", "GL_RGB_INTEGER", "GL_UNSIGNED_SHORT" ],
[ "GL_RGB16I", "GL_RGB_INTEGER", "GL_SHORT" ],
[ "GL_RGB32UI", "GL_RGB_INTEGER", "GL_UNSIGNED_INT" ],
[ "GL_RGB32I", "GL_RGB_INTEGER", "GL_INT" ],
[ "GL_RG8", "GL_RG", "GL_UNSIGNED_BYTE" ],
[ "GL_RG8_SNORM", "GL_RG", "GL_BYTE" ],
[ "GL_RG16F", "GL_RG", "GL_HALF_FLOAT" ],
[ "GL_RG16F", "GL_RG", "GL_HALF_FLOAT_OES" ],
[ "GL_RG32F", "GL_RG", "GL_FLOAT" ],
[ "GL_RG16F", "GL_RG", "GL_FLOAT" ],
[ "GL_RG8UI", "GL_RG_INTEGER", "GL_UNSIGNED_BYTE" ],
[ "GL_RG8I", "GL_RG_INTEGER", "GL_BYTE" ],
[ "GL_RG16UI", "GL_RG_INTEGER", "GL_UNSIGNED_SHORT" ],
[ "GL_RG16I", "GL_RG_INTEGER", "GL_SHORT" ],
[ "GL_RG32UI", "GL_RG_INTEGER", "GL_UNSIGNED_INT" ],
[ "GL_RG32I", "GL_RG_INTEGER", "GL_INT" ],
[ "GL_R8", "GL_RED", "GL_UNSIGNED_BYTE" ],
[ "GL_R8_SNORM", "GL_RED", "GL_BYTE" ],
[ "GL_R16F", "GL_RED", "GL_HALF_FLOAT" ],
[ "GL_R16F", "GL_RED", "GL_HALF_FLOAT_OES" ],
[ "GL_R32F", "GL_RED", "GL_FLOAT" ],
[ "GL_R16F", "GL_RED", "GL_FLOAT" ],
[ "GL_R8UI", "GL_RED_INTEGER", "GL_UNSIGNED_BYTE" ],
[ "GL_R8I", "GL_RED_INTEGER", "GL_BYTE" ],
[ "GL_R16UI", "GL_RED_INTEGER", "GL_UNSIGNED_SHORT" ],
[ "GL_R16I", "GL_RED_INTEGER", "GL_SHORT" ],
[ "GL_R32UI", "GL_RED_INTEGER", "GL_UNSIGNED_INT" ],
[ "GL_R32I", "GL_RED_INTEGER", "GL_INT" ]
],
"Unsized formats":
[
[ "GL_RGBA", "GL_RGBA", "GL_UNSIGNED_BYTE" ],
[ "GL_RGBA", "GL_RGBA", "GL_UNSIGNED_SHORT_4_4_4_4" ],
[ "GL_RGBA", "GL_RGBA", "GL_UNSIGNED_SHORT_5_5_5_1" ],
[ "GL_RGB", "GL_RGB", "GL_UNSIGNED_BYTE" ],
[ "GL_RGB", "GL_RGB", "GL_UNSIGNED_SHORT_5_6_5" ],
[ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_UNSIGNED_BYTE" ],
[ "GL_LUMINANCE", "GL_LUMINANCE", "GL_UNSIGNED_BYTE" ],
[ "GL_ALPHA", "GL_ALPHA", "GL_UNSIGNED_BYTE" ],
[ "GL_SRGB_ALPHA_EXT", "GL_SRGB_ALPHA_EXT", "GL_UNSIGNED_BYTE" ],
[ "GL_SRGB_EXT", "GL_SRGB_EXT", "GL_UNSIGNED_BYTE" ],
[ "GL_RG", "GL_RG", "GL_UNSIGNED_BYTE" ],
[ "GL_RG", "GL_RG", "GL_FLOAT" ],
[ "GL_RG", "GL_RG", "GL_HALF_FLOAT" ],
[ "GL_RG", "GL_RG", "GL_HALF_FLOAT_OES" ],
[ "GL_RED", "GL_RED", "GL_UNSIGNED_BYTE" ],
[ "GL_RED", "GL_RED", "GL_FLOAT" ],
[ "GL_RED", "GL_RED", "GL_HALF_FLOAT" ],
[ "GL_RED", "GL_RED", "GL_HALF_FLOAT_OES" ],
[ "GL_DEPTH_STENCIL", "GL_DEPTH_STENCIL", "GL_UNSIGNED_INT_24_8" ]
],
"Depth stencil formats":
[
[ "GL_DEPTH_COMPONENT16", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_SHORT" ],
[ "GL_DEPTH_COMPONENT24", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT" ],
[ "GL_DEPTH_COMPONENT16", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT" ],
[ "GL_DEPTH_COMPONENT32F", "GL_DEPTH_COMPONENT", "GL_FLOAT" ],
[ "GL_DEPTH24_STENCIL8", "GL_DEPTH_STENCIL", "GL_UNSIGNED_INT_24_8" ],
[ "GL_DEPTH32F_STENCIL8", "GL_DEPTH_STENCIL", "GL_FLOAT_32_UNSIGNED_INT_24_8_REV" ]
],
"From GL_EXT_sRGB":
[
[ "GL_SRGB8_ALPHA8_EXT", "GL_SRGB_ALPHA_EXT", "GL_UNSIGNED_BYTE" ],
[ "GL_SRGB8", "GL_SRGB_EXT", "GL_UNSIGNED_BYTE" ]
],
"From GL_OES_texture_float":
[
[ "GL_RGBA", "GL_RGBA", "GL_FLOAT" ],
[ "GL_RGB", "GL_RGB", "GL_FLOAT" ],
[ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_FLOAT" ],
[ "GL_LUMINANCE", "GL_LUMINANCE", "GL_FLOAT" ],
[ "GL_ALPHA", "GL_ALPHA", "GL_FLOAT" ]
],
"From GL_OES_texture_half_float":
[
[ "GL_RGBA", "GL_RGBA", "GL_HALF_FLOAT_OES" ],
[ "GL_RGB", "GL_RGB", "GL_HALF_FLOAT_OES" ],
[ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT" ],
[ "GL_LUMINANCE_ALPHA", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT_OES" ],
[ "GL_LUMINANCE", "GL_LUMINANCE", "GL_HALF_FLOAT" ],
[ "GL_LUMINANCE", "GL_LUMINANCE", "GL_HALF_FLOAT_OES" ],
[ "GL_ALPHA", "GL_ALPHA", "GL_HALF_FLOAT" ],
[ "GL_ALPHA", "GL_ALPHA", "GL_HALF_FLOAT_OES" ]
],
"From GL_EXT_texture_format_BGRA8888":
[
[ "GL_BGRA_EXT", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ]
],
"From GL_EXT_texture_storage":
[
[ "GL_ALPHA8_EXT", "GL_ALPHA", "GL_UNSIGNED_BYTE" ],
[ "GL_LUMINANCE8_EXT", "GL_LUMINANCE", "GL_UNSIGNED_BYTE" ],
[ "GL_LUMINANCE8_ALPHA8_EXT", "GL_LUMINANCE_ALPHA", "GL_UNSIGNED_BYTE" ],
[ "GL_ALPHA32F_EXT", "GL_ALPHA", "GL_FLOAT" ],
[ "GL_LUMINANCE32F_EXT", "GL_LUMINANCE", "GL_FLOAT" ],
[ "GL_LUMINANCE_ALPHA32F_EXT", "GL_LUMINANCE_ALPHA", "GL_FLOAT" ],
[ "GL_ALPHA16F_EXT", "GL_ALPHA", "GL_HALF_FLOAT" ],
[ "GL_ALPHA16F_EXT", "GL_ALPHA", "GL_HALF_FLOAT_OES" ],
[ "GL_LUMINANCE16F_EXT", "GL_LUMINANCE", "GL_HALF_FLOAT" ],
[ "GL_LUMINANCE16F_EXT", "GL_LUMINANCE", "GL_HALF_FLOAT_OES" ],
[ "GL_LUMINANCE_ALPHA16F_EXT", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT" ],
[ "GL_LUMINANCE_ALPHA16F_EXT", "GL_LUMINANCE_ALPHA", "GL_HALF_FLOAT_OES" ]
],
"From GL_EXT_texture_storage and GL_EXT_texture_format_BGRA8888":
[
[ "GL_BGRA8_EXT", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ],
[ "GL_BGRA4_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT" ],
[ "GL_BGRA4_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ],
[ "GL_BGR5_A1_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT" ],
[ "GL_BGR5_A1_ANGLEX", "GL_BGRA_EXT", "GL_UNSIGNED_BYTE" ]
],
"From GL_ANGLE_depth_texture and OES_depth_texture":
[
[ "GL_DEPTH_COMPONENT32_OES", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT_24_8" ],
[ "GL_DEPTH_COMPONENT", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_SHORT" ],
[ "GL_DEPTH_COMPONENT", "GL_DEPTH_COMPONENT", "GL_UNSIGNED_INT" ]
],
"From GL_EXT_texture_norm16":
[
[ "GL_R16_EXT", "GL_RED", "GL_UNSIGNED_SHORT" ],
[ "GL_RG16_EXT", "GL_RG", "GL_UNSIGNED_SHORT" ],
[ "GL_RGB16_EXT", "GL_RGB", "GL_UNSIGNED_SHORT" ],
[ "GL_RGBA16_EXT", "GL_RGBA", "GL_UNSIGNED_SHORT" ],
[ "GL_R16_SNORM_EXT", "GL_RED", "GL_SHORT" ],
[ "GL_RG16_SNORM_EXT", "GL_RG", "GL_SHORT" ],
[ "GL_RGB16_SNORM_EXT", "GL_RGB", "GL_SHORT" ],
[ "GL_RGBA16_SNORM_EXT", "GL_RGBA", "GL_SHORT" ]
]
}
// GENERATED FILE - DO NOT EDIT. // GENERATED FILE - DO NOT EDIT.
// Generated by gen_format_map.py using data from format_map_data.json. // Generated by gen_format_map.py using data from format_map_data.json.
// ES3 format info from es3_format_type_combinations.json.
// //
// Copyright 2016 The ANGLE Project Authors. All rights reserved. // Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
...@@ -7,6 +8,7 @@ ...@@ -7,6 +8,7 @@
// //
// format_map: // format_map:
// Determining the sized internal format from a (format,type) pair. // Determining the sized internal format from a (format,type) pair.
// Also check es3 format combinations for validity.
#include "angle_gl.h" #include "angle_gl.h"
#include "common/debug.h" #include "common/debug.h"
...@@ -370,4 +372,1159 @@ GLenum GetSizedFormatInternal(GLenum format, GLenum type) ...@@ -370,4 +372,1159 @@ GLenum GetSizedFormatInternal(GLenum format, GLenum type)
return GL_NONE; return GL_NONE;
} }
bool ValidES3Format(GLenum format)
{
switch (format)
{
case GL_ALPHA:
case GL_BGRA_EXT:
case GL_DEPTH_COMPONENT:
case GL_DEPTH_STENCIL:
case GL_LUMINANCE:
case GL_LUMINANCE_ALPHA:
case GL_RED:
case GL_RED_INTEGER:
case GL_RG:
case GL_RGB:
case GL_RGBA:
case GL_RGBA_INTEGER:
case GL_RGB_INTEGER:
case GL_RG_INTEGER:
case GL_SRGB_ALPHA_EXT:
case GL_SRGB_EXT:
return true;
default:
return false;
}
}
bool ValidES3Type(GLenum type)
{
switch (type)
{
case GL_BYTE:
case GL_FLOAT:
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
case GL_HALF_FLOAT:
case GL_HALF_FLOAT_OES:
case GL_INT:
case GL_SHORT:
case GL_UNSIGNED_BYTE:
case GL_UNSIGNED_INT:
case GL_UNSIGNED_INT_10F_11F_11F_REV:
case GL_UNSIGNED_INT_24_8:
case GL_UNSIGNED_INT_2_10_10_10_REV:
case GL_UNSIGNED_INT_5_9_9_9_REV:
case GL_UNSIGNED_SHORT:
case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
case GL_UNSIGNED_SHORT_4_4_4_4:
case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
case GL_UNSIGNED_SHORT_5_5_5_1:
case GL_UNSIGNED_SHORT_5_6_5:
return true;
default:
return false;
}
}
bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat)
{
ASSERT(ValidES3Format(format) && ValidES3Type(type));
switch (format)
{
case GL_RGB_INTEGER:
switch (type)
{
case GL_INT:
{
switch (internalFormat)
{
case GL_RGB32I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_RGB16UI:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_RGB16I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_RGB8UI:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_RGB8I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT:
{
switch (internalFormat)
{
case GL_RGB32UI:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_RGBA_INTEGER:
switch (type)
{
case GL_INT:
{
switch (internalFormat)
{
case GL_RGBA32I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_RGBA16UI:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT_2_10_10_10_REV:
{
switch (internalFormat)
{
case GL_RGB10_A2UI:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_RGBA16I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_RGBA8UI:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_RGBA8I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT:
{
switch (internalFormat)
{
case GL_RGBA32UI:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_RGB:
switch (type)
{
case GL_UNSIGNED_INT_10F_11F_11F_REV:
{
switch (internalFormat)
{
case GL_R11F_G11F_B10F:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_RGB16_EXT:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_RGB16_SNORM_EXT:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_RGB:
case GL_RGB8:
case GL_RGB565:
case GL_SRGB8:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT_5_6_5:
{
switch (internalFormat)
{
case GL_RGB:
case GL_RGB565:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT_OES:
{
switch (internalFormat)
{
case GL_RGB:
case GL_RGB16F:
case GL_R11F_G11F_B10F:
case GL_RGB9_E5:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT:
{
switch (internalFormat)
{
case GL_RGB16F:
case GL_R11F_G11F_B10F:
case GL_RGB9_E5:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_RGB:
case GL_RGB32F:
case GL_RGB16F:
case GL_R11F_G11F_B10F:
case GL_RGB9_E5:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_RGB8_SNORM:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT_5_9_9_9_REV:
{
switch (internalFormat)
{
case GL_RGB9_E5:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_LUMINANCE_ALPHA:
switch (type)
{
case GL_HALF_FLOAT:
{
switch (internalFormat)
{
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE_ALPHA16F_EXT:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE_ALPHA32F_EXT:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE8_ALPHA8_EXT:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT_OES:
{
switch (internalFormat)
{
case GL_LUMINANCE_ALPHA:
case GL_LUMINANCE_ALPHA16F_EXT:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_ALPHA:
switch (type)
{
case GL_HALF_FLOAT:
{
switch (internalFormat)
{
case GL_ALPHA:
case GL_ALPHA16F_EXT:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_ALPHA:
case GL_ALPHA32F_EXT:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_ALPHA:
case GL_ALPHA8_EXT:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT_OES:
{
switch (internalFormat)
{
case GL_ALPHA:
case GL_ALPHA16F_EXT:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_RGBA:
switch (type)
{
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_RGBA16_EXT:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT_2_10_10_10_REV:
{
switch (internalFormat)
{
case GL_RGB10_A2:
case GL_RGB5_A1:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_RGBA16_SNORM_EXT:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT_4_4_4_4:
{
switch (internalFormat)
{
case GL_RGBA:
case GL_RGBA4:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_RGBA:
case GL_RGBA8:
case GL_RGB5_A1:
case GL_RGBA4:
case GL_SRGB8_ALPHA8:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT_OES:
{
switch (internalFormat)
{
case GL_RGBA:
case GL_RGBA16F:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT:
{
switch (internalFormat)
{
case GL_RGBA16F:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_RGBA:
case GL_RGBA32F:
case GL_RGBA16F:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_RGBA8_SNORM:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT_5_5_5_1:
{
switch (internalFormat)
{
case GL_RGBA:
case GL_RGB5_A1:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_LUMINANCE:
switch (type)
{
case GL_HALF_FLOAT:
{
switch (internalFormat)
{
case GL_LUMINANCE:
case GL_LUMINANCE16F_EXT:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_LUMINANCE:
case GL_LUMINANCE32F_EXT:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_LUMINANCE:
case GL_LUMINANCE8_EXT:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT_OES:
{
switch (internalFormat)
{
case GL_LUMINANCE:
case GL_LUMINANCE16F_EXT:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_RG_INTEGER:
switch (type)
{
case GL_INT:
{
switch (internalFormat)
{
case GL_RG32I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_RG16UI:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_RG16I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_RG8UI:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_RG8I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT:
{
switch (internalFormat)
{
case GL_RG32UI:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_RED_INTEGER:
switch (type)
{
case GL_INT:
{
switch (internalFormat)
{
case GL_R32I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_R16UI:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_R16I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_R8UI:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_R8I:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT:
{
switch (internalFormat)
{
case GL_R32UI:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_RED:
switch (type)
{
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_R16_EXT:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_R16_SNORM_EXT:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_RED:
case GL_R32F:
case GL_R16F:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT_OES:
{
switch (internalFormat)
{
case GL_RED:
case GL_R16F:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT:
{
switch (internalFormat)
{
case GL_RED:
case GL_R16F:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_RED:
case GL_R8:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_R8_SNORM:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_DEPTH_COMPONENT:
switch (type)
{
case GL_UNSIGNED_INT:
{
switch (internalFormat)
{
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT24:
case GL_DEPTH_COMPONENT16:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_INT_24_8:
{
switch (internalFormat)
{
case GL_DEPTH_COMPONENT32_OES:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_DEPTH_COMPONENT32F:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_DEPTH_COMPONENT:
case GL_DEPTH_COMPONENT16:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_DEPTH_STENCIL:
switch (type)
{
case GL_UNSIGNED_INT_24_8:
{
switch (internalFormat)
{
case GL_DEPTH_STENCIL:
case GL_DEPTH24_STENCIL8:
return true;
default:
break;
}
break;
}
case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
{
switch (internalFormat)
{
case GL_DEPTH32F_STENCIL8:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_SRGB_EXT:
switch (type)
{
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_SRGB_EXT:
case GL_SRGB8:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_SRGB_ALPHA_EXT:
switch (type)
{
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_SRGB_ALPHA_EXT:
case GL_SRGB8_ALPHA8_EXT:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_RG:
switch (type)
{
case GL_UNSIGNED_SHORT:
{
switch (internalFormat)
{
case GL_RG16_EXT:
return true;
default:
break;
}
break;
}
case GL_SHORT:
{
switch (internalFormat)
{
case GL_RG16_SNORM_EXT:
return true;
default:
break;
}
break;
}
case GL_FLOAT:
{
switch (internalFormat)
{
case GL_RG:
case GL_RG32F:
case GL_RG16F:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT_OES:
{
switch (internalFormat)
{
case GL_RG:
case GL_RG16F:
return true;
default:
break;
}
break;
}
case GL_HALF_FLOAT:
{
switch (internalFormat)
{
case GL_RG:
case GL_RG16F:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_RG:
case GL_RG8:
return true;
default:
break;
}
break;
}
case GL_BYTE:
{
switch (internalFormat)
{
case GL_RG8_SNORM:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
case GL_BGRA_EXT:
switch (type)
{
case GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT:
{
switch (internalFormat)
{
case GL_BGRA4_ANGLEX:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_BYTE:
{
switch (internalFormat)
{
case GL_BGRA8_EXT:
case GL_BGRA4_ANGLEX:
case GL_BGR5_A1_ANGLEX:
case GL_BGRA_EXT:
return true;
default:
break;
}
break;
}
case GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT:
{
switch (internalFormat)
{
case GL_BGR5_A1_ANGLEX:
return true;
default:
break;
}
break;
}
default:
break;
}
break;
default:
UNREACHABLE();
break;
}
return false;
}
} // namespace gl } // namespace gl
...@@ -293,6 +293,11 @@ VertexFormatType GetVertexFormatType(const VertexAttribute &attrib); ...@@ -293,6 +293,11 @@ VertexFormatType GetVertexFormatType(const VertexAttribute &attrib);
VertexFormatType GetVertexFormatType(const VertexAttribute &attrib, GLenum currentValueType); VertexFormatType GetVertexFormatType(const VertexAttribute &attrib, GLenum currentValueType);
const VertexFormat &GetVertexFormatFromType(VertexFormatType vertexFormatType); const VertexFormat &GetVertexFormatFromType(VertexFormatType vertexFormatType);
// Implemented in format_map_autogen.cpp
bool ValidES3Format(GLenum format);
bool ValidES3Type(GLenum type);
bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat);
} // namespace gl } // namespace gl
#endif // LIBANGLE_FORMATUTILS_H_ #endif // LIBANGLE_FORMATUTILS_H_
...@@ -15,6 +15,7 @@ import angle_format ...@@ -15,6 +15,7 @@ import angle_format
template_cpp = """// GENERATED FILE - DO NOT EDIT. template_cpp = """// GENERATED FILE - DO NOT EDIT.
// Generated by {script_name} using data from {data_source_name}. // Generated by {script_name} using data from {data_source_name}.
// ES3 format info from {es3_data_source_name}.
// //
// Copyright {copyright_year} The ANGLE Project Authors. All rights reserved. // Copyright {copyright_year} The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
...@@ -22,6 +23,7 @@ template_cpp = """// GENERATED FILE - DO NOT EDIT. ...@@ -22,6 +23,7 @@ template_cpp = """// GENERATED FILE - DO NOT EDIT.
// //
// format_map: // format_map:
// Determining the sized internal format from a (format,type) pair. // Determining the sized internal format from a (format,type) pair.
// Also check es3 format combinations for validity.
#include "angle_gl.h" #include "angle_gl.h"
#include "common/debug.h" #include "common/debug.h"
...@@ -43,6 +45,42 @@ GLenum GetSizedFormatInternal(GLenum format, GLenum type) ...@@ -43,6 +45,42 @@ GLenum GetSizedFormatInternal(GLenum format, GLenum type)
return GL_NONE; return GL_NONE;
}} }}
bool ValidES3Format(GLenum format)
{{
switch (format)
{{
{es3_format_cases} return true;
default:
return false;
}}
}}
bool ValidES3Type(GLenum type)
{{
switch (type)
{{
{es3_type_cases} return true;
default:
return false;
}}
}}
bool ValidES3FormatCombination(GLenum format, GLenum type, GLenum internalFormat)
{{
ASSERT(ValidES3Format(format) && ValidES3Type(type));
switch (format)
{{
{es3_combo_cases} default:
UNREACHABLE();
break;
}}
return false;
}}
}} // namespace gl }} // namespace gl
""" """
...@@ -56,13 +94,25 @@ template_format_case = """ case {format}: ...@@ -56,13 +94,25 @@ template_format_case = """ case {format}:
""" """
template_type_case = """ case {type}: template_simple_case = """ case {key}:
return {internal_format}; return {result};
"""
template_es3_combo_type_case = """ case {type}:
{{
switch (internalFormat)
{{
{internal_format_cases} return true;
default:
break;
}}
break;
}}
""" """
def parse_type_case(type, internal_format): def parse_type_case(type, result):
return template_type_case.format( return template_simple_case.format(
type = type, internal_format = internal_format) key = type, result = result)
def parse_format_case(format, type_map): def parse_format_case(format, type_map):
type_cases = "" type_cases = ""
...@@ -80,11 +130,58 @@ format_cases = "" ...@@ -80,11 +130,58 @@ format_cases = ""
for format, type_map in sorted(format_map.iteritems()): for format, type_map in sorted(format_map.iteritems()):
format_cases += parse_format_case(format, type_map) format_cases += parse_format_case(format, type_map)
combo_data_file = 'es3_format_type_combinations.json'
es3_combo_data = angle_format.load_json(combo_data_file)
combo_data = [combo for sublist in es3_combo_data.values() for combo in sublist]
types = set()
formats = set()
combos = {}
for internal_format, format, type in combo_data:
types.update([type])
formats.update([format])
if format not in combos:
combos[format] = {}
if type not in combos[format]:
combos[format][type] = [internal_format]
else:
combos[format][type] += [internal_format]
es3_format_cases = ""
for format in sorted(formats):
es3_format_cases += " case " + format + ":\n"
es3_type_cases = ""
for type in sorted(types):
es3_type_cases += " case " + type + ":\n"
es3_combo_cases = ""
for format, type_combos in combos.iteritems():
this_type_cases = ""
for type, combos in type_combos.iteritems():
internal_format_cases = ""
for internal_format in combos:
internal_format_cases += " case " + internal_format + ":\n"
this_type_cases += template_es3_combo_type_case.format(
type = type, internal_format_cases = internal_format_cases)
es3_combo_cases += template_format_case.format(
format = format, type_cases = this_type_cases)
with open('format_map_autogen.cpp', 'wt') as out_file: with open('format_map_autogen.cpp', 'wt') as out_file:
output_cpp = template_cpp.format( output_cpp = template_cpp.format(
script_name = sys.argv[0], script_name = sys.argv[0],
data_source_name = input_script, data_source_name = input_script,
es3_data_source_name = combo_data_file,
copyright_year = date.today().year, copyright_year = date.today().year,
format_cases = format_cases) format_cases = format_cases,
es3_format_cases = es3_format_cases,
es3_type_cases = es3_type_cases,
es3_combo_cases = es3_combo_cases)
out_file.write(output_cpp) out_file.write(output_cpp)
out_file.close() out_file.close()
...@@ -24,201 +24,6 @@ using namespace angle; ...@@ -24,201 +24,6 @@ using namespace angle;
namespace gl namespace gl
{ {
struct ES3FormatCombination
{
GLenum internalFormat;
GLenum format;
GLenum type;
};
bool operator<(const ES3FormatCombination& a, const ES3FormatCombination& b)
{
return memcmp(&a, &b, sizeof(ES3FormatCombination)) < 0;
}
typedef std::set<ES3FormatCombination> ES3FormatCombinationSet;
static inline void InsertES3FormatCombo(ES3FormatCombinationSet *set, GLenum internalFormat, GLenum format, GLenum type)
{
ES3FormatCombination info;
info.internalFormat = internalFormat;
info.format = format;
info.type = type;
set->insert(info);
}
ES3FormatCombinationSet BuildES3FormatSet()
{
ES3FormatCombinationSet set;
// Format combinations from ES 3.0.1 spec, table 3.2
// clang-format off
// | Internal format | Format | Type |
// | | | |
InsertES3FormatCombo(&set, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGBA4, GL_RGBA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_SRGB8_ALPHA8, GL_RGBA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGBA8_SNORM, GL_RGBA, GL_BYTE );
InsertES3FormatCombo(&set, GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4 );
InsertES3FormatCombo(&set, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV );
InsertES3FormatCombo(&set, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV );
InsertES3FormatCombo(&set, GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1 );
InsertES3FormatCombo(&set, GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_RGBA16F, GL_RGBA, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_RGBA32F, GL_RGBA, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RGBA16F, GL_RGBA, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RGBA8UI, GL_RGBA_INTEGER, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGBA8I, GL_RGBA_INTEGER, GL_BYTE );
InsertES3FormatCombo(&set, GL_RGBA16UI, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT );
InsertES3FormatCombo(&set, GL_RGBA16I, GL_RGBA_INTEGER, GL_SHORT );
InsertES3FormatCombo(&set, GL_RGBA32UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT );
InsertES3FormatCombo(&set, GL_RGBA32I, GL_RGBA_INTEGER, GL_INT );
InsertES3FormatCombo(&set, GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV );
InsertES3FormatCombo(&set, GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGB565, GL_RGB, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_SRGB8, GL_RGB, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGB8_SNORM, GL_RGB, GL_BYTE );
InsertES3FormatCombo(&set, GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5 );
InsertES3FormatCombo(&set, GL_R11F_G11F_B10F, GL_RGB, GL_UNSIGNED_INT_10F_11F_11F_REV );
InsertES3FormatCombo(&set, GL_RGB9_E5, GL_RGB, GL_UNSIGNED_INT_5_9_9_9_REV );
InsertES3FormatCombo(&set, GL_RGB16F, GL_RGB, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_RGB16F, GL_RGB, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_R11F_G11F_B10F, GL_RGB, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_R11F_G11F_B10F, GL_RGB, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_RGB9_E5, GL_RGB, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_RGB9_E5, GL_RGB, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_RGB32F, GL_RGB, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RGB16F, GL_RGB, GL_FLOAT );
InsertES3FormatCombo(&set, GL_R11F_G11F_B10F, GL_RGB, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RGB9_E5, GL_RGB, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGB8I, GL_RGB_INTEGER, GL_BYTE );
InsertES3FormatCombo(&set, GL_RGB16UI, GL_RGB_INTEGER, GL_UNSIGNED_SHORT );
InsertES3FormatCombo(&set, GL_RGB16I, GL_RGB_INTEGER, GL_SHORT );
InsertES3FormatCombo(&set, GL_RGB32UI, GL_RGB_INTEGER, GL_UNSIGNED_INT );
InsertES3FormatCombo(&set, GL_RGB32I, GL_RGB_INTEGER, GL_INT );
InsertES3FormatCombo(&set, GL_RG8, GL_RG, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RG8_SNORM, GL_RG, GL_BYTE );
InsertES3FormatCombo(&set, GL_RG16F, GL_RG, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_RG16F, GL_RG, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_RG32F, GL_RG, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RG16F, GL_RG, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RG8UI, GL_RG_INTEGER, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RG8I, GL_RG_INTEGER, GL_BYTE );
InsertES3FormatCombo(&set, GL_RG16UI, GL_RG_INTEGER, GL_UNSIGNED_SHORT );
InsertES3FormatCombo(&set, GL_RG16I, GL_RG_INTEGER, GL_SHORT );
InsertES3FormatCombo(&set, GL_RG32UI, GL_RG_INTEGER, GL_UNSIGNED_INT );
InsertES3FormatCombo(&set, GL_RG32I, GL_RG_INTEGER, GL_INT );
InsertES3FormatCombo(&set, GL_R8, GL_RED, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_R8_SNORM, GL_RED, GL_BYTE );
InsertES3FormatCombo(&set, GL_R16F, GL_RED, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_R16F, GL_RED, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_R32F, GL_RED, GL_FLOAT );
InsertES3FormatCombo(&set, GL_R16F, GL_RED, GL_FLOAT );
InsertES3FormatCombo(&set, GL_R8UI, GL_RED_INTEGER, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_R8I, GL_RED_INTEGER, GL_BYTE );
InsertES3FormatCombo(&set, GL_R16UI, GL_RED_INTEGER, GL_UNSIGNED_SHORT );
InsertES3FormatCombo(&set, GL_R16I, GL_RED_INTEGER, GL_SHORT );
InsertES3FormatCombo(&set, GL_R32UI, GL_RED_INTEGER, GL_UNSIGNED_INT );
InsertES3FormatCombo(&set, GL_R32I, GL_RED_INTEGER, GL_INT );
// Unsized formats
InsertES3FormatCombo(&set, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4 );
InsertES3FormatCombo(&set, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1 );
InsertES3FormatCombo(&set, GL_RGB, GL_RGB, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5 );
InsertES3FormatCombo(&set, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_SRGB_ALPHA_EXT, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_SRGB_EXT, GL_SRGB_EXT, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RG, GL_RG, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RG, GL_RG, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RG, GL_RG, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_RG, GL_RG, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_RED, GL_RED, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_RED, GL_RED, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RED, GL_RED, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_RED, GL_RED, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_DEPTH_STENCIL, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8 );
// Depth stencil formats
InsertES3FormatCombo(&set, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT );
InsertES3FormatCombo(&set, GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT );
InsertES3FormatCombo(&set, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT );
InsertES3FormatCombo(&set, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT );
InsertES3FormatCombo(&set, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8 );
InsertES3FormatCombo(&set, GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
// From GL_EXT_sRGB
InsertES3FormatCombo(&set, GL_SRGB8_ALPHA8_EXT, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_SRGB8, GL_SRGB_EXT, GL_UNSIGNED_BYTE );
// From GL_OES_texture_float
InsertES3FormatCombo(&set, GL_RGBA, GL_RGBA, GL_FLOAT );
InsertES3FormatCombo(&set, GL_RGB, GL_RGB, GL_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT );
InsertES3FormatCombo(&set, GL_ALPHA, GL_ALPHA, GL_FLOAT );
// From GL_OES_texture_half_float
InsertES3FormatCombo(&set, GL_RGBA, GL_RGBA, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_RGB, GL_RGB, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE, GL_LUMINANCE, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_ALPHA, GL_ALPHA, GL_HALF_FLOAT_OES );
// From GL_EXT_texture_format_BGRA8888
InsertES3FormatCombo(&set, GL_BGRA_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE );
// From GL_EXT_texture_storage
// | Internal format | Format | Type |
// | | | |
InsertES3FormatCombo(&set, GL_ALPHA8_EXT, GL_ALPHA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_LUMINANCE8_EXT, GL_LUMINANCE, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_LUMINANCE8_ALPHA8_EXT, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_ALPHA32F_EXT, GL_ALPHA, GL_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE32F_EXT, GL_LUMINANCE, GL_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE_ALPHA32F_EXT, GL_LUMINANCE_ALPHA, GL_FLOAT );
InsertES3FormatCombo(&set, GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_ALPHA16F_EXT, GL_ALPHA, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE16F_EXT, GL_LUMINANCE, GL_HALF_FLOAT_OES );
InsertES3FormatCombo(&set, GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT );
InsertES3FormatCombo(&set, GL_LUMINANCE_ALPHA16F_EXT, GL_LUMINANCE_ALPHA, GL_HALF_FLOAT_OES );
// From GL_EXT_texture_storage and GL_EXT_texture_format_BGRA8888
InsertES3FormatCombo(&set, GL_BGRA8_EXT, GL_BGRA_EXT, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_BGRA4_ANGLEX, GL_BGRA_EXT, GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT);
InsertES3FormatCombo(&set, GL_BGRA4_ANGLEX, GL_BGRA_EXT, GL_UNSIGNED_BYTE );
InsertES3FormatCombo(&set, GL_BGR5_A1_ANGLEX, GL_BGRA_EXT, GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT);
InsertES3FormatCombo(&set, GL_BGR5_A1_ANGLEX, GL_BGRA_EXT, GL_UNSIGNED_BYTE );
// From GL_ANGLE_depth_texture and OES_depth_texture
InsertES3FormatCombo(&set, GL_DEPTH_COMPONENT32_OES, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT_24_8_OES );
InsertES3FormatCombo(&set, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT );
InsertES3FormatCombo(&set, GL_DEPTH_COMPONENT, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT );
// clang-format on
// From GL_EXT_texture_norm16
InsertES3FormatCombo(&set, GL_R16_EXT, GL_RED, GL_UNSIGNED_SHORT);
InsertES3FormatCombo(&set, GL_RG16_EXT, GL_RG, GL_UNSIGNED_SHORT);
InsertES3FormatCombo(&set, GL_RGB16_EXT, GL_RGB, GL_UNSIGNED_SHORT);
InsertES3FormatCombo(&set, GL_RGBA16_EXT, GL_RGBA, GL_UNSIGNED_SHORT);
InsertES3FormatCombo(&set, GL_R16_SNORM_EXT, GL_RED, GL_SHORT);
InsertES3FormatCombo(&set, GL_RG16_SNORM_EXT, GL_RG, GL_SHORT);
InsertES3FormatCombo(&set, GL_RGB16_SNORM_EXT, GL_RGB, GL_SHORT);
InsertES3FormatCombo(&set, GL_RGBA16_SNORM_EXT, GL_RGBA, GL_SHORT);
return set;
}
static bool ValidateTexImageFormatCombination(gl::Context *context, GLenum internalFormat, GLenum format, GLenum type) static bool ValidateTexImageFormatCombination(gl::Context *context, GLenum internalFormat, GLenum format, GLenum type)
{ {
// For historical reasons, glTexImage2D and glTexImage3D pass in their internal format as a // For historical reasons, glTexImage2D and glTexImage3D pass in their internal format as a
...@@ -233,47 +38,14 @@ static bool ValidateTexImageFormatCombination(gl::Context *context, GLenum inter ...@@ -233,47 +38,14 @@ static bool ValidateTexImageFormatCombination(gl::Context *context, GLenum inter
} }
// The type and format are valid if any supported internal format has that type and format // The type and format are valid if any supported internal format has that type and format
bool formatSupported = false; if (!ValidES3Format(format) || !ValidES3Type(type))
bool typeSupported = false;
static const ES3FormatCombinationSet es3FormatSet = BuildES3FormatSet();
for (ES3FormatCombinationSet::const_iterator i = es3FormatSet.begin(); i != es3FormatSet.end(); i++)
{
if (i->format == format || i->type == type)
{
const gl::InternalFormat &info = gl::GetInternalFormatInfo(i->internalFormat);
bool supported =
info.textureSupport(context->getClientMajorVersion(), context->getExtensions());
if (supported && i->type == type)
{
typeSupported = true;
}
if (supported && i->format == format)
{
formatSupported = true;
}
// Early-out if both type and format are supported now
if (typeSupported && formatSupported)
{
break;
}
}
}
if (!typeSupported || !formatSupported)
{ {
context->handleError(Error(GL_INVALID_ENUM)); context->handleError(Error(GL_INVALID_ENUM));
return false; return false;
} }
// Check if this is a valid format combination to load texture data // Check if this is a valid format combination to load texture data
ES3FormatCombination searchFormat; if (!ValidES3FormatCombination(format, type, internalFormat))
searchFormat.internalFormat = internalFormat;
searchFormat.format = format;
searchFormat.type = type;
if (es3FormatSet.find(searchFormat) == es3FormatSet.end())
{ {
context->handleError(Error(GL_INVALID_OPERATION)); context->handleError(Error(GL_INVALID_OPERATION));
return false; return false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment