Commit 8400d05c by Mohan Maiya Committed by Commit Bot

Vulkan: Support the vertex_type_2_10_10_10_rev format

- Modify the python script and json file to generate the code which adds the function for vertex_type_2_10_10_10_rev. These functions handle the loading and conversion for vertex_type_2_10_10_10_rev. - Modify ConvertVertex.comp and ConvertVertex.comp.json to perform a GPU based conversion for vertex format of type 2_10_10_10_rev - Modify BindingIsAligned function to check that both stride and binding offset is aligned to the format size when the component size is not aligned to 8 bits. - Modify deqp3 expectations file to enable type_2_10_10_10_rev format vertex array tests. Bug: angleproject:3193 Test: dEQP-GLES3.functional.vertex_arrays.single_attribute.*2_10_10_10* Change-Id: I2358d0d8888f7dfd7eac999dc150f643167de817 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1709035Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>
parent 64751a0b
...@@ -151,6 +151,7 @@ AdaptVis GmbH ...@@ -151,6 +151,7 @@ AdaptVis GmbH
Samsung Electronics, Inc. Samsung Electronics, Inc.
Brandon Schade Brandon Schade
Hyunchang Kim Hyunchang Kim
Hyunseok Ko
Minkyu Jeong Minkyu Jeong
Mohan Maiya Mohan Maiya
......
...@@ -4,9 +4,9 @@ ...@@ -4,9 +4,9 @@
"src/libANGLE/renderer/angle_format_map.json": "src/libANGLE/renderer/angle_format_map.json":
"947fe0a2c3ca1a819a68b4a94bfcf614", "947fe0a2c3ca1a819a68b4a94bfcf614",
"src/libANGLE/renderer/vulkan/gen_vk_format_table.py": "src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
"63e0efcbe3802518058186cdbfba730e", "ed6800108a872709e5e53fde2833aa86",
"src/libANGLE/renderer/vulkan/vk_format_map.json": "src/libANGLE/renderer/vulkan/vk_format_map.json":
"bfc6328eb428c3e6dc280429113d7f81", "787cb6414e110180885350c3335cb4b4",
"src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp": "src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
"14b88d4ab20bcb737741ebd2fef64593" "184391d8ca5be757f975c6fc3f149435"
} }
\ No newline at end of file
...@@ -86,37 +86,57 @@ ...@@ -86,37 +86,57 @@
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000001.inc":
"4726c9620a56bee224983d28d979fd39", "4726c9620a56bee224983d28d979fd39",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc":
"f2733c47c6fdc76c1919d1d56b6bb53d", "872a3e1868f7458e1038783433619d4d",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc":
"effda9890acbcf7df4ad507ba795a5e5", "06a6e12fa4368f75ecd367cf3c4bd879",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc":
"429b44e5774de85b72657c26cc12bec0", "8d1508f4d60dc8b267e778d817977c9b",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc":
"fdc329bbdfcf861ef64514e996b9381b", "a4c32fcae588896e01bc9fe20e5557b4",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc":
"4ac968daab1481e5df501f8098cb9d0c", "cae0c584f7d5a4fef9f60a1a40b86d8c",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc":
"1b19cf0bd3fef9f0301c0a5e5c887a74", "fc7d617c1fbcc3987a592b7cbc070d20",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc":
"b2037ea0fc1651b4dff779df41701b1e", "f0dc88fb6a1c17f2aecf889213a01c52",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc":
"ea0041ce244d44f87f97ba7c671be723", "ed7d00538744b74d85edbb09b73f4f67",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc":
"40d55a877eed28d96ef92f42fe4590d7", "1c92be65bbcdcd389d66e52dd8b6803b",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc":
"600b5e4c4659b1e52cedb4b52e9fc6c0", "edc377f783022d3c2584fb5f4bb61df1",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc":
"60addec54cd45b611afb6fb3477aa985", "afa5a0547e883d3706bd40d2c574c9d4",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc":
"3a3b8fb4219ef5bfaafcfe7a873c1a3d", "cbf6a27eaf0dfa81f08a34b48a1a6966",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc":
"3c7f565202beea65b035da7c6a894e4f", "217e04a40cfc32994ef7a402330fedb3",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc":
"0579b05b188376e03d860e8972184eae", "137ee6dd31ad189feb757d44f066c8e8",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc":
"e120c3f480cdfd3bb22d3d434d694377", "7a24c51217d23b321789cf1fede9d2a2",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc":
"8e20d21fbfd6d579c769384ae7412a54", "f3fc9559769832be69d4bfdbc378306a",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000010.inc":
"301341c746e6c196c23c7d8c411f6421",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000011.inc":
"59359683c389647d4b45d6470105c8c8",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000012.inc":
"a8ae68c37721abb98ada973077a8cc66",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000013.inc":
"5f2d04e8ae05ab6f195222cdb165a869",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000014.inc":
"6fc4399eea394523b065b08d62e960bf",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000015.inc":
"7f6f173219b79da67606a643d1a179d7",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000016.inc":
"cb94d261657f3893a1860b11d515f379",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000017.inc":
"53c5c58a072f4675f0de9dff34c75795",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000018.inc":
"ffe1c6166a3dfe22e89710dda7232ca7",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000019.inc":
"d7345bcf49f53c1d26e06acaba052d19",
"src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc":
"ddb226d9a40f950f6757ebea385b37bb", "ddb226d9a40f950f6757ebea385b37bb",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc": "src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc":
...@@ -212,7 +232,7 @@ ...@@ -212,7 +232,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":
"8345816b9cce00c699d8d70adfbcef95", "371c0380486a34aa0e0f76bd1bc94b9e",
"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":
...@@ -220,9 +240,9 @@ ...@@ -220,9 +240,9 @@
"src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag": "src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag":
"f0f3cc82d78198f114b698e1aea31267", "f0f3cc82d78198f114b698e1aea31267",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp": "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"7891716bf0c429ddacfbb2823f166dc6", "0660e11229f28464a6de11eb07fff7d3",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h": "src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
"545807c51af450c31eb3fdf6d784d753", "0532a7219ffa0a5a9ca0cd7a6eb3206e",
"tools/glslang/glslang_validator.exe.sha1": "tools/glslang/glslang_validator.exe.sha1":
"289f30598865a987a21b79ae525fc66f", "289f30598865a987a21b79ae525fc66f",
"tools/glslang/glslang_validator.sha1": "tools/glslang/glslang_validator.sha1":
......
...@@ -94,8 +94,8 @@ struct Format final : private angle::NonCopyable ...@@ -94,8 +94,8 @@ struct Format final : private angle::NonCopyable
GLuint pixelBytes; GLuint pixelBytes;
// For 1-byte components, is MAX_UINT. For 2-byte, is 0x1. For 4-byte, is 0x3. For all others, // For 1-byte components, is 0x0. For 2-byte, is 0x1. For 4-byte, is 0x3. For all others,
// 0x0. // MAX_UINT.
GLuint componentAlignmentMask; GLuint componentAlignmentMask;
GLuint channelCount; GLuint channelCount;
......
...@@ -70,6 +70,9 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params) ...@@ -70,6 +70,9 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
bool srcIsUnorm = params.srcFormat->isUnorm(); bool srcIsUnorm = params.srcFormat->isUnorm();
bool srcIsFixed = params.srcFormat->isFixed; bool srcIsFixed = params.srcFormat->isFixed;
bool srcIsFloat = params.srcFormat->isFloat(); bool srcIsFloat = params.srcFormat->isFloat();
bool srcIsA2BGR10 =
((params.srcFormat->vertexAttribType == gl::VertexAttribType::UnsignedInt2101010) ||
(params.srcFormat->vertexAttribType == gl::VertexAttribType::Int2101010));
bool destIsSint = params.destFormat->isSint(); bool destIsSint = params.destFormat->isSint();
bool destIsUint = params.destFormat->isUint(); bool destIsUint = params.destFormat->isUint();
...@@ -95,7 +98,34 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params) ...@@ -95,7 +98,34 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
uint32_t flags = 0; uint32_t flags = 0;
if (srcIsSint && destIsSint) if (srcIsA2BGR10)
{
if (srcIsSint && destIsSint)
{
flags |= ConvertVertex_comp::kA2BGR10SintToSint;
}
else if (srcIsUint && destIsUint)
{
flags |= ConvertVertex_comp::kA2BGR10UintToUint;
}
else if (srcIsSint)
{
flags |= ConvertVertex_comp::kA2BGR10SintToFloat;
}
else if (srcIsUint)
{
flags |= ConvertVertex_comp::kA2BGR10UintToFloat;
}
else if (srcIsSnorm)
{
flags |= ConvertVertex_comp::kA2BGR10SnormToFloat;
}
else
{
UNREACHABLE();
}
}
else if (srcIsSint && destIsSint)
{ {
flags |= ConvertVertex_comp::kSintToSint; flags |= ConvertVertex_comp::kSintToSint;
} }
......
...@@ -33,16 +33,18 @@ ANGLE_INLINE bool BindingIsAligned(const gl::VertexBinding &binding, ...@@ -33,16 +33,18 @@ ANGLE_INLINE bool BindingIsAligned(const gl::VertexBinding &binding,
GLuint relativeOffset) GLuint relativeOffset)
{ {
GLintptr totalOffset = binding.getOffset() + relativeOffset; GLintptr totalOffset = binding.getOffset() + relativeOffset;
GLuint mask = angleFormat.componentAlignmentMask; GLuint mask = angleFormat.componentAlignmentMask;
if (mask != std::numeric_limits<GLuint>::max()) if (mask != std::numeric_limits<GLuint>::max())
{ {
return ((totalOffset & mask) == 0 && (binding.getStride() & mask) == 0); return ((totalOffset & mask) == 0 && (binding.getStride() & mask) == 0);
} }
else else
{ {
// To perform the GPU conversion for formats with components that aren't byte-aligned
// (for example, A2BGR10 or RGB10A2), one element has to be placed in 4 bytes to perform
// the compute shader. So, binding offset and stride has to be aligned to formatSize.
unsigned int formatSize = angleFormat.pixelBytes; unsigned int formatSize = angleFormat.pixelBytes;
return ((totalOffset * attribSize) % formatSize == 0) && return (totalOffset % formatSize == 0) && (binding.getStride() % formatSize == 0);
((binding.getStride() * attribSize) % formatSize == 0);
} }
} }
......
...@@ -128,6 +128,13 @@ def get_vertex_copy_function(src_format, dst_format, vk_format): ...@@ -128,6 +128,13 @@ def get_vertex_copy_function(src_format, dst_format, vk_format):
else: else:
return 'nullptr' return 'nullptr'
return 'CopyNativeVertexData<GLu%s, 1, 1, 0>' % base_type return 'CopyNativeVertexData<GLu%s, 1, 1, 0>' % base_type
if 'R10G10B10A2' in src_format:
# When the R10G10B10A2 type can't be used by the vertex buffer,
# it needs to be converted to the type which can be used by it.
is_signed = 'false' if 'UINT' in src_format or 'UNORM' in src_format or 'USCALED' in src_format else 'true'
normalized = 'true' if 'NORM' in src_format else 'false'
to_float = 'false' if 'INT' in src_format else 'true'
return 'CopyXYZ10W2ToXYZW32FVertexData<%s, %s, %s>' % (is_signed, normalized, to_float)
return angle_format.get_vertex_copy_function(src_format, dst_format) return angle_format.get_vertex_copy_function(src_format, dst_format)
......
...@@ -318,10 +318,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -318,10 +318,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32) if(valueBits < 32)
......
...@@ -310,10 +310,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -310,10 +310,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32) if(valueBits < 32)
......
...@@ -298,10 +298,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -298,10 +298,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint; uint value = valueAsUint;
......
...@@ -289,10 +289,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -289,10 +289,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint; uint value = valueAsUint;
......
...@@ -271,10 +271,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -271,10 +271,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32) if(valueBits < 32)
......
...@@ -262,10 +262,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -262,10 +262,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32) if(valueBits < 32)
......
...@@ -252,10 +252,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -252,10 +252,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint; uint value = valueAsUint;
......
...@@ -244,10 +244,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -244,10 +244,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint; uint value = valueAsUint;
......
...@@ -277,10 +277,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -277,10 +277,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32) if(valueBits < 32)
......
...@@ -269,10 +269,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -269,10 +269,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32) if(valueBits < 32)
......
...@@ -256,10 +256,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -256,10 +256,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
float positiveMax = valueMask; float positiveMax = valueMask;
......
...@@ -248,10 +248,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -248,10 +248,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8; uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
float positiveMax = valueMask; float positiveMax = valueMask;
......
...@@ -251,10 +251,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -251,10 +251,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8; uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
float divisor = 1.0f / 65536.0f; float divisor = 1.0f / 65536.0f;
......
...@@ -243,10 +243,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -243,10 +243,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8; uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
float divisor = 1.0f / 65536.0f; float divisor = 1.0f / 65536.0f;
......
...@@ -248,10 +248,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -248,10 +248,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8; uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
float value = uintBitsToFloat(valueAsUint); float value = uintBitsToFloat(valueAsUint);
......
...@@ -240,10 +240,11 @@ uint getShiftBits(uint offset, uint B) ...@@ -240,10 +240,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8; uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1; uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask; uint valueAsUint =(block >> shiftBits)& valueMask;
float value = uintBitsToFloat(valueAsUint); float value = uintBitsToFloat(valueAsUint);
......
...@@ -28,6 +28,9 @@ ...@@ -28,6 +28,9 @@
// To output exactly one 4-byte element, each thread is responsible for Ed=4/Bd components. // To output exactly one 4-byte element, each thread is responsible for Ed=4/Bd components.
// Therefore, thread t is responsible for component indices [Ed*t, Ed*(t + 1)). // Therefore, thread t is responsible for component indices [Ed*t, Ed*(t + 1)).
// //
// We don't use Bs and Es for A2B10G10R10 and R10G10B10A2 formats since they take 10 or 2 bits per
// component. Variables that are computed using Bs or Es are hardcoded instead.
//
// Component index c is at source offset: // Component index c is at source offset:
// //
// floor(c / Ns) * Ss + mod(c, Ns) * Bs // floor(c / Ns) * Ss + mod(c, Ns) * Bs
...@@ -45,35 +48,44 @@ ...@@ -45,35 +48,44 @@
// * UnormToFloat: Similar to UintToFloat, but normalized. // * UnormToFloat: Similar to UintToFloat, but normalized.
// * FixedToFloat: 16.16 signed fixed-point to floating point. // * FixedToFloat: 16.16 signed fixed-point to floating point.
// * FloatToFloat: float. // * FloatToFloat: float.
// * A2BGR10SintToSint: covers the signed int type of component when format is only A2BGR10.
// * A2BGR10UintToUint: covers the unsigned int type of component when format is only A2BGR10.
// * A2BGR10SintToFloat: Same types as A2BGR10SintToSint for source (including scaled).
// Converts to float.
// * A2BGR10UintToFloat: Same types as A2BGR10UintToUint for source (including uscaled).
// Converts to float.
// * A2BGR10SnormToFloat: Similar to IntToFloat, but normalized and only for A2BGR10.
// //
// 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
// Copy32FixedTo32FVertexData, SintToFloat and UintToFloat correspond to CopyTo32FVertexData with // Copy32FixedTo32FVertexData, SintToFloat and UintToFloat correspond to CopyTo32FVertexData with
// normalized=false and SnormToFloat and UnormToFloat correspond to CopyTo32FVertexData with // normalized=false and SnormToFloat and UnormToFloat correspond to CopyTo32FVertexData with
// normalized=true. // normalized=true. A2BGR10SintToSint, A2BGR10UintToUint, A2BGR10SintToFloat, A2BGR10UintToFloat
// and A2BGR10SnormToFloat correspond to CopyXYZ10W2ToXYZW32FVertexData with the proper options.
// //
#version 450 core #version 450 core
// Source type // Source type
#if SintToSint || SintToFloat #if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat
#define SrcType int #define SrcType int
#elif UintToUint || UintToFloat #elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat
#define SrcType uint #define SrcType uint
#elif SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat #elif SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat || A2BGR10SnormToFloat
#define SrcType float #define SrcType float
#else #else
#error "Not all conversions are accounted for" #error "Not all conversions are accounted for"
#endif #endif
// Destination type // Destination type
#if SintToSint #if SintToSint || A2BGR10SintToSint
#define DestType int #define DestType int
#define IsDestFloat 0 #define IsDestFloat 0
#elif UintToUint #elif UintToUint || A2BGR10UintToUint
#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
#define DestType float #define DestType float
#define IsDestFloat 1 #define IsDestFloat 1
#else #else
...@@ -199,14 +211,21 @@ SrcType loadSourceComponent(uint cd) ...@@ -199,14 +211,21 @@ SrcType loadSourceComponent(uint cd)
// Load the source component // Load the source component
uint offset = getSourceComponentOffset(vertex, component); uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4]; uint block = srcData[offset / 4];
// A2B10G10R10's components are not byte-aligned, hardcoding values for efficiency.
#if A2BGR10SintToSint || A2BGR10UintToUint || A2BGR10SnormToFloat || A2BGR10SintToFloat || \
A2BGR10UintToFloat
uint valueBits = 10;
uint shiftBits = valueBits * component;
uint valueMask = component == 3 ? 0x03 : 0x3FF;
#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
uint valueAsUint = (block >> shiftBits) & valueMask; uint valueAsUint = (block >> shiftBits) & valueMask;
// Convert to SrcType // Convert to SrcType
#if SintToSint || SintToFloat #if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat
if (valueBits < 32) if (valueBits < 32)
{ {
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0; bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
...@@ -217,9 +236,9 @@ SrcType loadSourceComponent(uint cd) ...@@ -217,9 +236,9 @@ SrcType loadSourceComponent(uint cd)
valueAsUint |= signExtension; valueAsUint |= signExtension;
} }
SrcType value = SrcType(valueAsUint); SrcType value = SrcType(valueAsUint);
#elif UintToUint || UintToFloat #elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat
SrcType value = valueAsUint; SrcType value = valueAsUint;
#elif SnormToFloat #elif SnormToFloat || A2BGR10SnormToFloat
if (valueBits < 32) if (valueBits < 32)
{ {
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0; bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
...@@ -256,7 +275,7 @@ uint makeDestinationComponent(uint cd, DestType value) ...@@ -256,7 +275,7 @@ uint makeDestinationComponent(uint cd, DestType value)
// Return valueAsUint, shifted to the right spot. Multiple calls to this function should be |ed // Return valueAsUint, shifted to the right spot. Multiple calls to this function should be |ed
// and eventually written to the destination. // and eventually written to the destination.
#if SintToSint || UintToUint #if SintToSint || UintToUint || A2BGR10SintToSint || A2BGR10UintToUint
uint vertex = cd / Nd; uint vertex = cd / Nd;
uint component = cd % Nd; uint component = cd % Nd;
......
...@@ -17,7 +17,12 @@ ...@@ -17,7 +17,12 @@
"SnormToFloat", "SnormToFloat",
"UnormToFloat", "UnormToFloat",
"FixedToFloat", "FixedToFloat",
"FloatToFloat" "FloatToFloat",
"A2BGR10SintToSint",
"A2BGR10UintToUint",
"A2BGR10SintToFloat",
"A2BGR10UintToFloat",
"A2BGR10SnormToFloat"
] ]
} }
...@@ -440,6 +440,21 @@ ...@@ -440,6 +440,21 @@
}, },
"EAC_R11G11_SNORM_BLOCK": { "EAC_R11G11_SNORM_BLOCK": {
"image": ["R16G16_SNORM", "R16G16_FLOAT"] "image": ["R16G16_SNORM", "R16G16_FLOAT"]
},
"R10G10B10A2_SNORM": {
"buffer": "R32G32B32A32_FLOAT"
},
"R10G10B10A2_USCALED": {
"buffer": "R32G32B32A32_FLOAT"
},
"R10G10B10A2_SSCALED": {
"buffer": "R32G32B32A32_FLOAT"
},
"R10G10B10A2_UINT": {
"buffer": "R16G16B16A16_UINT"
},
"R10G10B10A2_SINT": {
"buffer": "R16G16B16A16_SINT"
} }
} }
} }
...@@ -1014,51 +1014,63 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat) ...@@ -1014,51 +1014,63 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break; break;
case angle::FormatID::R10G10B10A2_SINT: case angle::FormatID::R10G10B10A2_SINT:
internalFormat = GL_RGB10_A2_SINT_ANGLEX; internalFormat = GL_RGB10_A2_SINT_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SINT; imageFormatID = angle::FormatID::R10G10B10A2_SINT;
vkImageFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32; vkImageFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32;
imageInitializerFunction = nullptr; imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SINT; {
vkBufferFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32; static constexpr BufferFormatInitInfo kInfo[] = {
vkBufferFormatIsPacked = true; {angle::FormatID::R10G10B10A2_SINT, VK_FORMAT_A2B10G10R10_SINT_PACK32, true,
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; CopyNativeVertexData<GLuint, 1, 1, 0>, false},
vertexLoadRequiresConversion = false; {angle::FormatID::R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT, false,
CopyXYZ10W2ToXYZW32FVertexData<true, false, false>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break; break;
case angle::FormatID::R10G10B10A2_SNORM: case angle::FormatID::R10G10B10A2_SNORM:
internalFormat = GL_RGB10_A2_SNORM_ANGLEX; internalFormat = GL_RGB10_A2_SNORM_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SNORM; imageFormatID = angle::FormatID::R10G10B10A2_SNORM;
vkImageFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32; vkImageFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
imageInitializerFunction = nullptr; imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SNORM; {
vkBufferFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32; static constexpr BufferFormatInitInfo kInfo[] = {
vkBufferFormatIsPacked = true; {angle::FormatID::R10G10B10A2_SNORM, VK_FORMAT_A2B10G10R10_SNORM_PACK32, true,
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; CopyNativeVertexData<GLuint, 1, 1, 0>, false},
vertexLoadRequiresConversion = false; {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
CopyXYZ10W2ToXYZW32FVertexData<true, true, true>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break; break;
case angle::FormatID::R10G10B10A2_SSCALED: case angle::FormatID::R10G10B10A2_SSCALED:
internalFormat = GL_RGB10_A2_SSCALED_ANGLEX; internalFormat = GL_RGB10_A2_SSCALED_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SSCALED; imageFormatID = angle::FormatID::R10G10B10A2_SSCALED;
vkImageFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32; vkImageFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
imageInitializerFunction = nullptr; imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SSCALED; {
vkBufferFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32; static constexpr BufferFormatInitInfo kInfo[] = {
vkBufferFormatIsPacked = true; {angle::FormatID::R10G10B10A2_SSCALED, VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; true, CopyNativeVertexData<GLuint, 1, 1, 0>, false},
vertexLoadRequiresConversion = false; {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
CopyXYZ10W2ToXYZW32FVertexData<true, false, true>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break; break;
case angle::FormatID::R10G10B10A2_UINT: case angle::FormatID::R10G10B10A2_UINT:
internalFormat = GL_RGB10_A2UI; internalFormat = GL_RGB10_A2UI;
imageFormatID = angle::FormatID::R10G10B10A2_UINT; imageFormatID = angle::FormatID::R10G10B10A2_UINT;
vkImageFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32; vkImageFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32;
imageInitializerFunction = nullptr; imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_UINT; {
vkBufferFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32; static constexpr BufferFormatInitInfo kInfo[] = {
vkBufferFormatIsPacked = true; {angle::FormatID::R10G10B10A2_UINT, VK_FORMAT_A2B10G10R10_UINT_PACK32, true,
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; CopyNativeVertexData<GLuint, 1, 1, 0>, false},
vertexLoadRequiresConversion = false; {angle::FormatID::R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT, false,
CopyXYZ10W2ToXYZW32FVertexData<false, false, false>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break; break;
case angle::FormatID::R10G10B10A2_UNORM: case angle::FormatID::R10G10B10A2_UNORM:
...@@ -1074,15 +1086,18 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat) ...@@ -1074,15 +1086,18 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break; break;
case angle::FormatID::R10G10B10A2_USCALED: case angle::FormatID::R10G10B10A2_USCALED:
internalFormat = GL_RGB10_A2_USCALED_ANGLEX; internalFormat = GL_RGB10_A2_USCALED_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_USCALED; imageFormatID = angle::FormatID::R10G10B10A2_USCALED;
vkImageFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32; vkImageFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
imageInitializerFunction = nullptr; imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_USCALED; {
vkBufferFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32; static constexpr BufferFormatInitInfo kInfo[] = {
vkBufferFormatIsPacked = true; {angle::FormatID::R10G10B10A2_USCALED, VK_FORMAT_A2B10G10R10_USCALED_PACK32,
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>; true, CopyNativeVertexData<GLuint, 1, 1, 0>, false},
vertexLoadRequiresConversion = false; {angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
CopyXYZ10W2ToXYZW32FVertexData<false, false, true>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break; break;
case angle::FormatID::R11G11B10_FLOAT: case angle::FormatID::R11G11B10_FLOAT:
......
...@@ -74,6 +74,16 @@ namespace ...@@ -74,6 +74,16 @@ namespace
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000F.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000010.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000011.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000012.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000013.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000015.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000016.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.00000019.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"
...@@ -192,6 +202,16 @@ constexpr ShaderBlob kConvertVertex_comp_shaders[] = { ...@@ -192,6 +202,16 @@ constexpr ShaderBlob kConvertVertex_comp_shaders[] = {
{kConvertVertex_comp_0000000D, sizeof(kConvertVertex_comp_0000000D)}, {kConvertVertex_comp_0000000D, sizeof(kConvertVertex_comp_0000000D)},
{kConvertVertex_comp_0000000E, sizeof(kConvertVertex_comp_0000000E)}, {kConvertVertex_comp_0000000E, sizeof(kConvertVertex_comp_0000000E)},
{kConvertVertex_comp_0000000F, sizeof(kConvertVertex_comp_0000000F)}, {kConvertVertex_comp_0000000F, sizeof(kConvertVertex_comp_0000000F)},
{kConvertVertex_comp_00000010, sizeof(kConvertVertex_comp_00000010)},
{kConvertVertex_comp_00000011, sizeof(kConvertVertex_comp_00000011)},
{kConvertVertex_comp_00000012, sizeof(kConvertVertex_comp_00000012)},
{kConvertVertex_comp_00000013, sizeof(kConvertVertex_comp_00000013)},
{kConvertVertex_comp_00000014, sizeof(kConvertVertex_comp_00000014)},
{kConvertVertex_comp_00000015, sizeof(kConvertVertex_comp_00000015)},
{kConvertVertex_comp_00000016, sizeof(kConvertVertex_comp_00000016)},
{kConvertVertex_comp_00000017, sizeof(kConvertVertex_comp_00000017)},
{kConvertVertex_comp_00000018, sizeof(kConvertVertex_comp_00000018)},
{kConvertVertex_comp_00000019, sizeof(kConvertVertex_comp_00000019)},
}; };
constexpr ShaderBlob kFullScreenQuad_vert_shaders[] = { constexpr ShaderBlob kFullScreenQuad_vert_shaders[] = {
{kFullScreenQuad_vert_00000000, sizeof(kFullScreenQuad_vert_00000000)}, {kFullScreenQuad_vert_00000000, sizeof(kFullScreenQuad_vert_00000000)},
......
...@@ -67,6 +67,16 @@ angle_vulkan_internal_shaders = [ ...@@ -67,6 +67,16 @@ angle_vulkan_internal_shaders = [
"shaders/gen/ConvertVertex.comp.0000000D.inc", "shaders/gen/ConvertVertex.comp.0000000D.inc",
"shaders/gen/ConvertVertex.comp.0000000E.inc", "shaders/gen/ConvertVertex.comp.0000000E.inc",
"shaders/gen/ConvertVertex.comp.0000000F.inc", "shaders/gen/ConvertVertex.comp.0000000F.inc",
"shaders/gen/ConvertVertex.comp.00000010.inc",
"shaders/gen/ConvertVertex.comp.00000011.inc",
"shaders/gen/ConvertVertex.comp.00000012.inc",
"shaders/gen/ConvertVertex.comp.00000013.inc",
"shaders/gen/ConvertVertex.comp.00000014.inc",
"shaders/gen/ConvertVertex.comp.00000015.inc",
"shaders/gen/ConvertVertex.comp.00000016.inc",
"shaders/gen/ConvertVertex.comp.00000017.inc",
"shaders/gen/ConvertVertex.comp.00000018.inc",
"shaders/gen/ConvertVertex.comp.00000019.inc",
"shaders/gen/FullScreenQuad.vert.00000000.inc", "shaders/gen/FullScreenQuad.vert.00000000.inc",
"shaders/gen/ImageClear.frag.00000000.inc", "shaders/gen/ImageClear.frag.00000000.inc",
"shaders/gen/ImageClear.frag.00000001.inc", "shaders/gen/ImageClear.frag.00000001.inc",
......
...@@ -85,16 +85,21 @@ enum flags ...@@ -85,16 +85,21 @@ enum flags
}; };
enum Conversion enum Conversion
{ {
kSintToSint = 0x00000000, kSintToSint = 0x00000000,
kUintToUint = 0x00000002, kUintToUint = 0x00000002,
kSintToFloat = 0x00000004, kSintToFloat = 0x00000004,
kUintToFloat = 0x00000006, kUintToFloat = 0x00000006,
kSnormToFloat = 0x00000008, kSnormToFloat = 0x00000008,
kUnormToFloat = 0x0000000A, kUnormToFloat = 0x0000000A,
kFixedToFloat = 0x0000000C, kFixedToFloat = 0x0000000C,
kFloatToFloat = 0x0000000E, kFloatToFloat = 0x0000000E,
kA2BGR10SintToSint = 0x00000010,
kA2BGR10UintToUint = 0x00000012,
kA2BGR10SintToFloat = 0x00000014,
kA2BGR10UintToFloat = 0x00000016,
kA2BGR10SnormToFloat = 0x00000018,
}; };
constexpr size_t kArrayLen = 0x00000010; constexpr size_t kArrayLen = 0x0000001A;
} // namespace ConvertVertex_comp } // namespace ConvertVertex_comp
namespace FullScreenQuad_vert namespace FullScreenQuad_vert
......
...@@ -597,10 +597,6 @@ ...@@ -597,10 +597,6 @@
3443 VULKAN : dEQP-GLES3.functional.ubo.random.nested_structs_instance_arrays.18 = FAIL 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 3443 VULKAN : dEQP-GLES3.functional.ubo.random.nested_structs_instance_arrays.24 = FAIL
// 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.draw_elements_instanced.attribute_divisor.2*_instances = FAIL 3221 VULKAN : dEQP-GLES3.functional.instanced.draw_elements_instanced.attribute_divisor.2*_instances = FAIL
3221 VULKAN : dEQP-GLES3.functional.instanced.draw_elements_instanced.attribute_divisor.4_instances = FAIL 3221 VULKAN : dEQP-GLES3.functional.instanced.draw_elements_instanced.attribute_divisor.4_instances = FAIL
3221 VULKAN : dEQP-GLES3.functional.instanced.draw_elements_instanced.mixed.2*_instances = FAIL 3221 VULKAN : dEQP-GLES3.functional.instanced.draw_elements_instanced.mixed.2*_instances = FAIL
......
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