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)
             {