Commit c3854ebc by Jamie Madill Committed by Commit Bot

Vulkan: Clamp vertex buffer offsets.

Vulkan mandates that vertex buffer offsets are within the size of the buffer even if robust buffer access is enabled. Do a check in VertexArrayVk::syncDirtyAttrib to guard against this. Bug: angleproject:3350 Change-Id: Ia01deb9b7335dd8f632f2cf9b32d2908ba55645c Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2044491 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent ca035803
...@@ -639,8 +639,13 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk, ...@@ -639,8 +639,13 @@ angle::Result VertexArrayVk::syncDirtyAttrib(ContextVk *contextVk,
vk::BufferHelper &bufferHelper = bufferVk->getBuffer(); vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
mCurrentArrayBuffers[attribIndex] = &bufferHelper; mCurrentArrayBuffers[attribIndex] = &bufferHelper;
mCurrentArrayBufferHandles[attribIndex] = bufferHelper.getBuffer().getHandle(); mCurrentArrayBufferHandles[attribIndex] = bufferHelper.getBuffer().getHandle();
mCurrentArrayBufferOffsets[attribIndex] = binding.getOffset();
stride = binding.getStride(); // Vulkan requires the offset is within the buffer. We use robust access
// behaviour to reset the offset if it starts outside the buffer.
mCurrentArrayBufferOffsets[attribIndex] =
binding.getOffset() < bufferVk->getSize() ? binding.getOffset() : 0;
stride = binding.getStride();
} }
} }
} }
......
...@@ -1870,9 +1870,6 @@ TEST_P(RobustResourceInitTestES31, Multisample2DTextureArray) ...@@ -1870,9 +1870,6 @@ TEST_P(RobustResourceInitTestES31, Multisample2DTextureArray)
// Tests that using an out of bounds draw offset with a dynamic array succeeds. // Tests that using an out of bounds draw offset with a dynamic array succeeds.
TEST_P(RobustResourceInitTest, DynamicVertexArrayOffsetOutOfBounds) TEST_P(RobustResourceInitTest, DynamicVertexArrayOffsetOutOfBounds)
{ {
// Not implemented on Vulkan. http://anglebug.com/3350
ANGLE_SKIP_TEST_IF(IsVulkan());
ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red()); ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
glUseProgram(program); glUseProgram(program);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment