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());