Vulkan: Fix DynamicBuffer usages, need to use specific alignment

The alignment used to allocate VkBuffers in the VkBuffer needs to be at
least the size of the nonCoherentAtomSize defined in the limits of the
VkDevicePhysicalProperties. The latest roll of the
vulkan-validation-layers added that check and caused a bunch of errors.
This is fixing them.

Bug: angleproject:2565

Change-Id: Ia2ad506dce7966adb6220c52ea891903922c47d0
Reviewed-on: https://chromium-review.googlesource.com/1064950
Commit-Queue: Luc Ferron <lucferron@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/ContextVk.cpp b/src/libANGLE/renderer/vulkan/ContextVk.cpp
index 5fb95b9..ccc30ff 100644
--- a/src/libANGLE/renderer/vulkan/ContextVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ContextVk.cpp
@@ -675,7 +675,7 @@
 
 TextureImpl *ContextVk::createTexture(const gl::TextureState &state)
 {
-    return new TextureVk(state);
+    return new TextureVk(state, mRenderer);
 }
 
 RenderbufferImpl *ContextVk::createRenderbuffer(const gl::RenderbufferState &state)
@@ -690,7 +690,7 @@
 
 VertexArrayImpl *ContextVk::createVertexArray(const gl::VertexArrayState &state)
 {
-    return new VertexArrayVk(state);
+    return new VertexArrayVk(state, mRenderer);
 }
 
 QueryImpl *ContextVk::createQuery(gl::QueryType type)
diff --git a/src/libANGLE/renderer/vulkan/ProgramVk.cpp b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
index 2c7d52e..834eea4 100644
--- a/src/libANGLE/renderer/vulkan/ProgramVk.cpp
+++ b/src/libANGLE/renderer/vulkan/ProgramVk.cpp
@@ -348,7 +348,7 @@
             size_t minAlignment = static_cast<size_t>(
                 renderer->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment);
 
-            mDefaultUniformBlocks[shaderType].storage.init(minAlignment);
+            mDefaultUniformBlocks[shaderType].storage.init(minAlignment, renderer);
 
             // Initialize uniform buffer memory to zero by default.
             mDefaultUniformBlocks[shaderType].uniformData.fill(0);
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index 8b59e69..28b614a 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -62,11 +62,12 @@
 }  // anonymous namespace
 
 // StagingStorage implementation.
-PixelBuffer::PixelBuffer() : mStagingBuffer(kStagingBufferFlags, kStagingBufferSize)
+PixelBuffer::PixelBuffer(RendererVk *renderer)
+    : mStagingBuffer(kStagingBufferFlags, kStagingBufferSize)
 {
     // vkCmdCopyBufferToImage must have an offset that is a multiple of 4.
     // https://www.khronos.org/registry/vulkan/specs/1.0/man/html/VkBufferImageCopy.html
-    mStagingBuffer.init(4);
+    mStagingBuffer.init(4, renderer);
 }
 
 PixelBuffer::~PixelBuffer()
@@ -287,7 +288,8 @@
 PixelBuffer::SubresourceUpdate::SubresourceUpdate(const SubresourceUpdate &other) = default;
 
 // TextureVk implementation.
-TextureVk::TextureVk(const gl::TextureState &state) : TextureImpl(state)
+TextureVk::TextureVk(const gl::TextureState &state, RendererVk *renderer)
+    : TextureImpl(state), mPixelBuffer(renderer)
 {
     mRenderTarget.image     = &mImage;
     mRenderTarget.imageView = &mBaseLevelImageView;
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.h b/src/libANGLE/renderer/vulkan/TextureVk.h
index 9775504..f871633 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.h
+++ b/src/libANGLE/renderer/vulkan/TextureVk.h
@@ -21,7 +21,7 @@
 class PixelBuffer final : angle::NonCopyable
 {
   public:
-    PixelBuffer();
+    PixelBuffer(RendererVk *renderer);
     ~PixelBuffer();
 
     void release(RendererVk *renderer);
@@ -68,7 +68,7 @@
 class TextureVk : public TextureImpl, public vk::CommandGraphResource
 {
   public:
-    TextureVk(const gl::TextureState &state);
+    TextureVk(const gl::TextureState &state, RendererVk *renderer);
     ~TextureVk() override;
     gl::Error onDestroy(const gl::Context *context) override;
 
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index 16af443..f6ce42c 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -26,7 +26,7 @@
 constexpr size_t kDynamicIndexDataSize  = 1024 * 8;
 }  // anonymous namespace
 
-VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state)
+VertexArrayVk::VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer)
     : VertexArrayImpl(state),
       mCurrentArrayBufferHandles{},
       mCurrentArrayBufferOffsets{},
