Skip to content

Commit

Permalink
Vulkan: Support the vertex_type_2_10_10_10_rev format
Browse files Browse the repository at this point in the history
- 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/+/1709035
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
  • Loading branch information
Mohan Maiya authored and Commit Bot committed Aug 8, 2019
1 parent 64751a0 commit 8400d05
Show file tree
Hide file tree
Showing 41 changed files with 3,544 additions and 115 deletions.
1 change: 1 addition & 0 deletions CONTRIBUTORS
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ AdaptVis GmbH
Samsung Electronics, Inc.
Brandon Schade
Hyunchang Kim
Hyunseok Ko
Minkyu Jeong
Mohan Maiya

Expand Down
6 changes: 3 additions & 3 deletions scripts/code_generation_hashes/Vulkan_format.json
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}
58 changes: 39 additions & 19 deletions scripts/code_generation_hashes/Vulkan_internal_shader_programs.json
Original file line number Diff line number Diff line change
Expand Up @@ -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":
Expand Down Expand Up @@ -212,17 +232,17 @@
"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":
"8889ae8014a657a0efd5607954126945",
"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":
Expand Down
4 changes: 2 additions & 2 deletions src/libANGLE/renderer/Format.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
32 changes: 31 additions & 1 deletion src/libANGLE/renderer/vulkan/UtilsVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
}
Expand Down
8 changes: 5 additions & 3 deletions src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}

Expand Down
7 changes: 7 additions & 0 deletions src/libANGLE/renderer/vulkan/gen_vk_format_table.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading

0 comments on commit 8400d05

Please sign in to comment.