Commit 765ee7b7 by James Dong Committed by Commit Bot

Vulkan: support for new vertex attribs in GLES 3.0

Fixes handling of packed vertex formats, adds new overrides for 32-bit [SU](NORM|SCALED) vertex types, and handles half-precision floats correctly. Pixel 2 does not natively support certain 10-10-10-2 vertex formats; this change does not add support for them. Test: ./angle_deqp_gles3_no_gtest --deqp-egl-display-type=angle-vulkan -n 'dEQP-GLES3.functional.vertex_arrays.*' Test: ./angle_end2end_tests --gtest_filter='AttributeLayout*/ES3_Vulkan' Test: ./angle_end2end_tests --gtest_filter='VertexAttribute*/ES3_Vulkan' Bug: angleproject:3193 Change-Id: I5ae4edd743e86e3e89e2697034c04dc4d9ecd1f9 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1668230Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Commit-Queue: James Dong <dongja@google.com>
parent 86a28b3d
......@@ -4,7 +4,7 @@
"src/libANGLE/renderer/Format_table_autogen.cpp":
"d696378917e290bc41487a7e2311d555",
"src/libANGLE/renderer/angle_format.py":
"7ce0869650454e1eebc93658d4d96844",
"ad11fef24bece29edfa62bcd2edff788",
"src/libANGLE/renderer/angle_format_data.json":
"e39704d451d108335e737c39ad423113",
"src/libANGLE/renderer/angle_format_map.json":
......
{
"src/libANGLE/renderer/angle_format.py":
"7ce0869650454e1eebc93658d4d96844",
"ad11fef24bece29edfa62bcd2edff788",
"src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py":
"bf11e3404d4622059b6e9c4e96abf95e",
"src/libANGLE/renderer/d3d/d3d11/texture_format_data.json":
......
{
"src/libANGLE/renderer/angle_format.py":
"7ce0869650454e1eebc93658d4d96844",
"ad11fef24bece29edfa62bcd2edff788",
"src/libANGLE/renderer/angle_format_map.json":
"947fe0a2c3ca1a819a68b4a94bfcf614",
"src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json":
......
......@@ -2,7 +2,7 @@
"scripts/gl.xml":
"b470cb06b06cbbe7adb2c8129ec85708",
"src/libANGLE/renderer/angle_format.py":
"7ce0869650454e1eebc93658d4d96844",
"ad11fef24bece29edfa62bcd2edff788",
"src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp":
"96d06b3acf7826aee1ec813a8fa3a867",
"src/libANGLE/renderer/gl/DispatchTableGL_autogen.h":
......
{
"src/libANGLE/renderer/angle_format.py":
"7ce0869650454e1eebc93658d4d96844",
"ad11fef24bece29edfa62bcd2edff788",
"src/libANGLE/renderer/angle_format_map.json":
"947fe0a2c3ca1a819a68b4a94bfcf614",
"src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
"09340e3ba114b4acef6460ac8b242040",
"63e0efcbe3802518058186cdbfba730e",
"src/libANGLE/renderer/vulkan/vk_format_map.json":
"9e0a57bee62f7b0603c7431c815d1be2",
"b15efb8e2ff455767eb5be0590cc340c",
"src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
"90a43248b071bf880aaa43a0142eac1b"
"3d9440ef4e00925920f2c3b92e744851"
}
\ No newline at end of file
......@@ -86,25 +86,25 @@
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000001.inc":
"4726c9620a56bee224983d28d979fd39",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc":
"d4e48d64aa66fcf3c09330c4234ba349",
"f2733c47c6fdc76c1919d1d56b6bb53d",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc":
"1f2edac6d7a8c2ed5547052808245309",
"effda9890acbcf7df4ad507ba795a5e5",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc":
"429b44e5774de85b72657c26cc12bec0",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc":
"fdc329bbdfcf861ef64514e996b9381b",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc":
"e0c8a2fe5d0087dbacb2bbc7457c1789",
"4ac968daab1481e5df501f8098cb9d0c",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc":
"2ad61027b563e8d4eb9ac8d7139a1cd3",
"1b19cf0bd3fef9f0301c0a5e5c887a74",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc":
"b2037ea0fc1651b4dff779df41701b1e",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc":
"ea0041ce244d44f87f97ba7c671be723",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc":
"6bfcbd2e838d0d746954de8bb8557073",
"40d55a877eed28d96ef92f42fe4590d7",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc":
"7b439c9d771db466e67b5f2f6d53b9e7",
"600b5e4c4659b1e52cedb4b52e9fc6c0",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc":
"60addec54cd45b611afb6fb3477aa985",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc":
......@@ -212,7 +212,7 @@
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp":
"ca35df77d258baa0636529d1f0f446a9",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp":
"e1a64b49ac57bf7aa48913f818d6a522",
"8345816b9cce00c699d8d70adfbcef95",
"src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
"805ec8b2f87d4bd4242dc5b1c58ba3b4",
"src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag":
......
{
"src/libANGLE/renderer/angle_format.py":
"7ce0869650454e1eebc93658d4d96844",
"ad11fef24bece29edfa62bcd2edff788",
"src/libANGLE/renderer/vulkan/gen_vk_mandatory_format_support_table.py":
"dab4614bbee0c3fbc5b3ccaaa11ba9d3",
"src/libANGLE/renderer/vulkan/vk_mandatory_format_support_data.json":
......
......@@ -202,25 +202,17 @@ def get_internal_format_initializer(internal_format, format_id):
internal_format)
def get_vertex_copy_function(src_format, dst_format):
if dst_format == "NONE":
return "nullptr"
num_channel = len(get_channel_tokens(src_format))
if num_channel < 1 or num_channel > 4:
return "nullptr"
if 'FIXED' in src_format:
assert 'FLOAT' in dst_format, (
'get_vertex_copy_function: can only convert fixed to float,' + ' not to ' + dst_format)
return 'Copy32FixedTo32FVertexData<%d, %d>' % (num_channel, num_channel)
def get_format_gl_type(format):
sign = ''
base_type = None
if 'FLOAT' in src_format:
if 'FLOAT' in format:
bits = get_bits(format)
redbits = bits and bits.get('R')
base_type = 'float'
if redbits == 16:
base_type = 'half'
else:
bits = get_bits(src_format)
bits = get_bits(format)
redbits = bits and bits.get('R')
if redbits == 8:
base_type = 'byte'
......@@ -229,18 +221,41 @@ def get_vertex_copy_function(src_format, dst_format):
elif redbits == 32:
base_type = 'int'
if 'UINT' in src_format or 'UNORM' in src_format or 'USCALED' in src_format:
if 'UINT' in format or 'UNORM' in format or 'USCALED' in format:
sign = 'u'
if base_type is None:
return None
return 'GL' + sign + base_type
def get_vertex_copy_function(src_format, dst_format):
if dst_format == "NONE":
return "nullptr"
num_channel = len(get_channel_tokens(src_format))
if num_channel < 1 or num_channel > 4:
return "nullptr"
gl_type = 'GL' + sign + base_type
if 'FIXED' in src_format:
assert 'FLOAT' in dst_format, (
'get_vertex_copy_function: can only convert fixed to float,' + ' not to ' + dst_format)
return 'Copy32FixedTo32FVertexData<%d, %d>' % (num_channel, num_channel)
if src_format == dst_format:
return 'CopyNativeVertexData<%s, %d, %d, 0>' % (gl_type, num_channel, num_channel)
src_gl_type = get_format_gl_type(src_format)
dst_gl_type = get_format_gl_type(dst_format)
if src_gl_type == None:
return "nullptr"
if src_gl_type == dst_gl_type:
dst_num_channel = len(get_channel_tokens(dst_format))
return 'CopyNativeVertexData<%s, %d, %d, 0>' % (src_gl_type, num_channel, dst_num_channel)
assert 'FLOAT' in dst_format, (
'get_vertex_copy_function: can only convert to float,' + ' not to ' + dst_format)
normalized = 'true' if 'NORM' in src_format else 'false'
return "CopyTo32FVertexData<%s, %d, %d, %s>" % (gl_type, num_channel, num_channel, normalized)
return "CopyTo32FVertexData<%s, %d, %d, %s>" % (src_gl_type, num_channel, num_channel,
normalized)
......@@ -115,6 +115,22 @@ def verify_vk_map_keys(angle_to_gl, vk_json_data):
return no_error
def get_vertex_copy_function(src_format, dst_format, vk_format):
if "_PACK" in vk_format:
pack_bits = int(re.search(r'_PACK(\d+)', vk_format).group(1))
base_type = None
if pack_bits == 8:
base_type = 'byte'
elif pack_bits == 16:
base_type = 'short'
elif pack_bits == 32:
base_type = 'int'
else:
return 'nullptr'
return 'CopyNativeVertexData<GLu%s, 1, 1, 0>' % base_type
return angle_format.get_vertex_copy_function(src_format, dst_format)
def gen_format_case(angle, internal_format, vk_json_data):
vk_map = vk_json_data["map"]
vk_overrides = vk_json_data["overrides"]
......@@ -143,11 +159,12 @@ def gen_format_case(angle, internal_format, vk_json_data):
internal_format, format))
def buffer_args(format):
vk_buffer_format = vk_map[format]
return dict(
buffer="angle::FormatID::" + format,
vk_buffer_format=vk_map[format],
vk_buffer_format_is_packed=is_packed(vk_map[format]),
vertex_load_function=angle_format.get_vertex_copy_function(angle, format),
vk_buffer_format=vk_buffer_format,
vk_buffer_format_is_packed=is_packed(vk_buffer_format),
vertex_load_function=get_vertex_copy_function(angle, format, vk_buffer_format),
vertex_load_converts='false' if angle == format else 'true',
)
......
......@@ -207,14 +207,26 @@ SrcType loadSourceComponent(uint cd)
// Convert to SrcType
#if SintToSint || SintToFloat
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
// Sign extend
SrcType value = SrcType(valueAsUint | (isNegative ? 0xFFFFFFFF << valueBits : 0));
if (valueBits < 32)
{
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
// Sign extend
// Note: if valueBits == 32, then 0xFFFFFFFF << valueBits is undefined,
// causing sign extension of value below to produce incorrect values.
uint signExtension = isNegative ? 0xFFFFFFFF << valueBits : 0;
valueAsUint |= signExtension;
}
SrcType value = SrcType(valueAsUint);
#elif UintToUint || UintToFloat
SrcType value = valueAsUint;
#elif SnormToFloat
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
int valueAsInt = int(valueAsUint | (isNegative ? 0xFFFFFFFF << valueBits : 0));
if (valueBits < 32)
{
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
uint signExtension = isNegative ? 0xFFFFFFFF << valueBits : 0;
valueAsUint |= signExtension;
}
int valueAsInt = int(valueAsUint);
SrcType value = (2 * float(valueAsInt) + 1) / valueMask;
#elif UnormToFloat
float positiveMax = valueMask;
......
......@@ -220,6 +220,54 @@
},
"R32G32B32A32_FIXED": {
"buffer": "R32G32B32A32_FLOAT"
},
"R32_UNORM": {
"buffer": "R32_FLOAT"
},
"R32G32_UNORM": {
"buffer": "R32G32_FLOAT"
},
"R32G32B32_UNORM": {
"buffer": "R32G32B32_FLOAT"
},
"R32G32B32A32_UNORM": {
"buffer": "R32G32B32A32_FLOAT"
},
"R32_SNORM": {
"buffer": "R32_FLOAT"
},
"R32G32_SNORM": {
"buffer": "R32G32_FLOAT"
},
"R32G32B32_SNORM": {
"buffer": "R32G32B32_FLOAT"
},
"R32G32B32A32_SNORM": {
"buffer": "R32G32B32A32_FLOAT"
},
"R32_USCALED": {
"buffer": "R32_FLOAT"
},
"R32G32_USCALED": {
"buffer": "R32G32_FLOAT"
},
"R32G32B32_USCALED": {
"buffer": "R32G32B32_FLOAT"
},
"R32G32B32A32_USCALED": {
"buffer": "R32G32B32A32_FLOAT"
},
"R32_SSCALED": {
"buffer": "R32_FLOAT"
},
"R32G32_SSCALED": {
"buffer": "R32G32_FLOAT"
},
"R32G32B32_SSCALED": {
"buffer": "R32G32B32_FLOAT"
},
"R32G32B32A32_SSCALED": {
"buffer": "R32G32B32A32_FLOAT"
}
},
"fallbacks": {
......@@ -341,19 +389,24 @@
"image": "R32G32B32A32_SINT"
},
"R16G16B16_UINT": {
"image": "R16G16B16A16_UINT"
"image": "R16G16B16A16_UINT",
"buffer": "R16G16B16A16_UINT"
},
"R16G16B16_SINT": {
"image": "R16G16B16A16_SINT"
"image": "R16G16B16A16_SINT",
"buffer": "R16G16B16A16_SINT"
},
"R8G8B8_UINT": {
"image": "R8G8B8A8_UINT"
"image": "R8G8B8A8_UINT",
"buffer": "R8G8B8A8_UINT"
},
"R8G8B8_SINT": {
"image": "R8G8B8A8_SINT"
"image": "R8G8B8A8_SINT",
"buffer": "R8G8B8A8_SINT"
},
"R16G16B16_FLOAT": {
"image": "R16G16B16A16_FLOAT"
"image": "R16G16B16A16_FLOAT",
"buffer": "R16G16B16A16_FLOAT"
},
"R32G32B32_FLOAT": {
"image": "R32G32B32A32_FLOAT"
......
......@@ -642,13 +642,9 @@
3443 VULKAN : dEQP-GLES3.functional.ubo.random.nested_structs_instance_arrays.18 = FAIL
3443 VULKAN : dEQP-GLES3.functional.ubo.random.nested_structs_instance_arrays.24 = FAIL
// New vertex attribute formats:
3193 VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.*.int2_10_10_10.* = SKIP
3193 VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.*.unsigned_int.components* = SKIP
3193 VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.*.int.components* = SKIP
3193 VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.*.half.components* = SKIP
3193 VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.*.usigned_int2_10_10_10.components* = SKIP
3193 VULKAN : dEQP-GLES3.functional.vertex_array_objects.all_attributes = SKIP
// vertex_type_2_10_10_10_rev:
3193 VULKAN PIXEL2 : dEQP-GLES3.functional.vertex_arrays.single_attribute.*.int2_10_10_10.* = SKIP
3193 VULKAN PIXEL2 : dEQP-GLES3.functional.vertex_arrays.single_attribute.*.usigned_int2_10_10_10.* = SKIP
3221 VULKAN : dEQP-GLES3.functional.instanced.* = SKIP
......@@ -712,10 +708,6 @@
2830 ANDROID VULKAN : dEQP-GLES3.functional.rasterization.fbo.texture_2d.primitives.lines = FAIL
2830 ANDROID VULKAN : dEQP-GLES3.functional.rasterization.primitives.line* = FAIL
2808 ANDROID VULKAN : dEQP-GLES3.functional.shaders.builtin_variable.fragcoord_w = FAIL
3193 ANDROID VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.output_types.byte.components* = FAIL
3193 ANDROID VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.output_types.unsigned_byte.components* = FAIL
3193 ANDROID VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.output_types.short.components* = FAIL
3193 ANDROID VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.output_types.unsigned_short.components* = FAIL
3544 ANDROID VULKAN : dEQP-GLES3.functional.buffer.copy.basic.* = SKIP
3544 ANDROID VULKAN : dEQP-GLES3.functional.buffer.copy.subrange.* = SKIP
......
......@@ -463,7 +463,7 @@ TEST_P(AttributeLayoutBufferIndexed, Test)
#define PARAMS \
ES2_VULKAN(), ES2_OPENGL(), ES2_D3D9(), ES2_D3D11(), ES3_OPENGL(), ES2_OPENGLES(), \
ES3_OPENGLES()
ES3_OPENGLES(), ES3_VULKAN()
ANGLE_INSTANTIATE_TEST(AttributeLayoutNonIndexed, PARAMS);
ANGLE_INSTANTIATE_TEST(AttributeLayoutMemoryIndexed, PARAMS);
......
......@@ -195,7 +195,11 @@ TEST_P(BuiltinVariableVertexIdTest, Triangles)
runTest(GL_TRIANGLES, indices, 6);
}
ANGLE_INSTANTIATE_TEST(BuiltinVariableVertexIdTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
ANGLE_INSTANTIATE_TEST(BuiltinVariableVertexIdTest,
ES3_D3D11(),
ES3_OPENGL(),
ES3_OPENGLES(),
ES3_VULKAN());
class BuiltinVariableFragDepthClampingFloatRBOTest : public ANGLETest
{
......
......@@ -558,10 +558,6 @@ class VertexAttributeTestES3 : public VertexAttributeTest
TEST_P(VertexAttributeTestES3, IntUnnormalized)
{
// Conversion of int data isn't supported yet.
// anglebug.com/3193
ANGLE_SKIP_TEST_IF(IsVulkan());
GLint lo = std::numeric_limits<GLint>::min();
GLint hi = std::numeric_limits<GLint>::max();
std::array<GLint, kVertexCount> inputData = {
......@@ -578,10 +574,6 @@ TEST_P(VertexAttributeTestES3, IntUnnormalized)
TEST_P(VertexAttributeTestES3, IntNormalized)
{
// Conversion of int data isn't supported yet.
// anglebug.com/3193
ANGLE_SKIP_TEST_IF(IsVulkan());
GLint lo = std::numeric_limits<GLint>::min();
GLint hi = std::numeric_limits<GLint>::max();
std::array<GLint, kVertexCount> inputData = {
......@@ -598,10 +590,6 @@ TEST_P(VertexAttributeTestES3, IntNormalized)
TEST_P(VertexAttributeTestES3, UnsignedIntUnnormalized)
{
// Conversion of int data isn't supported yet.
// anglebug.com/3193
ANGLE_SKIP_TEST_IF(IsVulkan());
GLuint mid = std::numeric_limits<GLuint>::max() >> 1;
GLuint hi = std::numeric_limits<GLuint>::max();
std::array<GLuint, kVertexCount> inputData = {
......@@ -618,10 +606,6 @@ TEST_P(VertexAttributeTestES3, UnsignedIntUnnormalized)
TEST_P(VertexAttributeTestES3, UnsignedIntNormalized)
{
// Conversion of int data isn't supported yet.
// anglebug.com/3193
ANGLE_SKIP_TEST_IF(IsVulkan());
GLuint mid = std::numeric_limits<GLuint>::max() >> 1;
GLuint hi = std::numeric_limits<GLuint>::max();
std::array<GLuint, kVertexCount> inputData = {
......@@ -1712,9 +1696,6 @@ void VertexAttributeCachingTest::testSetUp()
TEST_P(VertexAttributeCachingTest, BufferMulticaching)
{
ANGLE_SKIP_TEST_IF(IsAMD() && IsDesktopOpenGL());
// Conversion of int data isn't supported yet.
// anglebug.com/3193
ANGLE_SKIP_TEST_IF(IsVulkan());
initBasicProgram();
......@@ -1749,9 +1730,6 @@ TEST_P(VertexAttributeCachingTest, BufferMulticaching)
TEST_P(VertexAttributeCachingTest, BufferMulticachingWithOneUnchangedAttrib)
{
ANGLE_SKIP_TEST_IF(IsAMD() && IsDesktopOpenGL());
// Conversion of int data isn't supported yet.
// anglebug.com/3193
ANGLE_SKIP_TEST_IF(IsVulkan());
initDoubleAttribProgram();
......
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