Vulkan: Vertex buffer should be format aligned.
The address of each attribute in a vertex buffer must be aligned
according to its format. See section 20.3 of vkspec.
Currently we don't handle this when using DynamicBuffer as vertex
input buffer. This loosely fixes the issue by using max alignment for
all formats.
BUG=angleproject:2797,angleproject:2405
Change-Id: I2b27950dacc8fda75dcb646ef4b4d66ff27d629a
Reviewed-on: https://chromium-review.googlesource.com/1234281
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index 90d9ff2..e673b95 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -25,6 +25,7 @@
{
constexpr size_t kDynamicVertexDataSize = 1024 * 1024;
constexpr size_t kDynamicIndexDataSize = 1024 * 8;
+constexpr size_t kMaxVertexFormatAlignment = 4;
bool BindingIsAligned(const gl::VertexBinding &binding, unsigned componentSize)
{
@@ -51,6 +52,7 @@
ANGLE_TRY(dynamicBuffer->flush(contextVk));
return angle::Result::Continue();
}
+
} // anonymous namespace
#define INIT \
@@ -88,9 +90,9 @@
for (vk::DynamicBuffer &buffer : mCurrentArrayBufferConversion)
{
- buffer.init(1, renderer);
+ buffer.init(kMaxVertexFormatAlignment, renderer);
}
- mDynamicVertexData.init(1, renderer);
+ mDynamicVertexData.init(kMaxVertexFormatAlignment, renderer);
mDynamicIndexData.init(1, renderer);
mTranslatedByteIndexData.init(1, renderer);
@@ -184,6 +186,8 @@
ANGLE_TRY(srcBuffer->mapImpl(contextVk, &src));
const uint8_t *srcBytes = reinterpret_cast<const uint8_t *>(src);
srcBytes += binding.getOffset();
+ ASSERT(GetVertexInputAlignment(*mCurrentArrayBufferFormats[attribIndex]) <=
+ kMaxVertexFormatAlignment);
ANGLE_TRY(StreamVertexData(contextVk, &mCurrentArrayBufferConversion[attribIndex], srcBytes,
numVertices * dstFormatSize, 0, numVertices, binding.getStride(),
mCurrentArrayBufferFormats[attribIndex]->vertexLoadFunction,
@@ -455,6 +459,8 @@
drawCallParams.firstVertex() * binding.getStride();
size_t destOffset = drawCallParams.firstVertex() * mCurrentArrayBufferStrides[attribIndex];
+ ASSERT(GetVertexInputAlignment(*mCurrentArrayBufferFormats[attribIndex]) <=
+ kMaxVertexFormatAlignment);
// Only vertexCount() vertices will be used by the upcoming draw. so that is all we copy.
// We allocate space for firstVertex() + vertexCount() so indexing will work. If we