Vulkan: Support the indices offset in drawElements calls

Also fixes an issue in buffer copy synchronization.

Bug: angleproject:2645
Change-Id: Ibca7052daaf1e6fe37913c8a8216ec33c66426b6
Reviewed-on: https://chromium-review.googlesource.com/1096911
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Luc Ferron <lucferron@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index 4a72c89..0b37d30 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -40,7 +40,8 @@
       mLineLoopHelper(renderer),
       mDirtyLineLoopTranslation(true),
       mVertexBuffersDirty(false),
-      mIndexBufferDirty(false)
+      mIndexBufferDirty(false),
+      mLastIndexBufferOffset(0)
 {
     mCurrentArrayBufferHandles.fill(VK_NULL_HANDLE);
     mCurrentArrayBufferOffsets.fill(0);
@@ -493,9 +494,12 @@
                                        bool newCommandBuffer)
 {
     ANGLE_TRY(onDraw(context, renderer, drawCallParams, commandBuffer, newCommandBuffer));
+    bool isLineLoop  = drawCallParams.mode() == gl::PrimitiveMode::LineLoop;
+    uintptr_t offset = mState.getElementArrayBuffer().get() && !isLineLoop
+                           ? reinterpret_cast<uintptr_t>(drawCallParams.indices())
+                           : 0;
 
-    if (!mState.getElementArrayBuffer().get() &&
-        drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
+    if (!mState.getElementArrayBuffer().get() && !isLineLoop)
     {
         ANGLE_TRY(drawCallParams.ensureIndexRangeResolved(context));
         ANGLE_TRY(streamIndexData(renderer, drawCallParams));
@@ -503,7 +507,7 @@
                                        mCurrentElementArrayBufferOffset,
                                        gl_vk::GetIndexType(drawCallParams.type()));
     }
-    else if (mIndexBufferDirty || newCommandBuffer)
+    else if (mIndexBufferDirty || newCommandBuffer || offset != mLastIndexBufferOffset)
     {
         if (drawCallParams.type() == GL_UNSIGNED_BYTE &&
             drawCallParams.mode() != gl::PrimitiveMode::LineLoop)
@@ -515,8 +519,9 @@
         }
 
         commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle,
-                                       mCurrentElementArrayBufferOffset,
+                                       mCurrentElementArrayBufferOffset + offset,
                                        gl_vk::GetIndexType(drawCallParams.type()));
+        mLastIndexBufferOffset = offset;
 
         const gl::State &glState                  = context->getGLState();
         vk::CommandGraphResource *drawFramebuffer = vk::GetImpl(glState.getDrawFramebuffer());