Fix incorrect indices being used when divisor is non-zero.
When streaming client data in the OpenGL backend, incorrect vertex data was
uploaded. The 'first' parameter should be ignored when drawing with a
non-zero divisor, even when doing non-instanced draw calls.
BUG=angleproject:1894
Change-Id: If5a9ed4683f5c64eea1436eff28b2b2f86befcf4
Reviewed-on: https://chromium-review.googlesource.com/443067
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/renderer/gl/VertexArrayGL.cpp b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
index 1fb25da..776b641 100644
--- a/src/libANGLE/renderer/gl/VertexArrayGL.cpp
+++ b/src/libANGLE/renderer/gl/VertexArrayGL.cpp
@@ -319,6 +319,10 @@
const size_t sourceStride = ComputeVertexAttributeStride(attrib);
const size_t destStride = ComputeVertexAttributeTypeSize(attrib);
+ // Vertices do not apply the 'start' offset when the divisor is non-zero even when doing
+ // a non-instanced draw call
+ const size_t firstIndex = attrib.divisor == 0 ? indexRange.start : 0;
+
const uint8_t *inputPointer = reinterpret_cast<const uint8_t *>(attrib.pointer);
// Pack the data when copying it, user could have supplied a very large stride that
@@ -326,8 +330,7 @@
if (destStride == sourceStride)
{
// Can copy in one go, the data is packed
- memcpy(bufferPointer + curBufferOffset,
- inputPointer + (sourceStride * indexRange.start),
+ memcpy(bufferPointer + curBufferOffset, inputPointer + (sourceStride * firstIndex),
destStride * streamedVertexCount);
}
else
@@ -336,14 +339,13 @@
for (size_t vertexIdx = 0; vertexIdx < streamedVertexCount; vertexIdx++)
{
uint8_t *out = bufferPointer + curBufferOffset + (destStride * vertexIdx);
- const uint8_t *in =
- inputPointer + sourceStride * (vertexIdx + indexRange.start);
+ const uint8_t *in = inputPointer + sourceStride * (vertexIdx + firstIndex);
memcpy(out, in, destStride);
}
}
// Compute where the 0-index vertex would be.
- const size_t vertexStartOffset = curBufferOffset - (indexRange.start * destStride);
+ const size_t vertexStartOffset = curBufferOffset - (firstIndex * destStride);
if (attrib.pureInteger)
{