@@ -36,6 +36,7 @@
       mCurrentElementArrayBufferResource(nullptr),
       mDynamicVertexData(VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, kDynamicVertexDataSize),
       mDynamicIndexData(VK_BUFFER_USAGE_INDEX_BUFFER_BIT, kDynamicIndexDataSize),
+      mLineLoopHelper(renderer),
       mDirtyLineLoopTranslation(true),
       mVertexBuffersDirty(false),
       mIndexBufferDirty(false)
@@ -47,8 +48,8 @@
     mPackedInputBindings.fill({0, 0});
     mPackedInputAttributes.fill({0, 0, 0});
 
-    mDynamicVertexData.init(1);
-    mDynamicIndexData.init(1);
+    mDynamicVertexData.init(1, renderer);
+    mDynamicIndexData.init(1, renderer);
 }
 
 VertexArrayVk::~VertexArrayVk()
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.h b/src/libANGLE/renderer/vulkan/VertexArrayVk.h
index 9fe610d..b0d1db8 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.h
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.h
@@ -32,7 +32,7 @@
 class VertexArrayVk : public VertexArrayImpl
 {
   public:
-    VertexArrayVk(const gl::VertexArrayState &state);
+    VertexArrayVk(const gl::VertexArrayState &state, RendererVk *renderer);
     ~VertexArrayVk() override;
 
     void destroy(const gl::Context *context) override;
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index f8e5cd6..b838021 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -105,10 +105,12 @@
 {
 }
 
-void DynamicBuffer::init(size_t alignment)
+void DynamicBuffer::init(size_t alignment, RendererVk *renderer)
 {
     ASSERT(alignment > 0);
-    mAlignment = alignment;
+    mAlignment = std::max(
+        alignment,
+        static_cast<size_t>(renderer->getPhysicalDeviceProperties().limits.nonCoherentAtomSize));
 }
 
 DynamicBuffer::~DynamicBuffer()
@@ -351,7 +353,7 @@
 }
 
 // LineLoopHelper implementation.
-LineLoopHelper::LineLoopHelper()
+LineLoopHelper::LineLoopHelper(RendererVk *renderer)
     : mDynamicIndexBuffer(kLineLoopDynamicBufferUsage, kLineLoopDynamicBufferMinSize)
 {
     // We need to use an alignment of the maximum size we're going to allocate, which is
@@ -359,7 +361,7 @@
     // can vary in size. According to the Vulkan spec, when calling vkCmdBindIndexBuffer: 'The
     // sum of offset and the address of the range of VkDeviceMemory object that is backing buffer,
     // must be a multiple of the type indicated by indexType'.
-    mDynamicIndexBuffer.init(sizeof(uint32_t));
+    mDynamicIndexBuffer.init(sizeof(uint32_t), renderer);
 }
 
 LineLoopHelper::~LineLoopHelper() = default;
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index 75c88e4..4202023 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -35,7 +35,7 @@
     ~DynamicBuffer();
 
     // Init is called after the buffer creation so that the alignment can be specified later.
-    void init(size_t alignment);
+    void init(size_t alignment, RendererVk *renderer);
 
     bool valid();
 
@@ -129,7 +129,7 @@
 class LineLoopHelper final : public vk::CommandGraphResource
 {
   public:
-    LineLoopHelper();
+    LineLoopHelper(RendererVk *renderer);
     ~LineLoopHelper();
 
     gl::Error getIndexBufferForDrawArrays(RendererVk *renderer,