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
Samsung Electronics, Inc.
Brandon Schade
Hyunchang Kim
Hyunseok Ko
Minkyu Jeong
Mohan Maiya
......
......@@ -4,9 +4,9 @@
"src/libANGLE/renderer/angle_format_map.json":
"947fe0a2c3ca1a819a68b4a94bfcf614",
"src/libANGLE/renderer/vulkan/gen_vk_format_table.py":
"63e0efcbe3802518058186cdbfba730e",
"ed6800108a872709e5e53fde2833aa86",
"src/libANGLE/renderer/vulkan/vk_format_map.json":
"bfc6328eb428c3e6dc280429113d7f81",
"787cb6414e110180885350c3335cb4b4",
"src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
"14b88d4ab20bcb737741ebd2fef64593"
"184391d8ca5be757f975c6fc3f149435"
}
\ No newline at end of file
......@@ -86,37 +86,57 @@
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertIndex.comp.00000001.inc":
"4726c9620a56bee224983d28d979fd39",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000000.inc":
"f2733c47c6fdc76c1919d1d56b6bb53d",
"872a3e1868f7458e1038783433619d4d",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000001.inc":
"effda9890acbcf7df4ad507ba795a5e5",
"06a6e12fa4368f75ecd367cf3c4bd879",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000002.inc":
"429b44e5774de85b72657c26cc12bec0",
"8d1508f4d60dc8b267e778d817977c9b",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000003.inc":
"fdc329bbdfcf861ef64514e996b9381b",
"a4c32fcae588896e01bc9fe20e5557b4",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000004.inc":
"4ac968daab1481e5df501f8098cb9d0c",
"cae0c584f7d5a4fef9f60a1a40b86d8c",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000005.inc":
"1b19cf0bd3fef9f0301c0a5e5c887a74",
"fc7d617c1fbcc3987a592b7cbc070d20",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000006.inc":
"b2037ea0fc1651b4dff779df41701b1e",
"f0dc88fb6a1c17f2aecf889213a01c52",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000007.inc":
"ea0041ce244d44f87f97ba7c671be723",
"ed7d00538744b74d85edbb09b73f4f67",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000008.inc":
"40d55a877eed28d96ef92f42fe4590d7",
"1c92be65bbcdcd389d66e52dd8b6803b",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.00000009.inc":
"600b5e4c4659b1e52cedb4b52e9fc6c0",
"edc377f783022d3c2584fb5f4bb61df1",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000A.inc":
"60addec54cd45b611afb6fb3477aa985",
"afa5a0547e883d3706bd40d2c574c9d4",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000B.inc":
"3a3b8fb4219ef5bfaafcfe7a873c1a3d",
"cbf6a27eaf0dfa81f08a34b48a1a6966",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000C.inc":
"3c7f565202beea65b035da7c6a894e4f",
"217e04a40cfc32994ef7a402330fedb3",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000D.inc":
"0579b05b188376e03d860e8972184eae",
"137ee6dd31ad189feb757d44f066c8e8",
"src/libANGLE/renderer/vulkan/shaders/gen/ConvertVertex.comp.0000000E.inc":
"e120c3f480cdfd3bb22d3d434d694377",
"7a24c51217d23b321789cf1fede9d2a2",
"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":
"ddb226d9a40f950f6757ebea385b37bb",
"src/libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000000.inc":
......@@ -212,7 +232,7 @@
"src/libANGLE/renderer/vulkan/shaders/src/ConvertIndex.comp":
"ca35df77d258baa0636529d1f0f446a9",
"src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp":
"8345816b9cce00c699d8d70adfbcef95",
"371c0380486a34aa0e0f76bd1bc94b9e",
"src/libANGLE/renderer/vulkan/shaders/src/FullScreenQuad.vert":
"805ec8b2f87d4bd4242dc5b1c58ba3b4",
"src/libANGLE/renderer/vulkan/shaders/src/ImageClear.frag":
......@@ -220,9 +240,9 @@
"src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag":
"f0f3cc82d78198f114b698e1aea31267",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"7891716bf0c429ddacfbb2823f166dc6",
"0660e11229f28464a6de11eb07fff7d3",
"src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
"545807c51af450c31eb3fdf6d784d753",
"0532a7219ffa0a5a9ca0cd7a6eb3206e",
"tools/glslang/glslang_validator.exe.sha1":
"289f30598865a987a21b79ae525fc66f",
"tools/glslang/glslang_validator.sha1":
......
......@@ -94,8 +94,8 @@ struct Format final : private angle::NonCopyable
GLuint pixelBytes;
// For 1-byte components, is MAX_UINT. For 2-byte, is 0x1. For 4-byte, is 0x3. For all others,
// 0x0.
// For 1-byte components, is 0x0. For 2-byte, is 0x1. For 4-byte, is 0x3. For all others,
// MAX_UINT.
GLuint componentAlignmentMask;
GLuint channelCount;
......
......@@ -70,6 +70,9 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
bool srcIsUnorm = params.srcFormat->isUnorm();
bool srcIsFixed = params.srcFormat->isFixed;
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 destIsUint = params.destFormat->isUint();
......@@ -95,7 +98,34 @@ uint32_t GetConvertVertexFlags(const UtilsVk::ConvertVertexParameters &params)
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;
}
......
......@@ -33,16 +33,18 @@ ANGLE_INLINE bool BindingIsAligned(const gl::VertexBinding &binding,
GLuint relativeOffset)
{
GLintptr totalOffset = binding.getOffset() + relativeOffset;
GLuint mask = angleFormat.componentAlignmentMask;
GLuint mask = angleFormat.componentAlignmentMask;
if (mask != std::numeric_limits<GLuint>::max())
{
return ((totalOffset & mask) == 0 && (binding.getStride() & mask) == 0);
}
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;
return ((totalOffset * attribSize) % formatSize == 0) &&
((binding.getStride() * attribSize) % formatSize == 0);
return (totalOffset % formatSize == 0) && (binding.getStride() % formatSize == 0);
}
}
......
......@@ -128,6 +128,13 @@ def get_vertex_copy_function(src_format, dst_format, vk_format):
else:
return 'nullptr'
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)
......
......@@ -318,10 +318,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32)
......
......@@ -310,10 +310,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32)
......
......@@ -298,10 +298,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint;
......
......@@ -289,10 +289,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint;
......
......@@ -271,10 +271,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32)
......
......@@ -262,10 +262,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32)
......
......@@ -252,10 +252,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint;
......
......@@ -244,10 +244,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
uint value = valueAsUint;
......
......@@ -277,10 +277,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32)
......
......@@ -269,10 +269,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
if(valueBits < 32)
......
......@@ -256,10 +256,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
float positiveMax = valueMask;
......
......@@ -248,10 +248,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, params . Bs);
uint shiftBits = getShiftBits(offset, params . Bs);
uint valueBits = params . Bs * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
float positiveMax = valueMask;
......
......@@ -251,10 +251,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
float divisor = 1.0f / 65536.0f;
......
......@@ -243,10 +243,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
float divisor = 1.0f / 65536.0f;
......
......@@ -248,10 +248,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
float value = uintBitsToFloat(valueAsUint);
......
......@@ -240,10 +240,11 @@ uint getShiftBits(uint offset, uint B)
uint offset = getSourceComponentOffset(vertex, component);
uint block = srcData[offset / 4];
uint shiftBits = getShiftBits(offset, 4);
uint shiftBits = getShiftBits(offset, 4);
uint valueBits = 4 * 8;
uint valueMask = valueBits == 32 ? - 1 :(1 << valueBits)- 1;
uint valueAsUint =(block >> shiftBits)& valueMask;
float value = uintBitsToFloat(valueAsUint);
......
......@@ -28,6 +28,9 @@
// 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)).
//
// 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:
//
// floor(c / Ns) * Ss + mod(c, Ns) * Bs
......@@ -45,35 +48,44 @@
// * UnormToFloat: Similar to UintToFloat, but normalized.
// * FixedToFloat: 16.16 signed fixed-point to floating point.
// * 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
// Copy8SintTo16SintVertexData() in renderer/copyvertex.inc, FixedToFloat corresponds to
// Copy32FixedTo32FVertexData, SintToFloat and UintToFloat 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
// Source type
#if SintToSint || SintToFloat
#if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat
#define SrcType int
#elif UintToUint || UintToFloat
#elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat
#define SrcType uint
#elif SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat
#elif SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat || A2BGR10SnormToFloat
#define SrcType float
#else
#error "Not all conversions are accounted for"
#endif
// Destination type
#if SintToSint
#if SintToSint || A2BGR10SintToSint
#define DestType int
#define IsDestFloat 0
#elif UintToUint
#elif UintToUint || A2BGR10UintToUint
#define DestType uint
#define IsDestFloat 0
#elif SintToFloat || UintToFloat || SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat
#elif SintToFloat || UintToFloat || SnormToFloat || UnormToFloat || FixedToFloat || FloatToFloat || \
A2BGR10SintToFloat || A2BGR10UintToFloat || A2BGR10SnormToFloat
#define DestType float
#define IsDestFloat 1
#else
......@@ -199,14 +211,21 @@ SrcType loadSourceComponent(uint cd)
// Load the source component
uint offset = getSourceComponentOffset(vertex, component);
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 valueBits = Bs * 8;
uint valueMask = valueBits == 32 ? -1 : (1 << valueBits) - 1;
#endif
uint valueAsUint = (block >> shiftBits) & valueMask;
// Convert to SrcType
#if SintToSint || SintToFloat
#if SintToSint || SintToFloat || A2BGR10SintToSint || A2BGR10SintToFloat
if (valueBits < 32)
{
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
......@@ -217,9 +236,9 @@ SrcType loadSourceComponent(uint cd)
valueAsUint |= signExtension;
}
SrcType value = SrcType(valueAsUint);
#elif UintToUint || UintToFloat
#elif UintToUint || UintToFloat || A2BGR10UintToUint || A2BGR10UintToFloat
SrcType value = valueAsUint;
#elif SnormToFloat
#elif SnormToFloat || A2BGR10SnormToFloat
if (valueBits < 32)
{
bool isNegative = (valueAsUint & (1 << (valueBits - 1))) != 0;
......@@ -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
// and eventually written to the destination.
#if SintToSint || UintToUint
#if SintToSint || UintToUint || A2BGR10SintToSint || A2BGR10UintToUint
uint vertex = cd / Nd;
uint component = cd % Nd;
......
......@@ -17,7 +17,12 @@
"SnormToFloat",
"UnormToFloat",
"FixedToFloat",
"FloatToFloat"
"FloatToFloat",
"A2BGR10SintToSint",
"A2BGR10UintToUint",
"A2BGR10SintToFloat",
"A2BGR10UintToFloat",
"A2BGR10SnormToFloat"
]
}
......@@ -440,6 +440,21 @@
},
"EAC_R11G11_SNORM_BLOCK": {
"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)
break;
case angle::FormatID::R10G10B10A2_SINT:
internalFormat = GL_RGB10_A2_SINT_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SINT;
vkImageFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SINT;
vkBufferFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32;
vkBufferFormatIsPacked = true;
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>;
vertexLoadRequiresConversion = false;
internalFormat = GL_RGB10_A2_SINT_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SINT;
vkImageFormat = VK_FORMAT_A2B10G10R10_SINT_PACK32;
imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R10G10B10A2_SINT, VK_FORMAT_A2B10G10R10_SINT_PACK32, true,
CopyNativeVertexData<GLuint, 1, 1, 0>, false},
{angle::FormatID::R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT, false,
CopyXYZ10W2ToXYZW32FVertexData<true, false, false>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break;
case angle::FormatID::R10G10B10A2_SNORM:
internalFormat = GL_RGB10_A2_SNORM_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SNORM;
vkImageFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SNORM;
vkBufferFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
vkBufferFormatIsPacked = true;
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>;
vertexLoadRequiresConversion = false;
internalFormat = GL_RGB10_A2_SNORM_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SNORM;
vkImageFormat = VK_FORMAT_A2B10G10R10_SNORM_PACK32;
imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R10G10B10A2_SNORM, VK_FORMAT_A2B10G10R10_SNORM_PACK32, true,
CopyNativeVertexData<GLuint, 1, 1, 0>, false},
{angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
CopyXYZ10W2ToXYZW32FVertexData<true, true, true>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break;
case angle::FormatID::R10G10B10A2_SSCALED:
internalFormat = GL_RGB10_A2_SSCALED_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SSCALED;
vkImageFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_SSCALED;
vkBufferFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
vkBufferFormatIsPacked = true;
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>;
vertexLoadRequiresConversion = false;
internalFormat = GL_RGB10_A2_SSCALED_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_SSCALED;
vkImageFormat = VK_FORMAT_A2B10G10R10_SSCALED_PACK32;
imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R10G10B10A2_SSCALED, VK_FORMAT_A2B10G10R10_SSCALED_PACK32,
true, CopyNativeVertexData<GLuint, 1, 1, 0>, false},
{angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
CopyXYZ10W2ToXYZW32FVertexData<true, false, true>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break;
case angle::FormatID::R10G10B10A2_UINT:
internalFormat = GL_RGB10_A2UI;
imageFormatID = angle::FormatID::R10G10B10A2_UINT;
vkImageFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_UINT;
vkBufferFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32;
vkBufferFormatIsPacked = true;
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>;
vertexLoadRequiresConversion = false;
internalFormat = GL_RGB10_A2UI;
imageFormatID = angle::FormatID::R10G10B10A2_UINT;
vkImageFormat = VK_FORMAT_A2B10G10R10_UINT_PACK32;
imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R10G10B10A2_UINT, VK_FORMAT_A2B10G10R10_UINT_PACK32, true,
CopyNativeVertexData<GLuint, 1, 1, 0>, false},
{angle::FormatID::R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT, false,
CopyXYZ10W2ToXYZW32FVertexData<false, false, false>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break;
case angle::FormatID::R10G10B10A2_UNORM:
......@@ -1074,15 +1086,18 @@ void Format::initialize(RendererVk *renderer, const angle::Format &angleFormat)
break;
case angle::FormatID::R10G10B10A2_USCALED:
internalFormat = GL_RGB10_A2_USCALED_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_USCALED;
vkImageFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
imageInitializerFunction = nullptr;
bufferFormatID = angle::FormatID::R10G10B10A2_USCALED;
vkBufferFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
vkBufferFormatIsPacked = true;
vertexLoadFunction = CopyNativeVertexData<GLuint, 1, 1, 0>;
vertexLoadRequiresConversion = false;
internalFormat = GL_RGB10_A2_USCALED_ANGLEX;
imageFormatID = angle::FormatID::R10G10B10A2_USCALED;
vkImageFormat = VK_FORMAT_A2B10G10R10_USCALED_PACK32;
imageInitializerFunction = nullptr;
{
static constexpr BufferFormatInitInfo kInfo[] = {
{angle::FormatID::R10G10B10A2_USCALED, VK_FORMAT_A2B10G10R10_USCALED_PACK32,
true, CopyNativeVertexData<GLuint, 1, 1, 0>, false},
{angle::FormatID::R32G32B32A32_FLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, false,
CopyXYZ10W2ToXYZW32FVertexData<false, false, true>, true}};
initBufferFallback(renderer, kInfo, ArraySize(kInfo));
}
break;
case angle::FormatID::R11G11B10_FLOAT:
......
......@@ -74,6 +74,16 @@ namespace
#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.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/ImageClear.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageClear.frag.00000001.inc"
......@@ -192,6 +202,16 @@ constexpr ShaderBlob kConvertVertex_comp_shaders[] = {
{kConvertVertex_comp_0000000D, sizeof(kConvertVertex_comp_0000000D)},
{kConvertVertex_comp_0000000E, sizeof(kConvertVertex_comp_0000000E)},
{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[] = {
{kFullScreenQuad_vert_00000000, sizeof(kFullScreenQuad_vert_00000000)},
......
......@@ -67,6 +67,16 @@ angle_vulkan_internal_shaders = [
"shaders/gen/ConvertVertex.comp.0000000D.inc",
"shaders/gen/ConvertVertex.comp.0000000E.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/ImageClear.frag.00000000.inc",
"shaders/gen/ImageClear.frag.00000001.inc",
......
......@@ -85,16 +85,21 @@ enum flags
};
enum Conversion
{
kSintToSint = 0x00000000,
kUintToUint = 0x00000002,
kSintToFloat = 0x00000004,
kUintToFloat = 0x00000006,
kSnormToFloat = 0x00000008,
kUnormToFloat = 0x0000000A,
kFixedToFloat = 0x0000000C,
kFloatToFloat = 0x0000000E,
kSintToSint = 0x00000000,
kUintToUint = 0x00000002,
kSintToFloat = 0x00000004,
kUintToFloat = 0x00000006,
kSnormToFloat = 0x00000008,
kUnormToFloat = 0x0000000A,
kFixedToFloat = 0x0000000C,
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 FullScreenQuad_vert
......
......@@ -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.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.4_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