Commit fea65766 by Mohan Maiya Committed by Commit Bot

Vulkan: Add support for OES_vertex_type_10_10_10_2

- Add support to CPU/GPU convert vertex formats - Add test cases for type conversion in angle_end2end_tests - Fix a bug in shader script by adding a ceil when calculating bytes Bug: angleproject:3192 Test: angle_end2end_tests --gtest_filter=VertexAttributeTest*Packed1010102* Change-Id: I57bab9fc1c1041cd734746d0e52a33717b635ec0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1788495Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org> Commit-Queue: Mohan Maiya <m.maiya@samsung.com>
parent 4e57520a
...@@ -155,6 +155,7 @@ Samsung Electronics, Inc. ...@@ -155,6 +155,7 @@ Samsung Electronics, Inc.
Hyunseok Ko Hyunseok Ko
Jaedon Lee Jaedon Lee
Jeff Vigil Jeff Vigil
Kyeongmin Kim
Minkyu Jeong Minkyu Jeong
Mohan Maiya Mohan Maiya
......
{ {
"src/libANGLE/renderer/FormatID_autogen.h": "src/libANGLE/renderer/FormatID_autogen.h":
"f127ba841492924a28ffe92e7ead74e9", "0e45fa793ccf180d7f608dbe2d9927a5",
"src/libANGLE/renderer/Format_table_autogen.cpp": "src/libANGLE/renderer/Format_table_autogen.cpp":
"a30ec4e0658eb44634a4c44b8334cde7", "808c9476e937a1d79d41451c84622541",
"src/libANGLE/renderer/angle_format.py": "src/libANGLE/renderer/angle_format.py":
"eefe6befdc925574207746fa531165fd", "32ba71942c0fd00e6807104f1bb80a3c",
"src/libANGLE/renderer/angle_format_data.json": "src/libANGLE/renderer/angle_format_data.json":
"e39704d451d108335e737c39ad423113", "e39704d451d108335e737c39ad423113",
"src/libANGLE/renderer/angle_format_map.json": "src/libANGLE/renderer/angle_format_map.json":
"ce3cf0c03ed74a997dbe9d6b7bf5e6f0", "7c89f37c637323a34f4ec46ca11a6078",
"src/libANGLE/renderer/gen_angle_format_table.py": "src/libANGLE/renderer/gen_angle_format_table.py":
"dfa234d7707682fec20b571d2c16d784" "8e349a643e81a028ebb54bde3756f9f7"
} }
\ No newline at end of file
{ {
"src/libANGLE/renderer/angle_format.py": "src/libANGLE/renderer/angle_format.py":
"eefe6befdc925574207746fa531165fd", "32ba71942c0fd00e6807104f1bb80a3c",
"src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py": "src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py":
"bf11e3404d4622059b6e9c4e96abf95e", "bf11e3404d4622059b6e9c4e96abf95e",
"src/libANGLE/renderer/d3d/d3d11/texture_format_data.json": "src/libANGLE/renderer/d3d/d3d11/texture_format_data.json":
......
{ {
"src/libANGLE/renderer/angle_format.py": "src/libANGLE/renderer/angle_format.py":
"eefe6befdc925574207746fa531165fd", "32ba71942c0fd00e6807104f1bb80a3c",
"src/libANGLE/renderer/angle_format_map.json": "src/libANGLE/renderer/angle_format_map.json":
"ce3cf0c03ed74a997dbe9d6b7bf5e6f0", "7c89f37c637323a34f4ec46ca11a6078",
"src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json": "src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json":
"24f525b05dc665fbbc8c6d68fb863719", "24f525b05dc665fbbc8c6d68fb863719",
"src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp": "src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp":
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"scripts/gl.xml": "scripts/gl.xml":
"b470cb06b06cbbe7adb2c8129ec85708", "b470cb06b06cbbe7adb2c8129ec85708",
"src/libANGLE/renderer/angle_format.py": "src/libANGLE/renderer/angle_format.py":
"eefe6befdc925574207746fa531165fd", "32ba71942c0fd00e6807104f1bb80a3c",
"src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp": "src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp":
"7ebaa7f7525a0fe13f163ec076a8eace", "7ebaa7f7525a0fe13f163ec076a8eace",
"src/libANGLE/renderer/gl/DispatchTableGL_autogen.h": "src/libANGLE/renderer/gl/DispatchTableGL_autogen.h":
......
{ {
"src/libANGLE/renderer/angle_format.py": "src/libANGLE/renderer/angle_format.py":
"eefe6befdc925574207746fa531165fd", "32ba71942c0fd00e6807104f1bb80a3c",
"src/libANGLE/renderer/angle_format_map.json": "src/libANGLE/renderer/angle_format_map.json":
"ce3cf0c03ed74a997dbe9d6b7bf5e6f0", "7c89f37c637323a34f4ec46ca11a6078",
"src/libANGLE/renderer/vulkan/gen_vk_format_table.py": "src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
"ed6800108a872709e5e53fde2833aa86", "ed6800108a872709e5e53fde2833aa86",
"src/libANGLE/renderer/vulkan/vk_format_map.json": "src/libANGLE/renderer/vulkan/vk_format_map.json":
"d83e8f19044c7709e33412231226a3ae", "ef0c23a6620215cfacfc690e9995ba31",
"src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp": "src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
"ffc343058ee7f21e0a945558e653c4fc" "ab30905d3d43b2186296f85c69db7e20"
} }
\ No newline at end of file
...@@ -137,6 +137,38 @@ ...@@ -137,6 +137,38 @@
"ccbcd91094e7e9308573b3033f674e2c", "ccbcd91094e7e9308573b3033f674e2c",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc":
"628e93148792a85a1fa0c688e1686a1d", "628e93148792a85a1fa0c688e1686a1d",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001A.inc":
"ee4f06ba87a3dde490e01a0ec4561e10",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001B.inc":
"d2b62347cd2b80f885adfa31f6aeccc0",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001C.inc":
"92ea6760ba66b603fcbc1bebf207aa78",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001D.inc":
"72bbe32670195bcf4be9d1edd8152178",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001E.inc":
"6c4b93206f5b905fc384f9ea629ab91d",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001F.inc":
"e6269fe4949548993371aaef33c63dda",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000020.inc":
"d79651c76fdfefb0949ae18e006a6d22",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000021.inc":
"52d7d35300cbdc1825bb75445a4784ba",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000022.inc":
"3cb10ed1f526018215af300c40614fd7",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000023.inc":
"cf7d1cfe77021df82b8c2ff5ec97ac59",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000024.inc":
"44fd4a3c651d31fd783a42dfc0bde182",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000025.inc":
"25b270092f8e6a1bfeb3c6f5e441d792",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000026.inc":
"5c71117a27b9b60653453a2a72a90cb5",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000027.inc":
"757a459d8b68e2c5e74c596ffbeecee5",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000028.inc":
"d6cfcf49825f3da242d0f8935b0e30f6",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000029.inc":
"59e6c4a829283dc6db1664bb397ed6a2",
"src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc":
"235ca7c3979ce29a49c320d000ee7409", "235ca7c3979ce29a49c320d000ee7409",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc":
...@@ -248,7 +280,7 @@ ...@@ -248,7 +280,7 @@
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp": "src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp":
"ca35df77d258baa0636529d1f0f446a9", "ca35df77d258baa0636529d1f0f446a9",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp": "src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp":
"d6abd323d011689cef5db83162214be2", "debe6949313d7c23395e603a5f01162c",
"src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert": "src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
"805ec8b2f87d4bd4242dc5b1c58ba3b4", "805ec8b2f87d4bd4242dc5b1c58ba3b4",
"src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag": "src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag":
...@@ -260,9 +292,9 @@ ...@@ -260,9 +292,9 @@
"src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp": "src/libANGLE/renderer/vulkan/shaders/src/OverlayDraw.comp":
"dcc246b398b2e07a869a264666499362", "dcc246b398b2e07a869a264666499362",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp": "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"9035e5a2674bbab577576d5b704fbe99", "0e9742f5a784d2b43f5ca758cb23719a",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h": "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
"bd3beed76c9069d967cc2946a035e2cc", "996dc7cf95d03551b55a903b2c8ac755",
"tools/glslang/glslang_validator.exe.sha1": "tools/glslang/glslang_validator.exe.sha1":
"289f30598865a987a21b79ae525fc66f", "289f30598865a987a21b79ae525fc66f",
"tools/glslang/glslang_validator.sha1": "tools/glslang/glslang_validator.sha1":
......
{ {
"src/libANGLE/renderer/angle_format.py": "src/libANGLE/renderer/angle_format.py":
"eefe6befdc925574207746fa531165fd", "32ba71942c0fd00e6807104f1bb80a3c",
"src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py": "src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py":
"dab4614bbee0c3fbc5b3ccaaa11ba9d3", "dab4614bbee0c3fbc5b3ccaaa11ba9d3",
"src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json": "src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json":
......
...@@ -269,6 +269,9 @@ std::ostream &operator<<(std::ostream &os, VertexAttribType value) ...@@ -269,6 +269,9 @@ std::ostream &operator<<(std::ostream &os, VertexAttribType value)
case VertexAttribType::Int2101010: case VertexAttribType::Int2101010:
os << "GL_INT_10_10_10_2"; os << "GL_INT_10_10_10_2";
break; break;
case VertexAttribType::Int1010102:
os << "GL_INT_10_10_10_2_OES";
break;
case VertexAttribType::Short: case VertexAttribType::Short:
os << "GL_SHORT"; os << "GL_SHORT";
break; break;
...@@ -281,6 +284,9 @@ std::ostream &operator<<(std::ostream &os, VertexAttribType value) ...@@ -281,6 +284,9 @@ std::ostream &operator<<(std::ostream &os, VertexAttribType value)
case VertexAttribType::UnsignedInt2101010: case VertexAttribType::UnsignedInt2101010:
os << "GL_UNSIGNED_INT_10_10_10_2"; os << "GL_UNSIGNED_INT_10_10_10_2";
break; break;
case VertexAttribType::UnsignedInt1010102:
os << "GL_UNSIGNED_INT_10_10_10_2_OES";
break;
case VertexAttribType::UnsignedShort: case VertexAttribType::UnsignedShort:
os << "GL_UNSIGNED_SHORT"; os << "GL_UNSIGNED_SHORT";
break; break;
......
...@@ -335,8 +335,10 @@ enum class VertexAttribType ...@@ -335,8 +335,10 @@ enum class VertexAttribType
UnsignedInt2101010 = 13, // GLenum == 0x8368 UnsignedInt2101010 = 13, // GLenum == 0x8368
HalfFloatOES = 14, // GLenum == 0x8D61 HalfFloatOES = 14, // GLenum == 0x8D61
Int2101010 = 15, // GLenum == 0x8D9F Int2101010 = 15, // GLenum == 0x8D9F
InvalidEnum = 16, UnsignedInt1010102 = 16, // GLenum == 0x8DF6
EnumCount = 17, Int1010102 = 17, // GLenum == 0x8DF7
InvalidEnum = 18,
EnumCount = 18,
}; };
template <> template <>
...@@ -351,6 +353,10 @@ constexpr VertexAttribType FromGLenum<VertexAttribType>(GLenum from) ...@@ -351,6 +353,10 @@ constexpr VertexAttribType FromGLenum<VertexAttribType>(GLenum from)
return VertexAttribType::HalfFloatOES; return VertexAttribType::HalfFloatOES;
if (from == GL_INT_2_10_10_10_REV) if (from == GL_INT_2_10_10_10_REV)
return VertexAttribType::Int2101010; return VertexAttribType::Int2101010;
if (from == GL_UNSIGNED_INT_10_10_10_2_OES)
return VertexAttribType::UnsignedInt1010102;
if (from == GL_INT_10_10_10_2_OES)
return VertexAttribType::Int1010102;
return VertexAttribType::InvalidEnum; return VertexAttribType::InvalidEnum;
} }
...@@ -363,6 +369,10 @@ constexpr GLenum ToGLenum(VertexAttribType from) ...@@ -363,6 +369,10 @@ constexpr GLenum ToGLenum(VertexAttribType from)
return GL_HALF_FLOAT_OES; return GL_HALF_FLOAT_OES;
if (from == VertexAttribType::UnsignedInt2101010) if (from == VertexAttribType::UnsignedInt2101010)
return GL_UNSIGNED_INT_2_10_10_10_REV; return GL_UNSIGNED_INT_2_10_10_10_REV;
if (from == VertexAttribType::UnsignedInt1010102)
return GL_UNSIGNED_INT_10_10_10_2_OES;
if (from == VertexAttribType::Int1010102)
return GL_INT_10_10_10_2_OES;
return static_cast<GLenum>(from) + GL_BYTE; return static_cast<GLenum>(from) + GL_BYTE;
} }
...@@ -378,6 +388,8 @@ ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Fixed, GL_FIXED); ...@@ -378,6 +388,8 @@ ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Fixed, GL_FIXED);
ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int2101010, GL_INT_2_10_10_10_REV); ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int2101010, GL_INT_2_10_10_10_REV);
ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, HalfFloatOES, GL_HALF_FLOAT_OES); ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, HalfFloatOES, GL_HALF_FLOAT_OES);
ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt2101010, GL_UNSIGNED_INT_2_10_10_10_REV); ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt2101010, GL_UNSIGNED_INT_2_10_10_10_REV);
ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, Int1010102, GL_INT_10_10_10_2_OES);
ANGLE_VALIDATE_PACKED_ENUM(VertexAttribType, UnsignedInt1010102, GL_UNSIGNED_INT_10_10_10_2_OES);
std::ostream &operator<<(std::ostream &os, VertexAttribType value); std::ostream &operator<<(std::ostream &os, VertexAttribType value);
......
...@@ -253,6 +253,18 @@ std::string ToString(const T &value) ...@@ -253,6 +253,18 @@ std::string ToString(const T &value)
// EXT_texture_type_2_10_10_10_REV // EXT_texture_type_2_10_10_10_REV
#define GL_RGB10_UNORM_ANGLEX 0x6AEE #define GL_RGB10_UNORM_ANGLEX 0x6AEE
// These are dummy formats for OES_vertex_type_10_10_10_2
#define GL_A2_RGB10_UNORM_ANGLEX 0x6AEF
#define GL_A2_RGB10_SNORM_ANGLEX 0x6AF0
#define GL_A2_RGB10_USCALED_ANGLEX 0x6AF1
#define GL_A2_RGB10_SSCALED_ANGLEX 0x6AF2
#define GL_X2_RGB10_UINT_ANGLEX 0x6AF3
#define GL_X2_RGB10_SINT_ANGLEX 0x6AF4
#define GL_X2_RGB10_USCALED_ANGLEX 0x6AF5
#define GL_X2_RGB10_SSCALED_ANGLEX 0x6AF6
#define GL_X2_RGB10_UNORM_ANGLEX 0x6AF7
#define GL_X2_RGB10_SNORM_ANGLEX 0x6AF8
#define ANGLE_CHECK_GL_ALLOC(context, result) \ #define ANGLE_CHECK_GL_ALLOC(context, result) \
ANGLE_CHECK(context, result, "Failed to allocate host memory", GL_OUT_OF_MEMORY) ANGLE_CHECK(context, result, "Failed to allocate host memory", GL_OUT_OF_MEMORY)
......
...@@ -824,6 +824,7 @@ const ExtensionInfoMap &GetExtensionInfoMap() ...@@ -824,6 +824,7 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_EXT_color_buffer_float"] = enableableExtension(&Extensions::colorBufferFloat); map["GL_EXT_color_buffer_float"] = enableableExtension(&Extensions::colorBufferFloat);
map["GL_OES_vertex_half_float"] = enableableExtension(&Extensions::vertexHalfFloat); map["GL_OES_vertex_half_float"] = enableableExtension(&Extensions::vertexHalfFloat);
map["GL_OES_vertex_array_object"] = enableableExtension(&Extensions::vertexArrayObject); map["GL_OES_vertex_array_object"] = enableableExtension(&Extensions::vertexArrayObject);
map["GL_OES_vertex_type_10_10_10_2"] = enableableExtension(&Extensions::vertexAttribType101010102);
map["GL_KHR_debug"] = esOnlyExtension(&Extensions::debug); map["GL_KHR_debug"] = esOnlyExtension(&Extensions::debug);
map["GL_OES_texture_border_clamp"] = enableableExtension(&Extensions::textureBorderClamp); map["GL_OES_texture_border_clamp"] = enableableExtension(&Extensions::textureBorderClamp);
// TODO(jmadill): Enable this when complete. // TODO(jmadill): Enable this when complete.
......
...@@ -385,6 +385,9 @@ struct Extensions ...@@ -385,6 +385,9 @@ struct Extensions
// GL_OES_vertex_array_object // GL_OES_vertex_array_object
bool vertexArrayObject = false; bool vertexArrayObject = false;
// GL_OES_vertex_type_10_10_10_2
bool vertexAttribType101010102 = false;
// GL_KHR_debug // GL_KHR_debug
bool debug = false; bool debug = false;
GLuint maxDebugMessageLength = 0; GLuint maxDebugMessageLength = 0;
......
...@@ -9343,6 +9343,10 @@ void StateCache::updateVertexAttribTypesValidation(Context *context) ...@@ -9343,6 +9343,10 @@ void StateCache::updateVertexAttribTypesValidation(Context *context)
? VertexAttribTypeCase::Valid ? VertexAttribTypeCase::Valid
: VertexAttribTypeCase::Invalid; : VertexAttribTypeCase::Invalid;
VertexAttribTypeCase vertexType101010102Validity =
(context->getExtensions().vertexAttribType101010102) ? VertexAttribTypeCase::ValidSize3or4
: VertexAttribTypeCase::Invalid;
if (context->getClientMajorVersion() <= 2) if (context->getClientMajorVersion() <= 2)
{ {
mCachedVertexAttribTypesValidation = {{ mCachedVertexAttribTypesValidation = {{
...@@ -9353,6 +9357,8 @@ void StateCache::updateVertexAttribTypesValidation(Context *context) ...@@ -9353,6 +9357,8 @@ void StateCache::updateVertexAttribTypesValidation(Context *context)
{VertexAttribType::Float, VertexAttribTypeCase::Valid}, {VertexAttribType::Float, VertexAttribTypeCase::Valid},
{VertexAttribType::Fixed, VertexAttribTypeCase::Valid}, {VertexAttribType::Fixed, VertexAttribTypeCase::Valid},
{VertexAttribType::HalfFloatOES, halfFloatValidity}, {VertexAttribType::HalfFloatOES, halfFloatValidity},
{VertexAttribType::Int1010102, vertexType101010102Validity},
{VertexAttribType::UnsignedInt1010102, vertexType101010102Validity},
}}; }};
} }
else else
...@@ -9370,6 +9376,8 @@ void StateCache::updateVertexAttribTypesValidation(Context *context) ...@@ -9370,6 +9376,8 @@ void StateCache::updateVertexAttribTypesValidation(Context *context)
{VertexAttribType::Int2101010, VertexAttribTypeCase::ValidSize4Only}, {VertexAttribType::Int2101010, VertexAttribTypeCase::ValidSize4Only},
{VertexAttribType::HalfFloatOES, halfFloatValidity}, {VertexAttribType::HalfFloatOES, halfFloatValidity},
{VertexAttribType::UnsignedInt2101010, VertexAttribTypeCase::ValidSize4Only}, {VertexAttribType::UnsignedInt2101010, VertexAttribTypeCase::ValidSize4Only},
{VertexAttribType::Int1010102, vertexType101010102Validity},
{VertexAttribType::UnsignedInt1010102, vertexType101010102Validity},
}}; }};
mCachedIntegerVertexAttribTypesValidation = {{ mCachedIntegerVertexAttribTypesValidation = {{
......
...@@ -122,6 +122,7 @@ enum class VertexAttribTypeCase ...@@ -122,6 +122,7 @@ enum class VertexAttribTypeCase
Invalid = 0, Invalid = 0,
Valid = 1, Valid = 1,
ValidSize4Only = 2, ValidSize4Only = 2,
ValidSize3or4 = 3,
}; };
// Helper class for managing cache variables and state changes. // Helper class for managing cache variables and state changes.
......
...@@ -329,6 +329,7 @@ MSG kInvalidVaryingLocation = "Location exceeds max varying."; ...@@ -329,6 +329,7 @@ MSG kInvalidVaryingLocation = "Location exceeds max varying.";
MSG kInvalidVertexArray = "Vertex array does not exist."; MSG kInvalidVertexArray = "Vertex array does not exist.";
MSG kInvalidVertexArrayName = "name is not a valid vertex array."; MSG kInvalidVertexArrayName = "name is not a valid vertex array.";
MSG kInvalidVertexAttribSize2101010 = "Type is INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_REV and size is not 4."; MSG kInvalidVertexAttribSize2101010 = "Type is INT_2_10_10_10_REV or UNSIGNED_INT_2_10_10_10_REV and size is not 4.";
MSG kInvalidVertexAttribSize1010102 = "Type is INT_10_10_10_2_OES or UNSIGNED_INT_10_10_10_2_OES and size is not 3 or 4.";
MSG kInvalidVertexAttrSize = "Vertex attribute size must be 1 = 2 = 3 = or 4."; MSG kInvalidVertexAttrSize = "Vertex attribute size must be 1 = 2 = 3 = or 4.";
MSG kInvalidVertexPointerSize = "Size for built-in vertex attribute is outside allowed range."; MSG kInvalidVertexPointerSize = "Size for built-in vertex attribute is outside allowed range.";
MSG kInvalidVertexPointerStride = "Invalid stride for built-in vertex attribute."; MSG kInvalidVertexPointerStride = "Invalid stride for built-in vertex attribute.";
......
...@@ -1679,6 +1679,49 @@ angle::FormatID GetVertexFormatID(VertexAttribType type, ...@@ -1679,6 +1679,49 @@ angle::FormatID GetVertexFormatID(VertexAttribType type,
if (normalized) if (normalized)
return angle::FormatID::R10G10B10A2_UNORM; return angle::FormatID::R10G10B10A2_UNORM;
return angle::FormatID::R10G10B10A2_USCALED; return angle::FormatID::R10G10B10A2_USCALED;
case VertexAttribType::Int1010102:
switch (components)
{
case 3:
if (pureInteger)
return angle::FormatID::X2R10G10B10_SINT_VERTEX;
if (normalized)
return angle::FormatID::X2R10G10B10_SNORM_VERTEX;
return angle::FormatID::X2R10G10B10_SSCALED_VERTEX;
case 4:
if (pureInteger)
return angle::FormatID::A2R10G10B10_SINT_VERTEX;
if (normalized)
return angle::FormatID::A2R10G10B10_SNORM_VERTEX;
return angle::FormatID::A2R10G10B10_SSCALED_VERTEX;
default:
UNREACHABLE();
#if !UNREACHABLE_IS_NORETURN
return angle::FormatID::NONE;
#endif
}
case VertexAttribType::UnsignedInt1010102:
switch (components)
{
case 3:
if (pureInteger)
return angle::FormatID::X2R10G10B10_UINT_VERTEX;
if (normalized)
return angle::FormatID::X2R10G10B10_UNORM_VERTEX;
return angle::FormatID::X2R10G10B10_USCALED_VERTEX;
case 4:
if (pureInteger)
return angle::FormatID::A2R10G10B10_UINT_VERTEX;
if (normalized)
return angle::FormatID::A2R10G10B10_UNORM_VERTEX;
return angle::FormatID::A2R10G10B10_USCALED_VERTEX;
default:
UNREACHABLE();
#if !UNREACHABLE_IS_NORETURN
return angle::FormatID::NONE;
#endif
}
default: default:
UNREACHABLE(); UNREACHABLE();
#if !UNREACHABLE_IS_NORETURN #if !UNREACHABLE_IS_NORETURN
...@@ -2166,6 +2209,61 @@ const VertexFormat &GetVertexFormatFromID(angle::FormatID vertexFormatID) ...@@ -2166,6 +2209,61 @@ const VertexFormat &GetVertexFormatFromID(angle::FormatID vertexFormatID)
static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, true); static const VertexFormat format(GL_UNSIGNED_INT_2_10_10_10_REV, GL_FALSE, 4, true);
return format; return format;
} }
case angle::FormatID::A2R10G10B10_SSCALED_VERTEX:
{
static const VertexFormat format(GL_INT_10_10_10_2_OES, GL_FALSE, 4, false);
return format;
}
case angle::FormatID::A2R10G10B10_USCALED_VERTEX:
{
static const VertexFormat format(GL_UNSIGNED_INT_10_10_10_2_OES, GL_FALSE, 4, false);
return format;
}
case angle::FormatID::A2R10G10B10_SNORM_VERTEX:
{
static const VertexFormat format(GL_INT_10_10_10_2_OES, GL_TRUE, 4, false);
return format;
}
case angle::FormatID::A2R10G10B10_UNORM_VERTEX:
{
static const VertexFormat format(GL_UNSIGNED_INT_10_10_10_2_OES, GL_TRUE, 4, false);
return format;
}
case angle::FormatID::A2R10G10B10_SINT_VERTEX:
{
static const VertexFormat format(GL_INT_10_10_10_2_OES, GL_FALSE, 4, true);
return format;
}
case angle::FormatID::A2R10G10B10_UINT_VERTEX:
{
static const VertexFormat format(GL_UNSIGNED_INT_10_10_10_2_OES, GL_FALSE, 4, true);
return format;
}
case angle::FormatID::X2R10G10B10_SSCALED_VERTEX:
{
static const VertexFormat format(GL_INT_10_10_10_2_OES, GL_FALSE, 4, false);
return format;
}
case angle::FormatID::X2R10G10B10_USCALED_VERTEX:
{
static const VertexFormat format(GL_UNSIGNED_INT_10_10_10_2_OES, GL_FALSE, 4, false);
return format;
}
case angle::FormatID::X2R10G10B10_SNORM_VERTEX:
{
static const VertexFormat format(GL_INT_10_10_10_2_OES, GL_TRUE, 4, false);
return format;
}
case angle::FormatID::X2R10G10B10_UNORM_VERTEX:
{
static const VertexFormat format(GL_UNSIGNED_INT_10_10_10_2_OES, GL_TRUE, 4, false);
return format;
}
case angle::FormatID::X2R10G10B10_SINT_VERTEX:
{
static const VertexFormat format(GL_INT_10_10_10_2_OES, GL_FALSE, 4, true);
return format;
}
default: default:
{ {
static const VertexFormat format(GL_NONE, GL_FALSE, 0, false); static const VertexFormat format(GL_NONE, GL_FALSE, 0, false);
...@@ -2236,6 +2334,18 @@ size_t GetVertexFormatSize(angle::FormatID vertexFormatID) ...@@ -2236,6 +2334,18 @@ size_t GetVertexFormatSize(angle::FormatID vertexFormatID)
case angle::FormatID::R10G10B10A2_UNORM: case angle::FormatID::R10G10B10A2_UNORM:
case angle::FormatID::R10G10B10A2_SINT: case angle::FormatID::R10G10B10A2_SINT:
case angle::FormatID::R10G10B10A2_UINT: case angle::FormatID::R10G10B10A2_UINT:
case angle::FormatID::A2R10G10B10_SSCALED_VERTEX:
case angle::FormatID::A2R10G10B10_USCALED_VERTEX:
case angle::FormatID::A2R10G10B10_SINT_VERTEX:
case angle::FormatID::A2R10G10B10_UINT_VERTEX:
case angle::FormatID::A2R10G10B10_SNORM_VERTEX:
case angle::FormatID::A2R10G10B10_UNORM_VERTEX:
case angle::FormatID::X2R10G10B10_SSCALED_VERTEX:
case angle::FormatID::X2R10G10B10_USCALED_VERTEX:
case angle::FormatID::X2R10G10B10_SINT_VERTEX:
case angle::FormatID::X2R10G10B10_UINT_VERTEX:
case angle::FormatID::X2R10G10B10_SNORM_VERTEX:
case angle::FormatID::X2R10G10B10_UNORM_VERTEX:
return 4; return 4;
case angle::FormatID::R16G16B16_SSCALED: case angle::FormatID::R16G16B16_SSCALED:
......
...@@ -20,6 +20,12 @@ enum class FormatID ...@@ -20,6 +20,12 @@ enum class FormatID
NONE, NONE,
A16_FLOAT, A16_FLOAT,
A1R5G5B5_UNORM, A1R5G5B5_UNORM,
A2R10G10B10_SINT_VERTEX,
A2R10G10B10_SNORM_VERTEX,
A2R10G10B10_SSCALED_VERTEX,
A2R10G10B10_UINT_VERTEX,
A2R10G10B10_UNORM_VERTEX,
A2R10G10B10_USCALED_VERTEX,
A32_FLOAT, A32_FLOAT,
A8_UNORM, A8_UNORM,
ASTC_10x10_SRGB_BLOCK, ASTC_10x10_SRGB_BLOCK,
...@@ -214,10 +220,16 @@ enum class FormatID ...@@ -214,10 +220,16 @@ enum class FormatID
R8_UNORM, R8_UNORM,
R8_USCALED, R8_USCALED,
R9G9B9E5_SHAREDEXP, R9G9B9E5_SHAREDEXP,
S8_UINT S8_UINT,
X2R10G10B10_SINT_VERTEX,
X2R10G10B10_SNORM_VERTEX,
X2R10G10B10_SSCALED_VERTEX,
X2R10G10B10_UINT_VERTEX,
X2R10G10B10_UNORM_VERTEX,
X2R10G10B10_USCALED_VERTEX
}; };
constexpr uint32_t kNumANGLEFormats = 198; constexpr uint32_t kNumANGLEFormats = 210;
} // namespace angle } // namespace angle
......
...@@ -27,6 +27,12 @@ const Format gFormatInfoTable[] = { ...@@ -27,6 +27,12 @@ const Format gFormatInfoTable[] = {
{ FormatID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false, false, gl::VertexAttribType::InvalidEnum }, { FormatID::NONE, GL_NONE, GL_NONE, nullptr, NoCopyFunctions, nullptr, nullptr, GL_NONE, 0, 0, 0, 0, 0, 0, 0, 0, 0, false, false, false, gl::VertexAttribType::InvalidEnum },
{ FormatID::A16_FLOAT, GL_ALPHA16F_EXT, GL_ALPHA16F_EXT, GenerateMip<A16F>, NoCopyFunctions, ReadColor<A16F, GLfloat>, WriteColor<A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0, 0, 2, 1, false, false, false, gl::VertexAttribType::Float }, { FormatID::A16_FLOAT, GL_ALPHA16F_EXT, GL_ALPHA16F_EXT, GenerateMip<A16F>, NoCopyFunctions, ReadColor<A16F, GLfloat>, WriteColor<A16F, GLfloat>, GL_FLOAT, 0, 0, 0, 16, 0, 0, 0, 2, 1, false, false, false, gl::VertexAttribType::Float },
{ FormatID::A1R5G5B5_UNORM, GL_A1RGB5_ANGLEX, GL_A1RGB5_ANGLEX, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, WriteColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0, 0, 2, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::InvalidEnum }, { FormatID::A1R5G5B5_UNORM, GL_A1RGB5_ANGLEX, GL_A1RGB5_ANGLEX, GenerateMip<A1R5G5B5>, NoCopyFunctions, ReadColor<A1R5G5B5, GLfloat>, WriteColor<A1R5G5B5, GLfloat>, GL_UNSIGNED_NORMALIZED, 5, 5, 5, 1, 0, 0, 0, 2, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::InvalidEnum },
{ FormatID::A2R10G10B10_SINT_VERTEX, GL_INT_10_10_10_2_OES, GL_INT_10_10_10_2_OES, nullptr, NoCopyFunctions, nullptr, nullptr, GL_INT, 10, 10, 10, 2, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::Int1010102 },
{ FormatID::A2R10G10B10_SNORM_VERTEX, GL_A2_RGB10_SNORM_ANGLEX, GL_A2_RGB10_SNORM_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_SIGNED_NORMALIZED, 10, 10, 10, 2, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::Int1010102 },
{ FormatID::A2R10G10B10_SSCALED_VERTEX, GL_A2_RGB10_SSCALED_ANGLEX, GL_A2_RGB10_SSCALED_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_INT, 10, 10, 10, 2, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, true, gl::VertexAttribType::Int1010102 },
{ FormatID::A2R10G10B10_UINT_VERTEX, GL_UNSIGNED_INT_10_10_10_2_OES, GL_UNSIGNED_INT_10_10_10_2_OES, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_INT, 10, 10, 10, 2, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::UnsignedInt1010102 },
{ FormatID::A2R10G10B10_UNORM_VERTEX, GL_A2_RGB10_UNORM_ANGLEX, GL_A2_RGB10_UNORM_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 10, 10, 10, 2, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::UnsignedInt1010102 },
{ FormatID::A2R10G10B10_USCALED_VERTEX, GL_A2_RGB10_USCALED_ANGLEX, GL_A2_RGB10_USCALED_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_INT, 10, 10, 10, 2, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, true, gl::VertexAttribType::UnsignedInt1010102 },
{ FormatID::A32_FLOAT, GL_ALPHA32F_EXT, GL_ALPHA32F_EXT, GenerateMip<A32F>, NoCopyFunctions, ReadColor<A32F, GLfloat>, WriteColor<A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0, 0, 4, 3, false, false, false, gl::VertexAttribType::Float }, { FormatID::A32_FLOAT, GL_ALPHA32F_EXT, GL_ALPHA32F_EXT, GenerateMip<A32F>, NoCopyFunctions, ReadColor<A32F, GLfloat>, WriteColor<A32F, GLfloat>, GL_FLOAT, 0, 0, 0, 32, 0, 0, 0, 4, 3, false, false, false, gl::VertexAttribType::Float },
{ FormatID::A8_UNORM, GL_ALPHA8_EXT, GL_ALPHA8_EXT, GenerateMip<A8>, NoCopyFunctions, ReadColor<A8, GLfloat>, WriteColor<A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0, 0, 1, 0, false, false, false, gl::VertexAttribType::InvalidEnum }, { FormatID::A8_UNORM, GL_ALPHA8_EXT, GL_ALPHA8_EXT, GenerateMip<A8>, NoCopyFunctions, ReadColor<A8, GLfloat>, WriteColor<A8, GLfloat>, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 8, 0, 0, 0, 1, 0, false, false, false, gl::VertexAttribType::InvalidEnum },
{ FormatID::ASTC_10x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0, 0, 16, std::numeric_limits<GLuint>::max(), true, false, false, gl::VertexAttribType::InvalidEnum }, { FormatID::ASTC_10x10_SRGB_BLOCK, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 0, 0, 0, 0, 0, 0, 0, 16, std::numeric_limits<GLuint>::max(), true, false, false, gl::VertexAttribType::InvalidEnum },
...@@ -222,6 +228,12 @@ const Format gFormatInfoTable[] = { ...@@ -222,6 +228,12 @@ const Format gFormatInfoTable[] = {
{ FormatID::R8_USCALED, GL_R8_USCALED_ANGLEX, GL_R8_USCALED_ANGLEX, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLuint>, WriteColor<R8, GLuint>, GL_UNSIGNED_INT, 8, 0, 0, 0, 0, 0, 0, 1, 0, false, false, true, gl::VertexAttribType::UnsignedByte }, { FormatID::R8_USCALED, GL_R8_USCALED_ANGLEX, GL_R8_USCALED_ANGLEX, GenerateMip<R8>, NoCopyFunctions, ReadColor<R8, GLuint>, WriteColor<R8, GLuint>, GL_UNSIGNED_INT, 8, 0, 0, 0, 0, 0, 0, 1, 0, false, false, true, gl::VertexAttribType::UnsignedByte },
{ FormatID::R9G9B9E5_SHAREDEXP, GL_RGB9_E5, GL_RGB9_E5, GenerateMip<R9G9B9E5>, NoCopyFunctions, ReadColor<R9G9B9E5, GLfloat>, WriteColor<R9G9B9E5, GLfloat>, GL_FLOAT, 9, 9, 9, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::InvalidEnum }, { FormatID::R9G9B9E5_SHAREDEXP, GL_RGB9_E5, GL_RGB9_E5, GenerateMip<R9G9B9E5>, NoCopyFunctions, ReadColor<R9G9B9E5, GLfloat>, WriteColor<R9G9B9E5, GLfloat>, GL_FLOAT, 9, 9, 9, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::InvalidEnum },
{ FormatID::S8_UINT, GL_STENCIL_INDEX8, GL_STENCIL_INDEX8, nullptr, NoCopyFunctions, ReadDepthStencil<S8>, WriteDepthStencil<S8>, GL_UNSIGNED_INT, 0, 0, 0, 0, 0, 0, 8, 1, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::InvalidEnum }, { FormatID::S8_UINT, GL_STENCIL_INDEX8, GL_STENCIL_INDEX8, nullptr, NoCopyFunctions, ReadDepthStencil<S8>, WriteDepthStencil<S8>, GL_UNSIGNED_INT, 0, 0, 0, 0, 0, 0, 8, 1, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::InvalidEnum },
{ FormatID::X2R10G10B10_SINT_VERTEX, GL_X2_RGB10_SINT_ANGLEX, GL_X2_RGB10_SINT_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_INT, 10, 10, 10, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::Int1010102 },
{ FormatID::X2R10G10B10_SNORM_VERTEX, GL_X2_RGB10_SNORM_ANGLEX, GL_X2_RGB10_SNORM_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_SIGNED_NORMALIZED, 10, 10, 10, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::Int1010102 },
{ FormatID::X2R10G10B10_SSCALED_VERTEX, GL_X2_RGB10_SSCALED_ANGLEX, GL_X2_RGB10_SSCALED_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_INT, 10, 10, 10, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, true, gl::VertexAttribType::Int1010102 },
{ FormatID::X2R10G10B10_UINT_VERTEX, GL_X2_RGB10_UINT_ANGLEX, GL_X2_RGB10_UINT_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_INT, 10, 10, 10, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::UnsignedInt1010102 },
{ FormatID::X2R10G10B10_UNORM_VERTEX, GL_X2_RGB10_UNORM_ANGLEX, GL_X2_RGB10_UNORM_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_NORMALIZED, 10, 10, 10, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, false, gl::VertexAttribType::UnsignedInt1010102 },
{ FormatID::X2R10G10B10_USCALED_VERTEX, GL_X2_RGB10_USCALED_ANGLEX, GL_X2_RGB10_USCALED_ANGLEX, nullptr, NoCopyFunctions, nullptr, nullptr, GL_UNSIGNED_INT, 10, 10, 10, 0, 0, 0, 0, 4, std::numeric_limits<GLuint>::max(), false, false, true, gl::VertexAttribType::UnsignedInt1010102 },
// clang-format on // clang-format on
}; };
...@@ -232,6 +244,14 @@ FormatID Format::InternalFormatToID(GLenum internalFormat) ...@@ -232,6 +244,14 @@ FormatID Format::InternalFormatToID(GLenum internalFormat)
{ {
case GL_A1RGB5_ANGLEX: case GL_A1RGB5_ANGLEX:
return FormatID::A1R5G5B5_UNORM; return FormatID::A1R5G5B5_UNORM;
case GL_A2_RGB10_SNORM_ANGLEX:
return FormatID::A2R10G10B10_SNORM_VERTEX;
case GL_A2_RGB10_SSCALED_ANGLEX:
return FormatID::A2R10G10B10_SSCALED_VERTEX;
case GL_A2_RGB10_UNORM_ANGLEX:
return FormatID::A2R10G10B10_UNORM_VERTEX;
case GL_A2_RGB10_USCALED_ANGLEX:
return FormatID::A2R10G10B10_USCALED_VERTEX;
case GL_ALPHA16F_EXT: case GL_ALPHA16F_EXT:
return FormatID::A16_FLOAT; return FormatID::A16_FLOAT;
case GL_ALPHA32F_EXT: case GL_ALPHA32F_EXT:
...@@ -410,6 +430,8 @@ FormatID Format::InternalFormatToID(GLenum internalFormat) ...@@ -410,6 +430,8 @@ FormatID Format::InternalFormatToID(GLenum internalFormat)
return FormatID::ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK; return FormatID::ETC1_LOSSY_DECODE_R8G8B8_UNORM_BLOCK;
case GL_ETC1_RGB8_OES: case GL_ETC1_RGB8_OES:
return FormatID::ETC1_R8G8B8_UNORM_BLOCK; return FormatID::ETC1_R8G8B8_UNORM_BLOCK;
case GL_INT_10_10_10_2_OES:
return FormatID::A2R10G10B10_SINT_VERTEX;
case GL_LUMINANCE16F_EXT: case GL_LUMINANCE16F_EXT:
return FormatID::L16_FLOAT; return FormatID::L16_FLOAT;
case GL_LUMINANCE32F_EXT: case GL_LUMINANCE32F_EXT:
...@@ -630,6 +652,20 @@ FormatID Format::InternalFormatToID(GLenum internalFormat) ...@@ -630,6 +652,20 @@ FormatID Format::InternalFormatToID(GLenum internalFormat)
return FormatID::R8G8B8A8_UNORM_SRGB; return FormatID::R8G8B8A8_UNORM_SRGB;
case GL_STENCIL_INDEX8: case GL_STENCIL_INDEX8:
return FormatID::S8_UINT; return FormatID::S8_UINT;
case GL_UNSIGNED_INT_10_10_10_2_OES:
return FormatID::A2R10G10B10_UINT_VERTEX;
case GL_X2_RGB10_SINT_ANGLEX:
return FormatID::X2R10G10B10_SINT_VERTEX;
case GL_X2_RGB10_SNORM_ANGLEX:
return FormatID::X2R10G10B10_SNORM_VERTEX;
case GL_X2_RGB10_SSCALED_ANGLEX:
return FormatID::X2R10G10B10_SSCALED_VERTEX;
case GL_X2_RGB10_UINT_ANGLEX:
return FormatID::X2R10G10B10_UINT_VERTEX;
case GL_X2_RGB10_UNORM_ANGLEX:
return FormatID::X2R10G10B10_UNORM_VERTEX;
case GL_X2_RGB10_USCALED_ANGLEX:
return FormatID::X2R10G10B10_USCALED_VERTEX;
default: default:
return FormatID::NONE; return FormatID::NONE;
} }
......
...@@ -135,6 +135,9 @@ def gl_format_channels(internal_format): ...@@ -135,6 +135,9 @@ def gl_format_channels(internal_format):
return 'rgba' return 'rgba'
if internal_format == 'GL_RGB10_UNORM_ANGLEX': if internal_format == 'GL_RGB10_UNORM_ANGLEX':
return 'rgb' return 'rgb'
# signed/unsigned int_10_10_10_2 for vertex format
if internal_format.find('INT_10_10_10_2_OES') == 0:
return 'rgba'
channels_pattern = re.compile('GL_(COMPRESSED_)?(SIGNED_)?(ETC\d_)?([A-Z]+)') channels_pattern = re.compile('GL_(COMPRESSED_)?(SIGNED_)?(ETC\d_)?([A-Z]+)')
match = re.search(channels_pattern, internal_format) match = re.search(channels_pattern, internal_format)
...@@ -243,6 +246,16 @@ def get_vertex_copy_function(src_format, dst_format): ...@@ -243,6 +246,16 @@ def get_vertex_copy_function(src_format, dst_format):
if num_channel < 1 or num_channel > 4: if num_channel < 1 or num_channel > 4:
return "nullptr" return "nullptr"
if src_format.endswith('_VERTEX'):
assert 'FLOAT' in dst_format, (
'get_vertex_copy_function: can only convert to float,' + ' not to ' + dst_format)
is_signed = 'true' if 'SINT' in src_format or 'SNORM' in src_format or 'SSCALED' in src_format else 'false'
is_normal = 'true' if 'NORM' in src_format else 'false'
if 'A2' in src_format:
return 'CopyW2XYZ10ToXYZW32FVertexData<%s, %s>' % (is_signed, is_normal)
else:
return 'CopyXYZ10ToXYZW32FVertexData<%s, %s>' % (is_signed, is_normal)
if 'FIXED' in src_format: if 'FIXED' in src_format:
assert 'FLOAT' in dst_format, ( assert 'FLOAT' in dst_format, (
'get_vertex_copy_function: can only convert fixed to float,' + ' not to ' + dst_format) 'get_vertex_copy_function: can only convert fixed to float,' + ' not to ' + dst_format)
......
...@@ -198,5 +198,17 @@ ...@@ -198,5 +198,17 @@
[ "GL_RG32_FIXED_ANGLEX", "R32G32_FIXED" ], [ "GL_RG32_FIXED_ANGLEX", "R32G32_FIXED" ],
[ "GL_RGB32_FIXED_ANGLEX", "R32G32B32_FIXED" ], [ "GL_RGB32_FIXED_ANGLEX", "R32G32B32_FIXED" ],
[ "GL_RGBA32_FIXED_ANGLEX", "R32G32B32A32_FIXED" ], [ "GL_RGBA32_FIXED_ANGLEX", "R32G32B32A32_FIXED" ],
[ "GL_RGB10_UNORM_ANGLEX", "R10G10B10X2_UNORM" ] [ "GL_RGB10_UNORM_ANGLEX", "R10G10B10X2_UNORM" ],
[ "GL_UNSIGNED_INT_10_10_10_2_OES", "A2R10G10B10_UINT_VERTEX" ],
[ "GL_INT_10_10_10_2_OES", "A2R10G10B10_SINT_VERTEX" ],
[ "GL_A2_RGB10_USCALED_ANGLEX", "A2R10G10B10_USCALED_VERTEX" ],
[ "GL_A2_RGB10_SSCALED_ANGLEX", "A2R10G10B10_SSCALED_VERTEX" ],
[ "GL_A2_RGB10_UNORM_ANGLEX", "A2R10G10B10_UNORM_VERTEX" ],
[ "GL_A2_RGB10_SNORM_ANGLEX", "A2R10G10B10_SNORM_VERTEX" ],
[ "GL_X2_RGB10_UINT_ANGLEX", "X2R10G10B10_UINT_VERTEX" ],
[ "GL_X2_RGB10_SINT_ANGLEX", "X2R10G10B10_SINT_VERTEX" ],
[ "GL_X2_RGB10_USCALED_ANGLEX", "X2R10G10B10_USCALED_VERTEX" ],
[ "GL_X2_RGB10_SSCALED_ANGLEX", "X2R10G10B10_SSCALED_VERTEX" ],
[ "GL_X2_RGB10_UNORM_ANGLEX", "X2R10G10B10_UNORM_VERTEX" ],
[ "GL_X2_RGB10_SNORM_ANGLEX", "X2R10G10B10_SNORM_VERTEX" ]
] ]
...@@ -476,4 +476,68 @@ inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input, ...@@ -476,4 +476,68 @@ inline void CopyXYZ10W2ToXYZW32FVertexData(const uint8_t *input,
} }
} }
template <bool isSigned, bool normalized>
inline void CopyXYZ10ToXYZW32FVertexData(const uint8_t *input,
size_t stride,
size_t count,
uint8_t *output)
{
const size_t outputComponentSize = 4;
const size_t componentCount = 4;
const uint32_t rgbMask = 0x3FF; // 1 set in bits 0 through 9
const size_t redShift = 22; // red is bits 22 through 31
const size_t greenShift = 12; // green is bits 12 through 21
const size_t blueShift = 2; // blue is bits 2 through 11
const uint32_t alphaDefaultValueBits = normalized ? (isSigned ? 0x1 : 0x3) : 0x1;
for (size_t i = 0; i < count; i++)
{
GLuint packedValue = *reinterpret_cast<const GLuint *>(input + (i * stride));
uint8_t *offsetOutput = output + (i * outputComponentSize * componentCount);
priv::CopyPackedRGB<isSigned, normalized, true>((packedValue >> redShift) & rgbMask,
offsetOutput + (0 * outputComponentSize));
priv::CopyPackedRGB<isSigned, normalized, true>((packedValue >> greenShift) & rgbMask,
offsetOutput + (1 * outputComponentSize));
priv::CopyPackedRGB<isSigned, normalized, true>((packedValue >> blueShift) & rgbMask,
offsetOutput + (2 * outputComponentSize));
priv::CopyPackedAlpha<isSigned, normalized, true>(alphaDefaultValueBits,
offsetOutput + (3 * outputComponentSize));
}
}
template <bool isSigned, bool normalized>
inline void CopyW2XYZ10ToXYZW32FVertexData(const uint8_t *input,
size_t stride,
size_t count,
uint8_t *output)
{
const size_t outputComponentSize = 4;
const size_t componentCount = 4;
const uint32_t rgbMask = 0x3FF; // 1 set in bits 0 through 9
const size_t redShift = 22; // red is bits 22 through 31
const size_t greenShift = 12; // green is bits 12 through 21
const size_t blueShift = 2; // blue is bits 2 through 11
const uint32_t alphaMask = 0x3; // 1 set in bits 0 and 1
const size_t alphaShift = 0; // Alpha is the 30 and 31 bits
for (size_t i = 0; i < count; i++)
{
GLuint packedValue = *reinterpret_cast<const GLuint *>(input + (i * stride));
uint8_t *offsetOutput = output + (i * outputComponentSize * componentCount);
priv::CopyPackedRGB<isSigned, normalized, true>((packedValue >> redShift) & rgbMask,
offsetOutput + (0 * outputComponentSize));
priv::CopyPackedRGB<isSigned, normalized, true>((packedValue >> greenShift) & rgbMask,
offsetOutput + (1 * outputComponentSize));
priv::CopyPackedRGB<isSigned, normalized, true>((packedValue >> blueShift) & rgbMask,
offsetOutput + (2 * outputComponentSize));
priv::CopyPackedAlpha<isSigned, normalized, true>((packedValue >> alphaShift) & alphaMask,
offsetOutput + (3 * outputComponentSize));
}
}
} // namespace rx } // namespace rx
...@@ -92,6 +92,11 @@ const Format *GetFormatInfoTable() ...@@ -92,6 +92,11 @@ const Format *GetFormatInfoTable()
""" """
def ceil_int(value, mod):
assert mod > 0 and value > 0, 'integer modulation should be larger than 0'
return (value + mod - 1) / mod
def is_depth_stencil(angle_format): def is_depth_stencil(angle_format):
if not 'channels' in angle_format or not angle_format['channels']: if not 'channels' in angle_format or not angle_format['channels']:
return False return False
...@@ -111,6 +116,9 @@ def get_channel_struct(angle_format): ...@@ -111,6 +116,9 @@ def get_channel_struct(angle_format):
return None return None
if 'BLOCK' in angle_format['id']: if 'BLOCK' in angle_format['id']:
return None return None
if 'VERTEX' in angle_format['id']:
return None
bits = angle_format['bits'] bits = angle_format['bits']
if 'channelStruct' in angle_format: if 'channelStruct' in angle_format:
...@@ -145,7 +153,8 @@ def get_channel_struct(angle_format): ...@@ -145,7 +153,8 @@ def get_channel_struct(angle_format):
def get_mip_generation_function(angle_format): def get_mip_generation_function(angle_format):
channel_struct = get_channel_struct(angle_format) channel_struct = get_channel_struct(angle_format)
if is_depth_stencil(angle_format) or channel_struct == None or "BLOCK" in angle_format["id"]: if is_depth_stencil(angle_format) or channel_struct == None \
or "BLOCK" in angle_format["id"] or "VERTEX" in angle_format["id"]:
return 'nullptr' return 'nullptr'
return 'GenerateMip<' + channel_struct + '>' return 'GenerateMip<' + channel_struct + '>'
...@@ -239,6 +248,7 @@ def get_vertex_attrib_type(format_id): ...@@ -239,6 +248,7 @@ def get_vertex_attrib_type(format_id):
has_r16 = "R16" in format_id has_r16 = "R16" in format_id
has_r32 = "R32" in format_id has_r32 = "R32" in format_id
has_r10 = "R10" in format_id has_r10 = "R10" in format_id
has_vertex = "VERTEX" in format_id
if has_fixed: if has_fixed:
return "Fixed" return "Fixed"
...@@ -250,7 +260,10 @@ def get_vertex_attrib_type(format_id): ...@@ -250,7 +260,10 @@ def get_vertex_attrib_type(format_id):
return "Byte" if has_s else "UnsignedByte" return "Byte" if has_s else "UnsignedByte"
if has_r10: if has_r10:
return "Int2101010" if has_s else "UnsignedInt2101010" if has_vertex:
return "Int1010102" if has_s else "UnsignedInt1010102"
else:
return "Int2101010" if has_s else "UnsignedInt2101010"
if has_r16: if has_r16:
return "Short" if has_s else "UnsignedShort" return "Short" if has_s else "UnsignedShort"
...@@ -317,7 +330,7 @@ def json_to_table_data(format_id, json, angle_to_gl): ...@@ -317,7 +330,7 @@ def json_to_table_data(format_id, json, angle_to_gl):
sum_of_bits = 0 sum_of_bits = 0
for channel in angle_format.kChannels: for channel in angle_format.kChannels:
sum_of_bits += int(parsed[channel]) sum_of_bits += int(parsed[channel])
pixel_bytes = sum_of_bits / 8 pixel_bytes = ceil_int(sum_of_bits, 8)
parsed["pixelBytes"] = pixel_bytes parsed["pixelBytes"] = pixel_bytes
parsed["componentAlignmentMask"] = get_component_alignment_mask(parsed["channels"], parsed["componentAlignmentMask"] = get_component_alignment_mask(parsed["channels"],
parsed["bits"]) parsed["bits"])
......
...@@ -82,7 +82,14 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params) ...@@ -82,7 +82,14 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
bool srcIsA2BGR10 = bool srcIsA2BGR10 =
((params.srcFormat->vertexAttribType == gl::VertexAttribType::UnsignedInt2101010) || ((params.srcFormat->vertexAttribType == gl::VertexAttribType::UnsignedInt2101010) ||
(params.srcFormat->vertexAttribType == gl::VertexAttribType::Int2101010)); (params.srcFormat->vertexAttribType == gl::VertexAttribType::Int2101010));
bool srcIsRGB10A2 =
((params.srcFormat->vertexAttribType == gl::VertexAttribType::UnsignedInt1010102) ||
params.srcFormat->vertexAttribType == gl::VertexAttribType::Int1010102) &&
params.srcFormat->alphaBits;
bool srcIsRGB10X2 =
((params.srcFormat->vertexAttribType == gl::VertexAttribType::UnsignedInt1010102) ||
params.srcFormat->vertexAttribType == gl::VertexAttribType::Int1010102) &&
!params.srcFormat->alphaBits;
bool destIsSint = params.destFormat->isSint(); bool destIsSint = params.destFormat->isSint();
bool destIsUint = params.destFormat->isUint(); bool destIsUint = params.destFormat->isUint();
bool destIsFloat = params.destFormat->isFloat(); bool destIsFloat = params.destFormat->isFloat();
...@@ -134,6 +141,52 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params) ...@@ -134,6 +141,52 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
UNREACHABLE(); UNREACHABLE();
} }
} }
else if (srcIsRGB10A2)
{
if (srcIsSint)
{
flags |= ConvertVertex_comp::kRGB10A2SintToFloat;
}
else if (srcIsUint)
{
flags |= ConvertVertex_comp::kRGB10A2UintToFloat;
}
else if (srcIsSnorm)
{
flags |= ConvertVertex_comp::kRGB10A2SnormToFloat;
}
else if (srcIsUnorm)
{
flags |= ConvertVertex_comp::kRGB10A2UnormToFloat;
}
else
{
UNREACHABLE();
}
}
else if (srcIsRGB10X2)
{
if (srcIsSint)
{
flags |= ConvertVertex_comp::kRGB10X2SintToFloat;
}
else if (srcIsUint)
{
flags |= ConvertVertex_comp::kRGB10X2UintToFloat;
}
else if (srcIsSnorm)
{
flags |= ConvertVertex_comp::kRGB10X2SnormToFloat;
}
else if (srcIsUnorm)
{
flags |= ConvertVertex_comp::kRGB10X2UnormToFloat;
}
else
{
UNREACHABLE();
}
}
else if (srcIsSint && destIsSint) else if (srcIsSint && destIsSint)
{ {
flags |= ConvertVertex_comp::kSintToSint; flags |= ConvertVertex_comp::kSintToSint;
......
...@@ -55,6 +55,18 @@ ...@@ -55,6 +55,18 @@
// * A2BGR10UintToFloat: Same types as A2BGR10UintToUint for source (including uscaled). // * A2BGR10UintToFloat: Same types as A2BGR10UintToUint for source (including uscaled).
// Converts to float. // Converts to float.
// * A2BGR10SnormToFloat: Similar to IntToFloat, but normalized and only for A2BGR10. // * A2BGR10SnormToFloat: Similar to IntToFloat, but normalized and only for A2BGR10.
// * RGB10A2SintToFloat: Same types as RGB10A2SintToSint for source (including scaled).
// Converts to float.
// * RGB10A2UintToFloat: Same types as RGB10A2UintToUint for source (including uscaled).
// Converts to float.
// * RGB10A2SnormToFloat: Similar to IntToFloat, but normalized and only for RGB10A2.
// * RGB10A2UnormToFloat: Similar to UintToFloat, but normalized and only for RGB10A2.
// * RGB10X2SintToFloat: Same types as RGB10X2SintToSint for source (including scaled).
// Converts to float.
// * RGB10X2UintToFloat: Same types as RGB10X2UintToUint for source (including uscaled).
// Converts to float.
// * RGB10X2SnormToFloat: Similar to IntToFloat, but normalized and only for RGB10X2.
// * RGB10X2UnormToFloat: Similar to UintToFloat, but normalized and only for RGB10X2.
// //
// SintToSint, UintToUint and FloatToFloat correspond to CopyNativeVertexData() and // SintToSint, UintToUint and FloatToFloat correspond to CopyNativeVertexData() and
// Copy8SintTo16SintVertexData() in renderer/copyvertex.inc, FixedToFloat corresponds to // Copy8SintTo16SintVertexData() in renderer/copyvertex.inc, FixedToFloat corresponds to
...@@ -62,16 +74,22 @@ ...@@ -62,16 +74,22 @@
// normalized=false and SnormToFloat and UnormToFloat correspond to CopyTo32FVertexData with // normalized=false and SnormToFloat and UnormToFloat correspond to CopyTo32FVertexData with
// normalized=true. A2BGR10SintToSint, A2BGR10UintToUint, A2BGR10SintToFloat, A2BGR10UintToFloat // normalized=true. A2BGR10SintToSint, A2BGR10UintToUint, A2BGR10SintToFloat, A2BGR10UintToFloat
// and A2BGR10SnormToFloat correspond to CopyXYZ10W2ToXYZW32FVertexData with the proper options. // and A2BGR10SnormToFloat correspond to CopyXYZ10W2ToXYZW32FVertexData with the proper options.
// // RGB10A2SintToFloat, RGB10A2UintToFloat, RGB10A2SnormToFloat, and RGB10X2UnormToFloat correspond
// to CopyW2XYZ10ToXYZW32FVertexData, and RGB10X2SintToFloat, RGB10UintToFloat,
// RGB10X2SnormToFloat, and RGB10X2UnormToFloat correspond to CopyXYZ10ToXYZW32FVertexData with
// the proper options.
#version 450 core #version 450 core
// Source type // Source type
#if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat #if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat || RGB10A2SintToFloat || \
RGB10X2SintToFloat
#define SrcType int #define SrcType int
#elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat #elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat || \
RGB10A2UintToFloat || RGB10X2UintToFloat
#define SrcType uint #define SrcType uint
#elif SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat || A2BGR10SnormToFloat #elif SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat || A2BGR10SnormToFloat || \
RGB10A2SnormToFloat || RGB10A2UnormToFloat || RGB10X2SnormToFloat || RGB10X2UnormToFloat
#define SrcType float #define SrcType float
#else #else
#error "Not all conversions are accounted for" #error "Not all conversions are accounted for"
...@@ -85,7 +103,9 @@ ...@@ -85,7 +103,9 @@
#define DestType uint #define DestType uint
#define IsDestFloat 0 #define IsDestFloat 0
#elif SintToFloat || UintToFloat || SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat || \ #elif SintToFloat || UintToFloat || SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat || \
A2BGR10SintToFloat || A2BGR10UintToFloat || A2BGR10SnormToFloat A2BGR10SintToFloat || A2BGR10UintToFloat || A2BGR10SnormToFloat || \
RGB10A2SintToFloat || RGB10A2UintToFloat || RGB10A2SnormToFloat || RGB10A2UnormToFloat || \
RGB10X2SintToFloat || RGB10X2UintToFloat || RGB10X2SnormToFloat || RGB10X2UnormToFloat
#define DestType float #define DestType float
#define IsDestFloat 1 #define IsDestFloat 1
#else #else
...@@ -202,11 +222,14 @@ SrcType loadSourceComponent(uint cd) ...@@ -202,11 +222,14 @@ SrcType loadSourceComponent(uint cd)
uint vertex = cd / Nd; uint vertex = cd / Nd;
uint component = cd % Nd; uint component = cd % Nd;
// If no such component, return 0 // Fill the alpha channel with 1.0f in case of the source format doesn't have an alpha channel
// For all other components fill in 0
#if !(RGB10X2SintToFloat || RGB10X2UintToFloat || RGB10X2SnormToFloat || RGB10X2UnormToFloat)
if (component >= Ns) if (component >= Ns)
{ {
return 0; return 0;
} }
#endif
// Load the source component // Load the source component
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
...@@ -217,15 +240,30 @@ SrcType loadSourceComponent(uint cd) ...@@ -217,15 +240,30 @@ SrcType loadSourceComponent(uint cd)
uint valueBits = component == 3 ? 2 : 10; uint valueBits = component == 3 ? 2 : 10;
uint shiftBits = 10 * component; uint shiftBits = 10 * component;
uint valueMask = component == 3 ? 0x03 : 0x3FF; uint valueMask = component == 3 ? 0x03 : 0x3FF;
#elif RGB10A2SintToFloat || RGB10A2UintToFloat || RGB10A2SnormToFloat || RGB10A2UnormToFloat || \
RGB10X2SintToFloat || RGB10X2UintToFloat || RGB10X2SnormToFloat || RGB10X2UnormToFloat
uint valueBits = component == 3 ? 2 : 10;
// channel order is reversed
uint shiftBits = component == 3 ? 0 : (valueBits * (2 - component) + 2);
uint valueMask = component == 3 ? 0x03 : 0x3FF;
#else #else
uint shiftBits = getShiftBits(offset, Bs); uint shiftBits = getShiftBits(offset, Bs);
uint valueBits = Bs * 8; uint valueBits = Bs * 8;
uint valueMask = valueBits == 32 ? -1 : (1 << valueBits) - 1; uint valueMask = valueBits == 32 ? -1 : (1 << valueBits) - 1;
#endif #endif
// When alpha channel is dummy, fill it with 1.0f
#if RGB10X2SintToFloat || RGB10X2UintToFloat || RGB10X2SnormToFloat
uint valueAsUint = component == 3 ? 0x01 : (block >> shiftBits) & valueMask;
#elif RGB10X2UnormToFloat
uint valueAsUint = component == 3 ? 0x03 : (block >> shiftBits) & valueMask;
#else
uint valueAsUint = (block >> shiftBits) & valueMask; uint valueAsUint = (block >> shiftBits) & valueMask;
#endif
// Convert to SrcType // Convert to SrcType
#if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat #if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat || RGB10A2SintToFloat \
|| RGB10X2SintToFloat
if (valueBits < 32) if (valueBits < 32)
{ {
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0; bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
...@@ -236,9 +274,10 @@ SrcType loadSourceComponent(uint cd) ...@@ -236,9 +274,10 @@ SrcType loadSourceComponent(uint cd)
valueAsUint |= signExtension; valueAsUint |= signExtension;
} }
SrcType value = SrcType(valueAsUint); SrcType value = SrcType(valueAsUint);
#elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat #elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat || RGB10A2UintToFloat \
|| RGB10X2UintToFloat
SrcType value = valueAsUint; SrcType value = valueAsUint;
#elif SnormToFloat || A2BGR10SnormToFloat #elif SnormToFloat || A2BGR10SnormToFloat || RGB10A2SnormToFloat || RGB10X2SnormToFloat
if (valueBits < 32) if (valueBits < 32)
{ {
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0; bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
...@@ -247,7 +286,7 @@ SrcType loadSourceComponent(uint cd) ...@@ -247,7 +286,7 @@ SrcType loadSourceComponent(uint cd)
} }
int valueAsInt = int(valueAsUint); int valueAsInt = int(valueAsUint);
SrcType value = (2 * float(valueAsInt) + 1) / valueMask; SrcType value = (2 * float(valueAsInt) + 1) / valueMask;
#elif UnormToFloat #elif UnormToFloat || RGB10A2UnormToFloat || RGB10X2UnormToFloat
float positiveMax = valueMask; float positiveMax = valueMask;
// Scale [0, P] to [0, 1] // Scale [0, P] to [0, 1]
SrcType value = valueAsUint / positiveMax; SrcType value = valueAsUint / positiveMax;
......
...@@ -22,7 +22,15 @@ ...@@ -22,7 +22,15 @@
"A2BGR10UintToUint", "A2BGR10UintToUint",
"A2BGR10SintToFloat", "A2BGR10SintToFloat",
"A2BGR10UintToFloat", "A2BGR10UintToFloat",
"A2BGR10SnormToFloat" "A2BGR10SnormToFloat",
"RGB10A2SintToFloat",
"RGB10A2UintToFloat",
"RGB10A2SnormToFloat",
"RGB10A2UnormToFloat",
"RGB10X2SintToFloat",
"RGB10X2UintToFloat",
"RGB10X2SnormToFloat",
"RGB10X2UnormToFloat"
] ]
} }
...@@ -93,6 +93,8 @@ void RendererVk::ensureCapsInitialized() const ...@@ -93,6 +93,8 @@ void RendererVk::ensureCapsInitialized() const
mNativeExtensions.eglSync = true; mNativeExtensions.eglSync = true;
mNativeExtensions.vertexAttribType101010102 = true;
// We use secondary command buffers almost everywhere and they require a feature to be // We use secondary command buffers almost everywhere and they require a feature to be
// able to execute in the presence of queries. As a result, we won't support queries // able to execute in the presence of queries. As a result, we won't support queries
// unless that feature is available. // unless that feature is available.
......
...@@ -284,6 +284,54 @@ ...@@ -284,6 +284,54 @@
"R10G10B10X2_UNORM": { "R10G10B10X2_UNORM": {
"buffer": "NONE", "buffer": "NONE",
"image": "R10G10B10A2_UNORM" "image": "R10G10B10A2_UNORM"
},
"A2R10G10B10_SINT_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"A2R10G10B10_UINT_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"A2R10G10B10_SSCALED_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"A2R10G10B10_USCALED_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"A2R10G10B10_SNORM_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"A2R10G10B10_UNORM_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"X2R10G10B10_SINT_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"X2R10G10B10_USCALED_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"X2R10G10B10_SSCALED_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"X2R10G10B10_UINT_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"X2R10G10B10_SNORM_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
},
"X2R10G10B10_UNORM_VERTEX": {
"image": "NONE",
"buffer": "R32G32B32A32_FLOAT"
} }
}, },
"fallbacks": { "fallbacks": {
......
...@@ -46,6 +46,78 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat) ...@@ -46,6 +46,78 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
vertexLoadRequiresConversion = false; vertexLoadRequiresConversion = false;
break; break;
case angle::FormatID::A2R10G10B10_SINT_VERTEX:
internalFormat = GL_INT_10_10_10_2_OES;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyW2XYZ10ToXYZW32FVertexData<true, false>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::A2R10G10B10_SNORM_VERTEX:
internalFormat = GL_A2_RGB10_SNORM_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyW2XYZ10ToXYZW32FVertexData<true, true>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::A2R10G10B10_SSCALED_VERTEX:
internalFormat = GL_A2_RGB10_SSCALED_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyW2XYZ10ToXYZW32FVertexData<true, false>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::A2R10G10B10_UINT_VERTEX:
internalFormat = GL_UNSIGNED_INT_10_10_10_2_OES;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyW2XYZ10ToXYZW32FVertexData<false, false>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::A2R10G10B10_UNORM_VERTEX:
internalFormat = GL_A2_RGB10_UNORM_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyW2XYZ10ToXYZW32FVertexData<false, true>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::A2R10G10B10_USCALED_VERTEX:
internalFormat = GL_A2_RGB10_USCALED_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyW2XYZ10ToXYZW32FVertexData<false, false>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::A32_FLOAT: case angle::FormatID::A32_FLOAT:
internalFormat = GL_ALPHA32F_EXT; internalFormat = GL_ALPHA32F_EXT;
imageFormatID = angle::FormatID::R32_FLOAT; imageFormatID = angle::FormatID::R32_FLOAT;
...@@ -2355,6 +2427,78 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat) ...@@ -2355,6 +2427,78 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
vertexLoadRequiresConversion = false; vertexLoadRequiresConversion = false;
break; break;
case angle::FormatID::X2R10G10B10_SINT_VERTEX:
internalFormat = GL_X2_RGB10_SINT_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyXYZ10ToXYZW32FVertexData<true, false>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::X2R10G10B10_SNORM_VERTEX:
internalFormat = GL_X2_RGB10_SNORM_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyXYZ10ToXYZW32FVertexData<true, true>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::X2R10G10B10_SSCALED_VERTEX:
internalFormat = GL_X2_RGB10_SSCALED_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyXYZ10ToXYZW32FVertexData<true, false>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::X2R10G10B10_UINT_VERTEX:
internalFormat = GL_X2_RGB10_UINT_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyXYZ10ToXYZW32FVertexData<false, false>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::X2R10G10B10_UNORM_VERTEX:
internalFormat = GL_X2_RGB10_UNORM_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyXYZ10ToXYZW32FVertexData<false, true>;
vertexLoadRequiresConversion = true;
break;
case angle::FormatID::X2R10G10B10_USCALED_VERTEX:
internalFormat = GL_X2_RGB10_USCALED_ANGLEX;
imageFormatID = angle::FormatID::NONE;
vkImageFormat = VK_FORMAT_UNDEFINED;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R32G32B32A32_FLOAT;
vkBufferFormat = VK_FORMAT_R32G32B32A32_SFLOAT;
vkBufferFormatIsPacked = false;
vertexLoadFunction = CopyXYZ10ToXYZW32FVertexData<false, false>;
vertexLoadRequiresConversion = true;
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
......
...@@ -84,6 +84,22 @@ namespace ...@@ -84,6 +84,22 @@ namespace
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000017.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000017.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000018.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000018.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001A.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001B.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001C.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000020.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000021.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000022.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000023.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000024.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000025.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000026.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000027.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000028.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000029.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc" #include "libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc"
...@@ -220,6 +236,22 @@ constexpr ShaderBlob kConvertVertex_comp_shaders[] = { ...@@ -220,6 +236,22 @@ constexpr ShaderBlob kConvertVertex_comp_shaders[] = {
{kConvertVertex_comp_00000017, sizeof(kConvertVertex_comp_00000017)}, {kConvertVertex_comp_00000017, sizeof(kConvertVertex_comp_00000017)},
{kConvertVertex_comp_00000018, sizeof(kConvertVertex_comp_00000018)}, {kConvertVertex_comp_00000018, sizeof(kConvertVertex_comp_00000018)},
{kConvertVertex_comp_00000019, sizeof(kConvertVertex_comp_00000019)}, {kConvertVertex_comp_00000019, sizeof(kConvertVertex_comp_00000019)},
{kConvertVertex_comp_0000001A, sizeof(kConvertVertex_comp_0000001A)},
{kConvertVertex_comp_0000001B, sizeof(kConvertVertex_comp_0000001B)},
{kConvertVertex_comp_0000001C, sizeof(kConvertVertex_comp_0000001C)},
{kConvertVertex_comp_0000001D, sizeof(kConvertVertex_comp_0000001D)},
{kConvertVertex_comp_0000001E, sizeof(kConvertVertex_comp_0000001E)},
{kConvertVertex_comp_0000001F, sizeof(kConvertVertex_comp_0000001F)},
{kConvertVertex_comp_00000020, sizeof(kConvertVertex_comp_00000020)},
{kConvertVertex_comp_00000021, sizeof(kConvertVertex_comp_00000021)},
{kConvertVertex_comp_00000022, sizeof(kConvertVertex_comp_00000022)},
{kConvertVertex_comp_00000023, sizeof(kConvertVertex_comp_00000023)},
{kConvertVertex_comp_00000024, sizeof(kConvertVertex_comp_00000024)},
{kConvertVertex_comp_00000025, sizeof(kConvertVertex_comp_00000025)},
{kConvertVertex_comp_00000026, sizeof(kConvertVertex_comp_00000026)},
{kConvertVertex_comp_00000027, sizeof(kConvertVertex_comp_00000027)},
{kConvertVertex_comp_00000028, sizeof(kConvertVertex_comp_00000028)},
{kConvertVertex_comp_00000029, sizeof(kConvertVertex_comp_00000029)},
}; };
constexpr ShaderBlob kFullScreenQuad_vert_shaders[] = { constexpr ShaderBlob kFullScreenQuad_vert_shaders[] = {
{kFullScreenQuad_vert_00000000, sizeof(kFullScreenQuad_vert_00000000)}, {kFullScreenQuad_vert_00000000, sizeof(kFullScreenQuad_vert_00000000)},
......
...@@ -77,6 +77,22 @@ angle_vulkan_internal_shaders = [ ...@@ -77,6 +77,22 @@ angle_vulkan_internal_shaders = [
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000017.inc", "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000017.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000018.inc", "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000018.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc", "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001A.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001B.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001C.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001D.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001E.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000001F.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000020.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000021.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000022.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000023.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000024.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000025.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000026.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000027.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000028.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000029.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc", "src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc", "src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc", "src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc",
......
...@@ -98,8 +98,16 @@ enum Conversion ...@@ -98,8 +98,16 @@ enum Conversion
kA2BGR10SintToFloat = 0x00000014, kA2BGR10SintToFloat = 0x00000014,
kA2BGR10UintToFloat = 0x00000016, kA2BGR10UintToFloat = 0x00000016,
kA2BGR10SnormToFloat = 0x00000018, kA2BGR10SnormToFloat = 0x00000018,
}; kRGB10A2SintToFloat = 0x0000001A,
constexpr size_t kArrayLen = 0x0000001A; kRGB10A2UintToFloat = 0x0000001C,
kRGB10A2SnormToFloat = 0x0000001E,
kRGB10A2UnormToFloat = 0x00000020,
kRGB10X2SintToFloat = 0x00000022,
kRGB10X2UintToFloat = 0x00000024,
kRGB10X2SnormToFloat = 0x00000026,
kRGB10X2UnormToFloat = 0x00000028,
};
constexpr size_t kArrayLen = 0x0000002A;
} // namespace ConvertVertex_comp } // namespace ConvertVertex_comp
namespace FullScreenQuad_vert namespace FullScreenQuad_vert
......
...@@ -547,6 +547,14 @@ ANGLE_INLINE bool ValidateVertexFormat(Context *context, ...@@ -547,6 +547,14 @@ ANGLE_INLINE bool ValidateVertexFormat(Context *context,
return false; return false;
} }
break; break;
case VertexAttribTypeCase::ValidSize3or4:
if (size != 3 && size != 4)
{
context->validationError(GL_INVALID_OPERATION,
err::kInvalidVertexAttribSize1010102);
return false;
}
break;
} }
return true; return true;
......
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