diff options
Diffstat (limited to 'chromium/third_party/angle/src/libANGLE/renderer/vulkan')
4 files changed, 15 insertions, 9 deletions
diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp index aa573fea3e3..9e6da43d370 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp +++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp @@ -343,15 +343,17 @@ gl::Error VertexArrayVk::drawArrays(const gl::Context *context, ANGLE_TRY(onDraw(context, renderer, drawCallParams, drawNode, newCommandBuffer)); + // Note: Vertex indexes can be arbitrarily large. + uint32_t clampedVertexCount = drawCallParams.getClampedVertexCount<uint32_t>(); + if (drawCallParams.mode() != GL_LINE_LOOP) { - commandBuffer->draw(drawCallParams.vertexCount(), 1, drawCallParams.firstVertex(), 0); + commandBuffer->draw(clampedVertexCount, 1, drawCallParams.firstVertex(), 0); return gl::NoError(); } // Handle GL_LINE_LOOP drawArrays. - // This test may be incorrect if the draw call switches from DrawArrays/DrawElements. - int lastVertex = drawCallParams.firstVertex() + drawCallParams.vertexCount(); + size_t lastVertex = static_cast<size_t>(drawCallParams.firstVertex() + clampedVertexCount); if (!mLineLoopBufferFirstIndex.valid() || !mLineLoopBufferLastIndex.valid() || mLineLoopBufferFirstIndex != drawCallParams.firstVertex() || mLineLoopBufferLastIndex != lastVertex) @@ -367,7 +369,7 @@ gl::Error VertexArrayVk::drawArrays(const gl::Context *context, commandBuffer->bindIndexBuffer(mCurrentElementArrayBufferHandle, mCurrentElementArrayBufferOffset, VK_INDEX_TYPE_UINT32); - vk::LineLoopHelper::Draw(drawCallParams.vertexCount(), commandBuffer); + vk::LineLoopHelper::Draw(clampedVertexCount, commandBuffer); return gl::NoError(); } diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h index fe26f730aa8..92a89a74013 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h +++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/VertexArrayVk.h @@ -120,8 +120,8 @@ class VertexArrayVk : public VertexArrayImpl vk::DynamicBuffer mDynamicIndexData; vk::LineLoopHelper mLineLoopHelper; - Optional<int> mLineLoopBufferFirstIndex; - Optional<int> mLineLoopBufferLastIndex; + Optional<GLint> mLineLoopBufferFirstIndex; + Optional<size_t> mLineLoopBufferLastIndex; bool mDirtyLineLoopTranslation; // Cache variable for determining whether or not to store new dependencies in the node. diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp index 98774fdf1f0..a7ed151dc64 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp +++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.cpp @@ -321,8 +321,11 @@ gl::Error LineLoopHelper::getIndexBufferForDrawArrays(RendererVk *renderer, &offset, nullptr)); *offsetOut = static_cast<VkDeviceSize>(offset); + uint32_t clampedVertexCount = drawCallParams.getClampedVertexCount<uint32_t>(); + + // Note: there could be an overflow in this addition. uint32_t unsignedFirstVertex = static_cast<uint32_t>(drawCallParams.firstVertex()); - uint32_t vertexCount = (drawCallParams.vertexCount() + unsignedFirstVertex); + uint32_t vertexCount = (clampedVertexCount + unsignedFirstVertex); for (uint32_t vertexIndex = unsignedFirstVertex; vertexIndex < vertexCount; vertexIndex++) { *indices++ = vertexIndex; @@ -378,9 +381,10 @@ void LineLoopHelper::destroy(VkDevice device) } // static -void LineLoopHelper::Draw(int count, CommandBuffer *commandBuffer) +void LineLoopHelper::Draw(uint32_t count, CommandBuffer *commandBuffer) { // Our first index is always 0 because that's how we set it up in createIndexBuffer*. + // Note: this could theoretically overflow and wrap to zero. commandBuffer->drawIndexed(count + 1, 1, 0, 0, 0); } diff --git a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h index 237c85c729c..dfdfe2efed1 100644 --- a/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h +++ b/chromium/third_party/angle/src/libANGLE/renderer/vulkan/vk_helpers.h @@ -130,7 +130,7 @@ class LineLoopHelper final : public vk::CommandGraphResource VkDeviceSize *bufferOffsetOut); void destroy(VkDevice device); - static void Draw(int count, CommandBuffer *commandBuffer); + static void Draw(uint32_t count, CommandBuffer *commandBuffer); private: DynamicBuffer mDynamicIndexBuffer; |