Vulkan: Reduce PipelineDesc size.
This packs the desc into 288 bytes. Down from over 400. The hashing and
memcmp functions are sped up considerably.
Improves performance in the VulkanPipelineCachePerf test by 50% and
also improves performance in the state changing draw call test by 20%.
Bug: angleproject:2522
Change-Id: I72ed191a93721b875684f647f806c09be4e66821
Reviewed-on: https://chromium-review.googlesource.com/c/1308460
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org>
Commit-Queue: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index baae7ad..37b8c50 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -75,6 +75,8 @@
mCurrentElementArrayBufferHandle(VK_NULL_HANDLE),
mCurrentElementArrayBufferOffset(0),
mCurrentElementArrayBufferResource(nullptr),
+ mPackedInputBindings{},
+ mPackedInputAttributes{},
mDynamicVertexData(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, kDynamicVertexDataSize),
mDynamicIndexData(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, kDynamicIndexDataSize),
mTranslatedByteIndexData(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, kDynamicIndexDataSize),
@@ -85,9 +87,6 @@
mCurrentArrayBufferOffsets.fill(0);
mCurrentArrayBufferResources.fill(nullptr);
- mPackedInputBindings.fill({0, 0});
- mPackedInputAttributes.fill({0, 0, 0});
-
for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
{
buffer.init(kMaxVertexFormatAlignment, renderer);
@@ -397,10 +396,9 @@
bindingDesc.stride = 0;
bindingDesc.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
- vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
- attribDesc.format = static_cast<uint16_t>(VK_FORMAT_R32G32B32A32_SFLOAT);
- attribDesc.location = static_cast<uint16_t>(attribIndex);
- attribDesc.offset = 0;
+ mPackedInputAttributes.formats[attribIndex] =
+ static_cast<uint16_t>(VK_FORMAT_R32G32B32A32_SFLOAT);
+ mPackedInputAttributes.offsets[attribIndex] = 0;
}
}
@@ -424,10 +422,8 @@
UNIMPLEMENTED();
}
- vk::PackedVertexInputAttributeDesc &attribDesc = mPackedInputAttributes[attribIndex];
- attribDesc.format = static_cast<uint16_t>(vkFormat);
- attribDesc.location = static_cast<uint16_t>(attribIndex);
- attribDesc.offset = static_cast<uint32_t>(attrib.relativeOffset);
+ mPackedInputAttributes.formats[attribIndex] = static_cast<uint8_t>(vkFormat);
+ mPackedInputAttributes.offsets[attribIndex] = static_cast<uint16_t>(attrib.relativeOffset);
}
angle::Result VertexArrayVk::updateClientAttribs(const gl::Context *context,