Vulkan: Add DispatchUtilsVK

This class provides a set of compute-based internal utilities.
Currently, buffer clear and copy are implemented.  Other possibilities
include more efficient mip map generation, or specialized texture
operations.

VertexArrayVk::updateIndexTranslation() is updated to convert the
GL_UNSIGNED_BYTE index buffer to a GL_UNSIGNED_SHORT one using this
class to avoid a CPU readback.

The vk::Format class is augmented with a few flags (IsInt, IsUnsigned)
to be able to select the appropriate shader based on the format (float,
int or uint).

Bug: angleproject:2958,angleproject:3003
Change-Id: Ie35519deb3c32a3da5ccf74080c70092c9287f0a
Reviewed-on: https://chromium-review.googlesource.com/c/1336307
Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/BufferVk.cpp b/src/libANGLE/renderer/vulkan/BufferVk.cpp
index f71462e..30dae1f 100644
--- a/src/libANGLE/renderer/vulkan/BufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/BufferVk.cpp
@@ -51,8 +51,9 @@
         // We could potentially use multiple backing buffers for different usages.
         // For now keep a single buffer with all relevant usage flags.
         const VkImageUsageFlags usageFlags =
-            (VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
-             VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT);
+            VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
+            VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT |
+            VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
 
         VkBufferCreateInfo createInfo    = {};
         createInfo.sType                 = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@@ -63,7 +64,7 @@
         createInfo.queueFamilyIndexCount = 0;
         createInfo.pQueueFamilyIndices   = nullptr;
 
-        // Assume host vislble/coherent memory available.
+        // Assume host visible/coherent memory available.
         const VkMemoryPropertyFlags memoryPropertyFlags =
             (VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
 
diff --git a/src/libANGLE/renderer/vulkan/DispatchUtilsVk.cpp b/src/libANGLE/renderer/vulkan/DispatchUtilsVk.cpp
new file mode 100644
index 0000000..9929930
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/DispatchUtilsVk.cpp
@@ -0,0 +1,272 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// DispatchUtilsVk.cpp:
+//    Implements the DispatchUtilsVk class.
+//
+
+#include "libANGLE/renderer/vulkan/DispatchUtilsVk.h"
+
+#include "libANGLE/renderer/vulkan/BufferVk.h"
+#include "libANGLE/renderer/vulkan/FramebufferVk.h"
+#include "libANGLE/renderer/vulkan/RendererVk.h"
+#include "libANGLE/renderer/vulkan/TextureVk.h"
+
+namespace rx
+{
+
+namespace BufferUtils_comp = vk::InternalShader::BufferUtils_comp;
+
+namespace
+{
+// All internal shaders assume there is only one descriptor set, indexed at 0
+constexpr uint32_t kSetIndex = 0;
+
+constexpr uint32_t kClearOutputBinding     = 0;
+constexpr uint32_t kCopyDestinationBinding = 0;
+constexpr uint32_t kCopySourceBinding      = 1;
+
+uint32_t GetBufferUtilsFlags(size_t dispatchSize, const vk::Format &format)
+{
+    uint32_t flags                    = dispatchSize % 64 == 0 ? BufferUtils_comp::kIsAligned : 0;
+    const angle::Format &bufferFormat = format.bufferFormat();
+
+    flags |= bufferFormat.componentType == GL_INT
+                 ? BufferUtils_comp::kIsInt
+                 : bufferFormat.componentType == GL_UNSIGNED_INT ? BufferUtils_comp::kIsUint
+                                                                 : BufferUtils_comp::kIsFloat;
+
+    return flags;
+}
+}  // namespace
+
+DispatchUtilsVk::DispatchUtilsVk() = default;
+
+DispatchUtilsVk::~DispatchUtilsVk() = default;
+
+void DispatchUtilsVk::destroy(VkDevice device)
+{
+    for (Function f : angle::AllEnums<Function>())
+    {
+        for (auto &descriptorSetLayout : mDescriptorSetLayouts[f])
+        {
+            descriptorSetLayout.reset();
+        }
+        mPipelineLayouts[f].reset();
+        mDescriptorPools[f].destroy(device);
+    }
+
+    for (vk::ShaderProgramHelper &program : mPrograms)
+    {
+        program.destroy(device);
+    }
+}
+
+angle::Result DispatchUtilsVk::ensureResourcesInitialized(vk::Context *context,
+                                                          Function function,
+                                                          VkDescriptorPoolSize *setSizes,
+                                                          size_t setSizesCount)
+{
+    RendererVk *renderer = context->getRenderer();
+
+    vk::DescriptorSetLayoutDesc descriptorSetDesc;
+
+    uint32_t currentBinding = 0;
+    for (size_t i = 0; i < setSizesCount; ++i)
+    {
+        descriptorSetDesc.update(currentBinding, setSizes[i].type, setSizes[i].descriptorCount);
+        currentBinding += setSizes[i].descriptorCount;
+    }
+
+    ANGLE_TRY(renderer->getDescriptorSetLayout(context, descriptorSetDesc,
+                                               &mDescriptorSetLayouts[function][kSetIndex]));
+
+    // Corresponding pipeline layouts:
+    vk::PipelineLayoutDesc pipelineLayoutDesc;
+
+    pipelineLayoutDesc.updateDescriptorSetLayout(kSetIndex, descriptorSetDesc);
+    pipelineLayoutDesc.updatePushConstantRange(gl::ShaderType::Compute, 0, sizeof(ShaderParams));
+
+    ANGLE_TRY(renderer->getPipelineLayout(
+        context, pipelineLayoutDesc, mDescriptorSetLayouts[function], &mPipelineLayouts[function]));
+
+    ANGLE_TRY(mDescriptorPools[function].init(context, setSizes, setSizesCount));
+
+    return angle::Result::Continue();
+}
+
+angle::Result DispatchUtilsVk::ensureBufferClearInitialized(vk::Context *context)
+{
+    if (mPipelineLayouts[Function::BufferClear].valid())
+    {
+        return angle::Result::Continue();
+    }
+
+    VkDescriptorPoolSize setSizes[1] = {
+        {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1},
+    };
+
+    return ensureResourcesInitialized(context, Function::BufferClear, setSizes,
+                                      ArraySize(setSizes));
+}
+
+angle::Result DispatchUtilsVk::ensureBufferCopyInitialized(vk::Context *context)
+{
+    if (mPipelineLayouts[Function::BufferCopy].valid())
+    {
+        return angle::Result::Continue();
+    }
+
+    VkDescriptorPoolSize setSizes[2] = {
+        {VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1},
+        {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, 1},
+    };
+
+    return ensureResourcesInitialized(context, Function::BufferCopy, setSizes, ArraySize(setSizes));
+}
+
+angle::Result DispatchUtilsVk::setupProgram(vk::Context *context,
+                                            uint32_t function,
+                                            const VkDescriptorSet &descriptorSet,
+                                            const ShaderParams &params,
+                                            vk::CommandBuffer *commandBuffer)
+{
+    RendererVk *renderer             = context->getRenderer();
+    vk::ShaderLibrary &shaderLibrary = renderer->getShaderLibrary();
+
+    vk::RefCounted<vk::ShaderAndSerial> *shader = nullptr;
+    ANGLE_TRY(shaderLibrary.getBufferUtils_comp(context, function, &shader));
+
+    mPrograms[function].setShader(gl::ShaderType::Compute, shader);
+
+    bool isClear = (function & BufferUtils_comp::kFunctionMask) == BufferUtils_comp::kIsClear;
+    Function pipelineLayoutIndex = isClear ? Function::BufferClear : Function::BufferCopy;
+    const vk::BindingPointer<vk::PipelineLayout> &pipelineLayout =
+        mPipelineLayouts[pipelineLayoutIndex];
+
+    vk::PipelineAndSerial *pipelineAndSerial;
+    ANGLE_TRY(
+        mPrograms[function].getComputePipeline(context, pipelineLayout.get(), &pipelineAndSerial));
+
+    commandBuffer->bindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE, pipelineAndSerial->get());
+    pipelineAndSerial->updateSerial(renderer->getCurrentQueueSerial());
+
+    commandBuffer->bindDescriptorSets(VK_PIPELINE_BIND_POINT_COMPUTE, pipelineLayout.get(), 0, 1,
+                                      &descriptorSet, 0, nullptr);
+    commandBuffer->pushConstants(pipelineLayout.get(), VK_SHADER_STAGE_COMPUTE_BIT, 0,
+                                 sizeof(params), &params);
+
+    return angle::Result::Continue();
+}
+
+angle::Result DispatchUtilsVk::clearBuffer(vk::Context *context,
+                                           vk::BufferHelper *dest,
+                                           const ClearParameters &params)
+{
+    ANGLE_TRY(ensureBufferClearInitialized(context));
+
+    vk::CommandBuffer *commandBuffer;
+    ANGLE_TRY(dest->recordCommands(context, &commandBuffer));
+
+    // Tell dest it's being written to.
+    dest->onWrite(VK_ACCESS_SHADER_WRITE_BIT);
+
+    const vk::Format &destFormat = dest->getViewFormat();
+
+    uint32_t function = BufferUtils_comp::kIsClear | GetBufferUtilsFlags(params.size, destFormat);
+
+    ShaderParams shaderParams;
+    shaderParams.destOffset = params.offset;
+    shaderParams.size       = params.size;
+    shaderParams.clearValue = params.clearValue;
+
+    VkDescriptorSet descriptorSet;
+    vk::SharedDescriptorPoolBinding descriptorPoolBinding;
+    ANGLE_TRY(mDescriptorPools[Function::BufferClear].allocateSets(
+        context, mDescriptorSetLayouts[Function::BufferClear][kSetIndex].get().ptr(), 1,
+        &descriptorPoolBinding, &descriptorSet));
+
+    VkWriteDescriptorSet writeInfo = {};
+
+    writeInfo.sType            = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+    writeInfo.dstSet           = descriptorSet;
+    writeInfo.dstBinding       = kClearOutputBinding;
+    writeInfo.descriptorCount  = 1;
+    writeInfo.descriptorType   = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
+    writeInfo.pTexelBufferView = dest->getBufferView().ptr();
+
+    vkUpdateDescriptorSets(context->getDevice(), 1, &writeInfo, 0, nullptr);
+
+    ANGLE_TRY(setupProgram(context, function, descriptorSet, shaderParams, commandBuffer));
+
+    commandBuffer->dispatch(UnsignedCeilDivide(params.size, 64), 1, 1);
+
+    descriptorPoolBinding.reset();
+
+    return angle::Result::Continue();
+}
+
+angle::Result DispatchUtilsVk::copyBuffer(vk::Context *context,
+                                          vk::BufferHelper *dest,
+                                          vk::BufferHelper *src,
+                                          const CopyParameters &params)
+{
+    ANGLE_TRY(ensureBufferCopyInitialized(context));
+
+    vk::CommandBuffer *commandBuffer;
+    ANGLE_TRY(dest->recordCommands(context, &commandBuffer));
+
+    // Tell src we are going to read from it.
+    src->onRead(dest, VK_ACCESS_SHADER_READ_BIT);
+    // Tell dest it's being written to.
+    dest->onWrite(VK_ACCESS_SHADER_WRITE_BIT);
+
+    const vk::Format &destFormat = dest->getViewFormat();
+    const vk::Format &srcFormat  = src->getViewFormat();
+
+    ASSERT(destFormat.vkFormatIsInt == srcFormat.vkFormatIsInt);
+    ASSERT(destFormat.vkFormatIsUnsigned == srcFormat.vkFormatIsUnsigned);
+
+    uint32_t function = BufferUtils_comp::kIsCopy | GetBufferUtilsFlags(params.size, destFormat);
+
+    ShaderParams shaderParams;
+    shaderParams.destOffset = params.destOffset;
+    shaderParams.size       = params.size;
+    shaderParams.srcOffset  = params.srcOffset;
+
+    VkDescriptorSet descriptorSet;
+    vk::SharedDescriptorPoolBinding descriptorPoolBinding;
+    ANGLE_TRY(mDescriptorPools[Function::BufferCopy].allocateSets(
+        context, mDescriptorSetLayouts[Function::BufferCopy][kSetIndex].get().ptr(), 1,
+        &descriptorPoolBinding, &descriptorSet));
+
+    VkWriteDescriptorSet writeInfo[2] = {};
+
+    writeInfo[0].sType            = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+    writeInfo[0].dstSet           = descriptorSet;
+    writeInfo[0].dstBinding       = kCopyDestinationBinding;
+    writeInfo[0].descriptorCount  = 1;
+    writeInfo[0].descriptorType   = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
+    writeInfo[0].pTexelBufferView = dest->getBufferView().ptr();
+
+    writeInfo[1].sType            = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
+    writeInfo[1].dstSet           = descriptorSet;
+    writeInfo[1].dstBinding       = kCopySourceBinding;
+    writeInfo[1].descriptorCount  = 1;
+    writeInfo[1].descriptorType   = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
+    writeInfo[1].pTexelBufferView = src->getBufferView().ptr();
+
+    vkUpdateDescriptorSets(context->getDevice(), 2, writeInfo, 0, nullptr);
+
+    ANGLE_TRY(setupProgram(context, function, descriptorSet, shaderParams, commandBuffer));
+
+    commandBuffer->dispatch(UnsignedCeilDivide(params.size, 64), 1, 1);
+
+    descriptorPoolBinding.reset();
+
+    return angle::Result::Continue();
+}
+
+}  // namespace rx
diff --git a/src/libANGLE/renderer/vulkan/DispatchUtilsVk.h b/src/libANGLE/renderer/vulkan/DispatchUtilsVk.h
new file mode 100644
index 0000000..24ca973
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/DispatchUtilsVk.h
@@ -0,0 +1,115 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// DispatchUtilsVk.h:
+//    Defines the DispatchUtilsVk class, a helper for various internal dispatch utilities such as
+//    buffer clear and copy, texture mip map generation, etc.
+//
+//    - Buffer clear: Implemented, but no current users
+//    - Buffer copy:
+//      * Used by VertexArrayVk::updateIndexTranslation() to convert a ubyte index array to ushort
+//    - Mipmap generation: Not yet implemented
+//
+
+#ifndef LIBANGLE_RENDERER_VULKAN_DISPATCHUTILSVK_H_
+#define LIBANGLE_RENDERER_VULKAN_DISPATCHUTILSVK_H_
+
+#include "libANGLE/renderer/vulkan/vk_cache_utils.h"
+#include "libANGLE/renderer/vulkan/vk_helpers.h"
+#include "libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h"
+
+namespace rx
+{
+
+class BufferVk;
+class RendererVk;
+
+class DispatchUtilsVk : angle::NonCopyable
+{
+  public:
+    DispatchUtilsVk();
+    ~DispatchUtilsVk();
+
+    void destroy(VkDevice device);
+
+    struct ClearParameters
+    {
+        VkClearColorValue clearValue;
+        size_t offset;
+        size_t size;
+    };
+
+    struct CopyParameters
+    {
+        size_t destOffset;
+        size_t srcOffset;
+        size_t size;
+    };
+
+    angle::Result clearBuffer(vk::Context *context,
+                              vk::BufferHelper *dest,
+                              const ClearParameters &params);
+    angle::Result copyBuffer(vk::Context *context,
+                             vk::BufferHelper *dest,
+                             vk::BufferHelper *src,
+                             const CopyParameters &params);
+
+  private:
+    struct ShaderParams
+    {
+        // Structure matching PushConstants in BufferUtils.comp
+        uint32_t destOffset          = 0;
+        uint32_t size                = 0;
+        uint32_t srcOffset           = 0;
+        uint32_t padding             = 0;
+        VkClearColorValue clearValue = {};
+    };
+
+    // Common function that creates the pipeline for the specified function, binds it and prepares
+    // the dispatch call. The possible values of `function` comes from
+    // vk::InternalShader::BufferUtils_comp defined in vk_internal_shaders_autogen.h
+    angle::Result setupProgram(vk::Context *context,
+                               uint32_t function,
+                               const VkDescriptorSet &descriptorSet,
+                               const ShaderParams &params,
+                               vk::CommandBuffer *commandBuffer);
+
+    // Functions implemented by the class:
+    enum class Function
+    {
+        BufferClear = 0,
+        BufferCopy  = 1,
+
+        InvalidEnum = 2,
+        EnumCount   = 2,
+    };
+
+    // Initializes descriptor set layout, pipeline layout and descriptor pool corresponding to given
+    // function, if not already initialized.  Uses setSizes to create the layout.  For example, if
+    // this array has two entries {STORAGE_TEXEL_BUFFER, 1} and {UNIFORM_TEXEL_BUFFER, 3}, then the
+    // created set layout would be binding 0 for storage texel buffer and bindings 1 through 3 for
+    // uniform texel buffer.  All resources are put in set 0.
+    angle::Result ensureResourcesInitialized(vk::Context *context,
+                                             Function function,
+                                             VkDescriptorPoolSize *setSizes,
+                                             size_t setSizesCount);
+
+    // Initializers corresponding to functions, calling into ensureResourcesInitialized with the
+    // appropriate parameters.
+    angle::Result ensureBufferClearInitialized(vk::Context *context);
+    angle::Result ensureBufferCopyInitialized(vk::Context *context);
+
+    angle::PackedEnumMap<Function, vk::DescriptorSetLayoutPointerArray> mDescriptorSetLayouts;
+    angle::PackedEnumMap<Function, vk::BindingPointer<vk::PipelineLayout>> mPipelineLayouts;
+    angle::PackedEnumMap<Function, vk::DynamicDescriptorPool> mDescriptorPools;
+
+    vk::ShaderProgramHelper mPrograms[vk::InternalShader::BufferUtils_comp::kFlagsMask |
+                                      vk::InternalShader::BufferUtils_comp::kFunctionMask |
+                                      vk::InternalShader::BufferUtils_comp::kFormatMask];
+};
+
+}  // namespace rx
+
+#endif  // LIBANGLE_RENDERER_VULKAN_DISPATCHUTILSVK_H_
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp
index b2a7e48..7ae8a90 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -330,6 +330,8 @@
         (void)finish(context);
     }
 
+    mDispatchUtils.destroy(mDevice);
+
     mPipelineLayoutCache.destroy(mDevice);
     mDescriptorSetLayoutCache.destroy(mDevice);
 
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.h b/src/libANGLE/renderer/vulkan/RendererVk.h
index 899593b..ce8b11d 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.h
+++ b/src/libANGLE/renderer/vulkan/RendererVk.h
@@ -17,6 +17,7 @@
 #include "libANGLE/BlobCache.h"
 #include "libANGLE/Caps.h"
 #include "libANGLE/renderer/vulkan/CommandGraph.h"
+#include "libANGLE/renderer/vulkan/DispatchUtilsVk.h"
 #include "libANGLE/renderer/vulkan/QueryVk.h"
 #include "libANGLE/renderer/vulkan/vk_format_utils.h"
 #include "libANGLE/renderer/vulkan/vk_helpers.h"
@@ -160,8 +161,10 @@
     // Issues a new serial for linked shader modules. Used in the pipeline cache.
     Serial issueShaderSerial();
 
+    vk::ShaderLibrary &getShaderLibrary() { return mShaderLibrary; }
     angle::Result getFullScreenClearShaderProgram(vk::Context *context,
                                                   vk::ShaderProgramHelper **programOut);
+    DispatchUtilsVk *getDispatchUtils() { return &mDispatchUtils; }
     const angle::FeaturesVk &getFeatures() const { return mFeatures; }
 
     angle::Result getTimestamp(vk::Context *context, uint64_t *timestampOut);
@@ -313,6 +316,7 @@
     // Internal shader library.
     vk::ShaderLibrary mShaderLibrary;
     vk::ShaderProgramHelper mFullScreenClearShaderProgram;
+    DispatchUtilsVk mDispatchUtils;
 
     // The GpuEventQuery struct holds together a timestamp query and enough data to create a
     // trace event based on that. Use traceGpuEvent to insert such queries.  They will be readback
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index 2b2c61f..e032b1b 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -23,13 +23,15 @@
 {
 namespace
 {
-constexpr size_t kDynamicVertexDataSize    = 1024 * 1024;
-constexpr size_t kDynamicIndexDataSize     = 1024 * 8;
-constexpr size_t kMaxVertexFormatAlignment = 4;
-constexpr VkBufferUsageFlags kVertexBufferUsageFlags =
-    VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
-constexpr VkBufferUsageFlags kIndexBufferUsageFlags =
-    VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
+constexpr size_t kDynamicVertexDataSize              = 1024 * 1024;
+constexpr size_t kDynamicIndexDataSize               = 1024 * 8;
+constexpr size_t kMaxVertexFormatAlignment           = 4;
+constexpr VkBufferUsageFlags kVertexBufferUsageFlags = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |
+                                                       VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
+                                                       VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
+constexpr VkBufferUsageFlags kIndexBufferUsageFlags = VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
+                                                      VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT |
+                                                      VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
 
 bool BindingIsAligned(const gl::VertexBinding &binding, unsigned componentSize)
 {
@@ -176,7 +178,6 @@
                                                  const gl::VertexBinding &binding,
                                                  size_t attribIndex)
 {
-
     // Needed before reading buffer or we could get stale data.
     ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
 
@@ -557,16 +558,60 @@
 {
     ASSERT(type != gl::DrawElementsType::InvalidEnum);
 
+    RendererVk *renderer = contextVk->getRenderer();
     gl::Buffer *glBuffer = mState.getElementArrayBuffer();
 
     if (!glBuffer)
     {
         ANGLE_TRY(streamIndexData(contextVk, type, indexCount, indices, &mDynamicIndexData));
     }
+    else if (renderer->getFormat(angle::FormatID::R16_UINT).vkSupportsStorageBuffer)
+    {
+        BufferVk *bufferVk = vk::GetImpl(glBuffer);
+
+        ASSERT(type == gl::DrawElementsType::UnsignedByte);
+
+        intptr_t offsetIntoSrcData = reinterpret_cast<intptr_t>(indices);
+        size_t srcDataSize         = static_cast<size_t>(bufferVk->getSize()) - offsetIntoSrcData;
+
+        mTranslatedByteIndexData.releaseRetainedBuffers(renderer);
+
+        ANGLE_TRY(mTranslatedByteIndexData.allocate(contextVk, sizeof(GLushort) * srcDataSize,
+                                                    nullptr, nullptr,
+                                                    &mCurrentElementArrayBufferOffset, nullptr));
+        mCurrentElementArrayBuffer = mTranslatedByteIndexData.getCurrentBuffer();
+
+        vk::BufferHelper *dest = mTranslatedByteIndexData.getCurrentBuffer();
+        vk::BufferHelper *src  = &bufferVk->getBuffer();
+
+        ANGLE_TRY(src->initBufferView(contextVk, renderer->getFormat(angle::FormatID::R8_UINT)));
+        ANGLE_TRY(dest->initBufferView(contextVk, renderer->getFormat(angle::FormatID::R16_UINT)));
+
+        // Copy relevant section of the source into destination at allocated offset.  Note that the
+        // offset returned by allocate() above is in bytes, while our allocated array is of
+        // GLushorts.
+        DispatchUtilsVk::CopyParameters params = {};
+        params.destOffset =
+            static_cast<size_t>(mCurrentElementArrayBufferOffset) / sizeof(GLushort);
+        params.srcOffset = offsetIntoSrcData;
+        params.size      = srcDataSize;
+
+        // Note: this is a copy, which implicitly converts between formats.  Once support for
+        // primitive restart is added, a specialized shader is likely needed to special case 0xFF ->
+        // 0xFFFF.
+        ANGLE_TRY(renderer->getDispatchUtils()->copyBuffer(contextVk, dest, src, params));
+    }
     else
     {
+        // If it's not possible to convert the buffer with compute, opt for a CPU read back for now.
+        // TODO(syoussefi): R8G8B8A8_UINT is required to have storage texel buffer support, so a
+        // specialized shader code can be made to read two ubyte indices and output them in R and B
+        // (or A and G based on endianness?) with 0 on the other channels.  If specialized, we might
+        // as well support the ubyte to ushort case with correct handling of primitive restart.
+        // http://anglebug.com/3003
+
         // Needed before reading buffer or we could get stale data.
-        ANGLE_TRY(contextVk->getRenderer()->finish(contextVk));
+        ANGLE_TRY(renderer->finish(contextVk));
 
         ASSERT(type == gl::DrawElementsType::UnsignedByte);
         // Unsigned bytes don't have direct support in Vulkan so we have to expand the
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc
new file mode 100644
index 0000000..e56d0ac
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc
@@ -0,0 +1,91 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000000[] = {
+	0x07230203,0x00010000,0x00080007,0x0000003d,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
+	0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000009,
+	0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,0x00030003,0x00000002,
+	0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00080005,0x00000009,0x475f6c67,
+	0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,0x00000010,0x68737550,
+	0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000010,0x00000000,0x74736564,0x7366664f,
+	0x00007465,0x00050006,0x00000010,0x00000001,0x657a6973,0x00000000,0x00060006,0x00000010,
+	0x00000002,0x4f637273,0x65736666,0x00000074,0x00050006,0x00000010,0x00000003,0x64646170,
+	0x00676e69,0x00060006,0x00000010,0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,
+	0x00000012,0x61726170,0x0000736d,0x00050005,0x0000001e,0x74736564,0x65646e49,0x00000078,
+	0x00050005,0x00000026,0x49637273,0x7865646e,0x00000000,0x00050005,0x0000002f,0x56637273,
+	0x65756c61,0x00000000,0x00040005,0x00000036,0x74736564,0x00000000,0x00040047,0x00000009,
+	0x0000000b,0x0000001c,0x00050048,0x00000010,0x00000000,0x00000023,0x00000000,0x00050048,
+	0x00000010,0x00000001,0x00000023,0x00000004,0x00050048,0x00000010,0x00000002,0x00000023,
+	0x00000008,0x00050048,0x00000010,0x00000003,0x00000023,0x0000000c,0x00050048,0x00000010,
+	0x00000004,0x00000023,0x00000010,0x00030047,0x00000010,0x00000002,0x00040047,0x00000036,
+	0x00000022,0x00000000,0x00040047,0x00000036,0x00000021,0x00000000,0x00030047,0x00000036,
+	0x00000019,0x00040047,0x0000003c,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,
+	0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000000,0x00040017,0x00000007,
+	0x00000006,0x00000003,0x00040020,0x00000008,0x00000001,0x00000007,0x0004003b,0x00000008,
+	0x00000009,0x00000001,0x0004002b,0x00000006,0x0000000a,0x00000000,0x00040020,0x0000000b,
+	0x00000001,0x00000006,0x00030016,0x0000000e,0x00000020,0x00040017,0x0000000f,0x0000000e,
+	0x00000004,0x0007001e,0x00000010,0x00000006,0x00000006,0x00000006,0x00000006,0x0000000f,
+	0x00040020,0x00000011,0x00000009,0x00000010,0x0004003b,0x00000011,0x00000012,0x00000009,
+	0x00040015,0x00000013,0x00000020,0x00000001,0x0004002b,0x00000013,0x00000014,0x00000001,
+	0x00040020,0x00000015,0x00000009,0x00000006,0x00020014,0x00000018,0x00040020,0x0000001d,
+	0x00000007,0x00000013,0x0004002b,0x00000013,0x0000001f,0x00000000,0x0004002b,0x00000013,
+	0x00000027,0x00000002,0x00040020,0x0000002e,0x00000007,0x0000000f,0x0004002b,0x00000013,
+	0x00000030,0x00000004,0x00040020,0x00000031,0x00000009,0x0000000f,0x00090019,0x00000034,
+	0x0000000e,0x00000005,0x00000000,0x00000000,0x00000000,0x00000002,0x00000001,0x00040020,
+	0x00000035,0x00000000,0x00000034,0x0004003b,0x00000035,0x00000036,0x00000000,0x0004002b,
+	0x00000006,0x0000003a,0x00000040,0x0004002b,0x00000006,0x0000003b,0x00000001,0x0006002c,
+	0x00000007,0x0000003c,0x0000003a,0x0000003b,0x0000003b,0x00050036,0x00000002,0x00000004,
+	0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x0000001d,0x0000001e,0x00000007,
+	0x0004003b,0x0000001d,0x00000026,0x00000007,0x0004003b,0x0000002e,0x0000002f,0x00000007,
+	0x00050041,0x0000000b,0x0000000c,0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000000d,
+	0x0000000c,0x00050041,0x00000015,0x00000016,0x00000012,0x00000014,0x0004003d,0x00000006,
+	0x00000017,0x00000016,0x000500ae,0x00000018,0x00000019,0x0000000d,0x00000017,0x000300f7,
+	0x0000001b,0x00000000,0x000400fa,0x00000019,0x0000001a,0x0000001b,0x000200f8,0x0000001a,
+	0x000100fd,0x000200f8,0x0000001b,0x00050041,0x00000015,0x00000020,0x00000012,0x0000001f,
+	0x0004003d,0x00000006,0x00000021,0x00000020,0x00050041,0x0000000b,0x00000022,0x00000009,
+	0x0000000a,0x0004003d,0x00000006,0x00000023,0x00000022,0x00050080,0x00000006,0x00000024,
+	0x00000021,0x00000023,0x0004007c,0x00000013,0x00000025,0x00000024,0x0003003e,0x0000001e,
+	0x00000025,0x00050041,0x00000015,0x00000028,0x00000012,0x00000027,0x0004003d,0x00000006,
+	0x00000029,0x00000028,0x00050041,0x0000000b,0x0000002a,0x00000009,0x0000000a,0x0004003d,
+	0x00000006,0x0000002b,0x0000002a,0x00050080,0x00000006,0x0000002c,0x00000029,0x0000002b,
+	0x0004007c,0x00000013,0x0000002d,0x0000002c,0x0003003e,0x00000026,0x0000002d,0x00050041,
+	0x00000031,0x00000032,0x00000012,0x00000030,0x0004003d,0x0000000f,0x00000033,0x00000032,
+	0x0003003e,0x0000002f,0x00000033,0x0004003d,0x00000034,0x00000037,0x00000036,0x0004003d,
+	0x00000013,0x00000038,0x0000001e,0x0004003d,0x0000000f,0x00000039,0x0000002f,0x00040063,
+	0x00000037,0x00000038,0x00000039,0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32f)uniform writeonly imageBuffer dest;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        vec4 clearValue;
+} params;
+
+void main()
+{
+
+    if(gl_GlobalInvocationID . x >= params . size)
+        return;
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        vec4 srcValue = params . clearValue;
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc
new file mode 100644
index 0000000..ab526c0
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc
@@ -0,0 +1,83 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000001[] = {
+	0x07230203,0x00010000,0x00080007,0x00000033,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
+	0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000015,
+	0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,0x00030003,0x00000002,
+	0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000008,0x74736564,
+	0x65646e49,0x00000078,0x00060005,0x0000000c,0x68737550,0x736e6f43,0x746e6174,0x00000073,
+	0x00060006,0x0000000c,0x00000000,0x74736564,0x7366664f,0x00007465,0x00050006,0x0000000c,
+	0x00000001,0x657a6973,0x00000000,0x00060006,0x0000000c,0x00000002,0x4f637273,0x65736666,
+	0x00000074,0x00050006,0x0000000c,0x00000003,0x64646170,0x00676e69,0x00060006,0x0000000c,
+	0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,0x0000000e,0x61726170,0x0000736d,
+	0x00080005,0x00000015,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,
+	0x00050005,0x0000001c,0x49637273,0x7865646e,0x00000000,0x00050005,0x00000025,0x56637273,
+	0x65756c61,0x00000000,0x00040005,0x0000002c,0x74736564,0x00000000,0x00050048,0x0000000c,
+	0x00000000,0x00000023,0x00000000,0x00050048,0x0000000c,0x00000001,0x00000023,0x00000004,
+	0x00050048,0x0000000c,0x00000002,0x00000023,0x00000008,0x00050048,0x0000000c,0x00000003,
+	0x00000023,0x0000000c,0x00050048,0x0000000c,0x00000004,0x00000023,0x00000010,0x00030047,
+	0x0000000c,0x00000002,0x00040047,0x00000015,0x0000000b,0x0000001c,0x00040047,0x0000002c,
+	0x00000022,0x00000000,0x00040047,0x0000002c,0x00000021,0x00000000,0x00030047,0x0000002c,
+	0x00000019,0x00040047,0x00000032,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,
+	0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,
+	0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000,0x00030016,0x0000000a,
+	0x00000020,0x00040017,0x0000000b,0x0000000a,0x00000004,0x0007001e,0x0000000c,0x00000009,
+	0x00000009,0x00000009,0x00000009,0x0000000b,0x00040020,0x0000000d,0x00000009,0x0000000c,
+	0x0004003b,0x0000000d,0x0000000e,0x00000009,0x0004002b,0x00000006,0x0000000f,0x00000000,
+	0x00040020,0x00000010,0x00000009,0x00000009,0x00040017,0x00000013,0x00000009,0x00000003,
+	0x00040020,0x00000014,0x00000001,0x00000013,0x0004003b,0x00000014,0x00000015,0x00000001,
+	0x0004002b,0x00000009,0x00000016,0x00000000,0x00040020,0x00000017,0x00000001,0x00000009,
+	0x0004002b,0x00000006,0x0000001d,0x00000002,0x00040020,0x00000024,0x00000007,0x0000000b,
+	0x0004002b,0x00000006,0x00000026,0x00000004,0x00040020,0x00000027,0x00000009,0x0000000b,
+	0x00090019,0x0000002a,0x0000000a,0x00000005,0x00000000,0x00000000,0x00000000,0x00000002,
+	0x00000001,0x00040020,0x0000002b,0x00000000,0x0000002a,0x0004003b,0x0000002b,0x0000002c,
+	0x00000000,0x0004002b,0x00000009,0x00000030,0x00000040,0x0004002b,0x00000009,0x00000031,
+	0x00000001,0x0006002c,0x00000013,0x00000032,0x00000030,0x00000031,0x00000031,0x00050036,
+	0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,
+	0x00000008,0x00000007,0x0004003b,0x00000007,0x0000001c,0x00000007,0x0004003b,0x00000024,
+	0x00000025,0x00000007,0x00050041,0x00000010,0x00000011,0x0000000e,0x0000000f,0x0004003d,
+	0x00000009,0x00000012,0x00000011,0x00050041,0x00000017,0x00000018,0x00000015,0x00000016,
+	0x0004003d,0x00000009,0x00000019,0x00000018,0x00050080,0x00000009,0x0000001a,0x00000012,
+	0x00000019,0x0004007c,0x00000006,0x0000001b,0x0000001a,0x0003003e,0x00000008,0x0000001b,
+	0x00050041,0x00000010,0x0000001e,0x0000000e,0x0000001d,0x0004003d,0x00000009,0x0000001f,
+	0x0000001e,0x00050041,0x00000017,0x00000020,0x00000015,0x00000016,0x0004003d,0x00000009,
+	0x00000021,0x00000020,0x00050080,0x00000009,0x00000022,0x0000001f,0x00000021,0x0004007c,
+	0x00000006,0x00000023,0x00000022,0x0003003e,0x0000001c,0x00000023,0x00050041,0x00000027,
+	0x00000028,0x0000000e,0x00000026,0x0004003d,0x0000000b,0x00000029,0x00000028,0x0003003e,
+	0x00000025,0x00000029,0x0004003d,0x0000002a,0x0000002d,0x0000002c,0x0004003d,0x00000006,
+	0x0000002e,0x00000008,0x0004003d,0x0000000b,0x0000002f,0x00000025,0x00040063,0x0000002d,
+	0x0000002e,0x0000002f,0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32f)uniform writeonly imageBuffer dest;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        vec4 clearValue;
+} params;
+
+void main()
+{
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        vec4 srcValue = params . clearValue;
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc
new file mode 100644
index 0000000..6f9c01e
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc
@@ -0,0 +1,97 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000002[] = {
+	0x07230203,0x00010000,0x00080007,0x00000041,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002e,0x00020011,0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,
+	0x00000000,0x0003000e,0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,
+	0x00000000,0x00000009,0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,
+	0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00080005,
+	0x00000009,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,
+	0x00000010,0x68737550,0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000010,0x00000000,
+	0x74736564,0x7366664f,0x00007465,0x00050006,0x00000010,0x00000001,0x657a6973,0x00000000,
+	0x00060006,0x00000010,0x00000002,0x4f637273,0x65736666,0x00000074,0x00050006,0x00000010,
+	0x00000003,0x64646170,0x00676e69,0x00060006,0x00000010,0x00000004,0x61656c63,0x6c615672,
+	0x00006575,0x00040005,0x00000012,0x61726170,0x0000736d,0x00050005,0x0000001e,0x74736564,
+	0x65646e49,0x00000078,0x00050005,0x00000026,0x49637273,0x7865646e,0x00000000,0x00050005,
+	0x0000002f,0x56637273,0x65756c61,0x00000000,0x00030005,0x00000033,0x00637273,0x00040005,
+	0x0000003a,0x74736564,0x00000000,0x00040047,0x00000009,0x0000000b,0x0000001c,0x00050048,
+	0x00000010,0x00000000,0x00000023,0x00000000,0x00050048,0x00000010,0x00000001,0x00000023,
+	0x00000004,0x00050048,0x00000010,0x00000002,0x00000023,0x00000008,0x00050048,0x00000010,
+	0x00000003,0x00000023,0x0000000c,0x00050048,0x00000010,0x00000004,0x00000023,0x00000010,
+	0x00030047,0x00000010,0x00000002,0x00040047,0x00000033,0x00000022,0x00000000,0x00040047,
+	0x00000033,0x00000021,0x00000001,0x00040047,0x0000003a,0x00000022,0x00000000,0x00040047,
+	0x0000003a,0x00000021,0x00000000,0x00030047,0x0000003a,0x00000019,0x00040047,0x00000040,
+	0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
+	0x00000006,0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000003,0x00040020,
+	0x00000008,0x00000001,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000001,0x0004002b,
+	0x00000006,0x0000000a,0x00000000,0x00040020,0x0000000b,0x00000001,0x00000006,0x00030016,
+	0x0000000e,0x00000020,0x00040017,0x0000000f,0x0000000e,0x00000004,0x0007001e,0x00000010,
+	0x00000006,0x00000006,0x00000006,0x00000006,0x0000000f,0x00040020,0x00000011,0x00000009,
+	0x00000010,0x0004003b,0x00000011,0x00000012,0x00000009,0x00040015,0x00000013,0x00000020,
+	0x00000001,0x0004002b,0x00000013,0x00000014,0x00000001,0x00040020,0x00000015,0x00000009,
+	0x00000006,0x00020014,0x00000018,0x00040020,0x0000001d,0x00000007,0x00000013,0x0004002b,
+	0x00000013,0x0000001f,0x00000000,0x0004002b,0x00000013,0x00000027,0x00000002,0x00040020,
+	0x0000002e,0x00000007,0x0000000f,0x00090019,0x00000030,0x0000000e,0x00000005,0x00000000,
+	0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,0x00000031,0x00000030,0x00040020,
+	0x00000032,0x00000000,0x00000031,0x0004003b,0x00000032,0x00000033,0x00000000,0x00090019,
+	0x00000038,0x0000000e,0x00000005,0x00000000,0x00000000,0x00000000,0x00000002,0x00000001,
+	0x00040020,0x00000039,0x00000000,0x00000038,0x0004003b,0x00000039,0x0000003a,0x00000000,
+	0x0004002b,0x00000006,0x0000003e,0x00000040,0x0004002b,0x00000006,0x0000003f,0x00000001,
+	0x0006002c,0x00000007,0x00000040,0x0000003e,0x0000003f,0x0000003f,0x00050036,0x00000002,
+	0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x0000001d,0x0000001e,
+	0x00000007,0x0004003b,0x0000001d,0x00000026,0x00000007,0x0004003b,0x0000002e,0x0000002f,
+	0x00000007,0x00050041,0x0000000b,0x0000000c,0x00000009,0x0000000a,0x0004003d,0x00000006,
+	0x0000000d,0x0000000c,0x00050041,0x00000015,0x00000016,0x00000012,0x00000014,0x0004003d,
+	0x00000006,0x00000017,0x00000016,0x000500ae,0x00000018,0x00000019,0x0000000d,0x00000017,
+	0x000300f7,0x0000001b,0x00000000,0x000400fa,0x00000019,0x0000001a,0x0000001b,0x000200f8,
+	0x0000001a,0x000100fd,0x000200f8,0x0000001b,0x00050041,0x00000015,0x00000020,0x00000012,
+	0x0000001f,0x0004003d,0x00000006,0x00000021,0x00000020,0x00050041,0x0000000b,0x00000022,
+	0x00000009,0x0000000a,0x0004003d,0x00000006,0x00000023,0x00000022,0x00050080,0x00000006,
+	0x00000024,0x00000021,0x00000023,0x0004007c,0x00000013,0x00000025,0x00000024,0x0003003e,
+	0x0000001e,0x00000025,0x00050041,0x00000015,0x00000028,0x00000012,0x00000027,0x0004003d,
+	0x00000006,0x00000029,0x00000028,0x00050041,0x0000000b,0x0000002a,0x00000009,0x0000000a,
+	0x0004003d,0x00000006,0x0000002b,0x0000002a,0x00050080,0x00000006,0x0000002c,0x00000029,
+	0x0000002b,0x0004007c,0x00000013,0x0000002d,0x0000002c,0x0003003e,0x00000026,0x0000002d,
+	0x0004003d,0x00000031,0x00000034,0x00000033,0x0004003d,0x00000013,0x00000035,0x00000026,
+	0x00040064,0x00000030,0x00000036,0x00000034,0x0005005f,0x0000000f,0x00000037,0x00000036,
+	0x00000035,0x0003003e,0x0000002f,0x00000037,0x0004003d,0x00000038,0x0000003b,0x0000003a,
+	0x0004003d,0x00000013,0x0000003c,0x0000001e,0x0004003d,0x0000000f,0x0000003d,0x0000002f,
+	0x00040063,0x0000003b,0x0000003c,0x0000003d,0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32f)uniform writeonly imageBuffer dest;
+
+layout(set = 0, binding = 1)uniform samplerBuffer src;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        vec4 clearValue;
+} params;
+
+void main()
+{
+
+    if(gl_GlobalInvocationID . x >= params . size)
+        return;
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        vec4 srcValue = texelFetch(src, srcIndex);
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc
new file mode 100644
index 0000000..a441470
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc
@@ -0,0 +1,89 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000003[] = {
+	0x07230203,0x00010000,0x00080007,0x00000037,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002e,0x00020011,0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,
+	0x00000000,0x0003000e,0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,
+	0x00000000,0x00000015,0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,
+	0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,
+	0x00000008,0x74736564,0x65646e49,0x00000078,0x00060005,0x0000000c,0x68737550,0x736e6f43,
+	0x746e6174,0x00000073,0x00060006,0x0000000c,0x00000000,0x74736564,0x7366664f,0x00007465,
+	0x00050006,0x0000000c,0x00000001,0x657a6973,0x00000000,0x00060006,0x0000000c,0x00000002,
+	0x4f637273,0x65736666,0x00000074,0x00050006,0x0000000c,0x00000003,0x64646170,0x00676e69,
+	0x00060006,0x0000000c,0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,0x0000000e,
+	0x61726170,0x0000736d,0x00080005,0x00000015,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,
+	0x496e6f69,0x00000044,0x00050005,0x0000001c,0x49637273,0x7865646e,0x00000000,0x00050005,
+	0x00000025,0x56637273,0x65756c61,0x00000000,0x00030005,0x00000029,0x00637273,0x00040005,
+	0x00000030,0x74736564,0x00000000,0x00050048,0x0000000c,0x00000000,0x00000023,0x00000000,
+	0x00050048,0x0000000c,0x00000001,0x00000023,0x00000004,0x00050048,0x0000000c,0x00000002,
+	0x00000023,0x00000008,0x00050048,0x0000000c,0x00000003,0x00000023,0x0000000c,0x00050048,
+	0x0000000c,0x00000004,0x00000023,0x00000010,0x00030047,0x0000000c,0x00000002,0x00040047,
+	0x00000015,0x0000000b,0x0000001c,0x00040047,0x00000029,0x00000022,0x00000000,0x00040047,
+	0x00000029,0x00000021,0x00000001,0x00040047,0x00000030,0x00000022,0x00000000,0x00040047,
+	0x00000030,0x00000021,0x00000000,0x00030047,0x00000030,0x00000019,0x00040047,0x00000036,
+	0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
+	0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,
+	0x00000009,0x00000020,0x00000000,0x00030016,0x0000000a,0x00000020,0x00040017,0x0000000b,
+	0x0000000a,0x00000004,0x0007001e,0x0000000c,0x00000009,0x00000009,0x00000009,0x00000009,
+	0x0000000b,0x00040020,0x0000000d,0x00000009,0x0000000c,0x0004003b,0x0000000d,0x0000000e,
+	0x00000009,0x0004002b,0x00000006,0x0000000f,0x00000000,0x00040020,0x00000010,0x00000009,
+	0x00000009,0x00040017,0x00000013,0x00000009,0x00000003,0x00040020,0x00000014,0x00000001,
+	0x00000013,0x0004003b,0x00000014,0x00000015,0x00000001,0x0004002b,0x00000009,0x00000016,
+	0x00000000,0x00040020,0x00000017,0x00000001,0x00000009,0x0004002b,0x00000006,0x0000001d,
+	0x00000002,0x00040020,0x00000024,0x00000007,0x0000000b,0x00090019,0x00000026,0x0000000a,
+	0x00000005,0x00000000,0x00000000,0x00000000,0x00000001,0x00000000,0x0003001b,0x00000027,
+	0x00000026,0x00040020,0x00000028,0x00000000,0x00000027,0x0004003b,0x00000028,0x00000029,
+	0x00000000,0x00090019,0x0000002e,0x0000000a,0x00000005,0x00000000,0x00000000,0x00000000,
+	0x00000002,0x00000001,0x00040020,0x0000002f,0x00000000,0x0000002e,0x0004003b,0x0000002f,
+	0x00000030,0x00000000,0x0004002b,0x00000009,0x00000034,0x00000040,0x0004002b,0x00000009,
+	0x00000035,0x00000001,0x0006002c,0x00000013,0x00000036,0x00000034,0x00000035,0x00000035,
+	0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,
+	0x00000007,0x00000008,0x00000007,0x0004003b,0x00000007,0x0000001c,0x00000007,0x0004003b,
+	0x00000024,0x00000025,0x00000007,0x00050041,0x00000010,0x00000011,0x0000000e,0x0000000f,
+	0x0004003d,0x00000009,0x00000012,0x00000011,0x00050041,0x00000017,0x00000018,0x00000015,
+	0x00000016,0x0004003d,0x00000009,0x00000019,0x00000018,0x00050080,0x00000009,0x0000001a,
+	0x00000012,0x00000019,0x0004007c,0x00000006,0x0000001b,0x0000001a,0x0003003e,0x00000008,
+	0x0000001b,0x00050041,0x00000010,0x0000001e,0x0000000e,0x0000001d,0x0004003d,0x00000009,
+	0x0000001f,0x0000001e,0x00050041,0x00000017,0x00000020,0x00000015,0x00000016,0x0004003d,
+	0x00000009,0x00000021,0x00000020,0x00050080,0x00000009,0x00000022,0x0000001f,0x00000021,
+	0x0004007c,0x00000006,0x00000023,0x00000022,0x0003003e,0x0000001c,0x00000023,0x0004003d,
+	0x00000027,0x0000002a,0x00000029,0x0004003d,0x00000006,0x0000002b,0x0000001c,0x00040064,
+	0x00000026,0x0000002c,0x0000002a,0x0005005f,0x0000000b,0x0000002d,0x0000002c,0x0000002b,
+	0x0003003e,0x00000025,0x0000002d,0x0004003d,0x0000002e,0x00000031,0x00000030,0x0004003d,
+	0x00000006,0x00000032,0x00000008,0x0004003d,0x0000000b,0x00000033,0x00000025,0x00040063,
+	0x00000031,0x00000032,0x00000033,0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32f)uniform writeonly imageBuffer dest;
+
+layout(set = 0, binding = 1)uniform samplerBuffer src;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        vec4 clearValue;
+} params;
+
+void main()
+{
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        vec4 srcValue = texelFetch(src, srcIndex);
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc
new file mode 100644
index 0000000..b5d7ea1
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc
@@ -0,0 +1,91 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000004[] = {
+	0x07230203,0x00010000,0x00080007,0x0000003c,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
+	0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000009,
+	0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,0x00030003,0x00000002,
+	0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00080005,0x00000009,0x475f6c67,
+	0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,0x00000010,0x68737550,
+	0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000010,0x00000000,0x74736564,0x7366664f,
+	0x00007465,0x00050006,0x00000010,0x00000001,0x657a6973,0x00000000,0x00060006,0x00000010,
+	0x00000002,0x4f637273,0x65736666,0x00000074,0x00050006,0x00000010,0x00000003,0x64646170,
+	0x00676e69,0x00060006,0x00000010,0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,
+	0x00000012,0x61726170,0x0000736d,0x00050005,0x0000001d,0x74736564,0x65646e49,0x00000078,
+	0x00050005,0x00000025,0x49637273,0x7865646e,0x00000000,0x00050005,0x0000002e,0x56637273,
+	0x65756c61,0x00000000,0x00040005,0x00000035,0x74736564,0x00000000,0x00040047,0x00000009,
+	0x0000000b,0x0000001c,0x00050048,0x00000010,0x00000000,0x00000023,0x00000000,0x00050048,
+	0x00000010,0x00000001,0x00000023,0x00000004,0x00050048,0x00000010,0x00000002,0x00000023,
+	0x00000008,0x00050048,0x00000010,0x00000003,0x00000023,0x0000000c,0x00050048,0x00000010,
+	0x00000004,0x00000023,0x00000010,0x00030047,0x00000010,0x00000002,0x00040047,0x00000035,
+	0x00000022,0x00000000,0x00040047,0x00000035,0x00000021,0x00000000,0x00030047,0x00000035,
+	0x00000019,0x00040047,0x0000003b,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,
+	0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000000,0x00040017,0x00000007,
+	0x00000006,0x00000003,0x00040020,0x00000008,0x00000001,0x00000007,0x0004003b,0x00000008,
+	0x00000009,0x00000001,0x0004002b,0x00000006,0x0000000a,0x00000000,0x00040020,0x0000000b,
+	0x00000001,0x00000006,0x00040015,0x0000000e,0x00000020,0x00000001,0x00040017,0x0000000f,
+	0x0000000e,0x00000004,0x0007001e,0x00000010,0x00000006,0x00000006,0x00000006,0x00000006,
+	0x0000000f,0x00040020,0x00000011,0x00000009,0x00000010,0x0004003b,0x00000011,0x00000012,
+	0x00000009,0x0004002b,0x0000000e,0x00000013,0x00000001,0x00040020,0x00000014,0x00000009,
+	0x00000006,0x00020014,0x00000017,0x00040020,0x0000001c,0x00000007,0x0000000e,0x0004002b,
+	0x0000000e,0x0000001e,0x00000000,0x0004002b,0x0000000e,0x00000026,0x00000002,0x00040020,
+	0x0000002d,0x00000007,0x0000000f,0x0004002b,0x0000000e,0x0000002f,0x00000004,0x00040020,
+	0x00000030,0x00000009,0x0000000f,0x00090019,0x00000033,0x0000000e,0x00000005,0x00000000,
+	0x00000000,0x00000000,0x00000002,0x00000015,0x00040020,0x00000034,0x00000000,0x00000033,
+	0x0004003b,0x00000034,0x00000035,0x00000000,0x0004002b,0x00000006,0x00000039,0x00000040,
+	0x0004002b,0x00000006,0x0000003a,0x00000001,0x0006002c,0x00000007,0x0000003b,0x00000039,
+	0x0000003a,0x0000003a,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
+	0x00000005,0x0004003b,0x0000001c,0x0000001d,0x00000007,0x0004003b,0x0000001c,0x00000025,
+	0x00000007,0x0004003b,0x0000002d,0x0000002e,0x00000007,0x00050041,0x0000000b,0x0000000c,
+	0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000000d,0x0000000c,0x00050041,0x00000014,
+	0x00000015,0x00000012,0x00000013,0x0004003d,0x00000006,0x00000016,0x00000015,0x000500ae,
+	0x00000017,0x00000018,0x0000000d,0x00000016,0x000300f7,0x0000001a,0x00000000,0x000400fa,
+	0x00000018,0x00000019,0x0000001a,0x000200f8,0x00000019,0x000100fd,0x000200f8,0x0000001a,
+	0x00050041,0x00000014,0x0000001f,0x00000012,0x0000001e,0x0004003d,0x00000006,0x00000020,
+	0x0000001f,0x00050041,0x0000000b,0x00000021,0x00000009,0x0000000a,0x0004003d,0x00000006,
+	0x00000022,0x00000021,0x00050080,0x00000006,0x00000023,0x00000020,0x00000022,0x0004007c,
+	0x0000000e,0x00000024,0x00000023,0x0003003e,0x0000001d,0x00000024,0x00050041,0x00000014,
+	0x00000027,0x00000012,0x00000026,0x0004003d,0x00000006,0x00000028,0x00000027,0x00050041,
+	0x0000000b,0x00000029,0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000002a,0x00000029,
+	0x00050080,0x00000006,0x0000002b,0x00000028,0x0000002a,0x0004007c,0x0000000e,0x0000002c,
+	0x0000002b,0x0003003e,0x00000025,0x0000002c,0x00050041,0x00000030,0x00000031,0x00000012,
+	0x0000002f,0x0004003d,0x0000000f,0x00000032,0x00000031,0x0003003e,0x0000002e,0x00000032,
+	0x0004003d,0x00000033,0x00000036,0x00000035,0x0004003d,0x0000000e,0x00000037,0x0000001d,
+	0x0004003d,0x0000000f,0x00000038,0x0000002e,0x00040063,0x00000036,0x00000037,0x00000038,
+	0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32i)uniform writeonly iimageBuffer dest;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        ivec4 clearValue;
+} params;
+
+void main()
+{
+
+    if(gl_GlobalInvocationID . x >= params . size)
+        return;
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        ivec4 srcValue = params . clearValue;
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc
new file mode 100644
index 0000000..8b80b41
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc
@@ -0,0 +1,83 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000005[] = {
+	0x07230203,0x00010000,0x00080007,0x00000032,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
+	0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000014,
+	0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,0x00030003,0x00000002,
+	0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000008,0x74736564,
+	0x65646e49,0x00000078,0x00060005,0x0000000b,0x68737550,0x736e6f43,0x746e6174,0x00000073,
+	0x00060006,0x0000000b,0x00000000,0x74736564,0x7366664f,0x00007465,0x00050006,0x0000000b,
+	0x00000001,0x657a6973,0x00000000,0x00060006,0x0000000b,0x00000002,0x4f637273,0x65736666,
+	0x00000074,0x00050006,0x0000000b,0x00000003,0x64646170,0x00676e69,0x00060006,0x0000000b,
+	0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,0x0000000d,0x61726170,0x0000736d,
+	0x00080005,0x00000014,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,
+	0x00050005,0x0000001b,0x49637273,0x7865646e,0x00000000,0x00050005,0x00000024,0x56637273,
+	0x65756c61,0x00000000,0x00040005,0x0000002b,0x74736564,0x00000000,0x00050048,0x0000000b,
+	0x00000000,0x00000023,0x00000000,0x00050048,0x0000000b,0x00000001,0x00000023,0x00000004,
+	0x00050048,0x0000000b,0x00000002,0x00000023,0x00000008,0x00050048,0x0000000b,0x00000003,
+	0x00000023,0x0000000c,0x00050048,0x0000000b,0x00000004,0x00000023,0x00000010,0x00030047,
+	0x0000000b,0x00000002,0x00040047,0x00000014,0x0000000b,0x0000001c,0x00040047,0x0000002b,
+	0x00000022,0x00000000,0x00040047,0x0000002b,0x00000021,0x00000000,0x00030047,0x0000002b,
+	0x00000019,0x00040047,0x00000031,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,
+	0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,
+	0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000,0x00040017,0x0000000a,
+	0x00000006,0x00000004,0x0007001e,0x0000000b,0x00000009,0x00000009,0x00000009,0x00000009,
+	0x0000000a,0x00040020,0x0000000c,0x00000009,0x0000000b,0x0004003b,0x0000000c,0x0000000d,
+	0x00000009,0x0004002b,0x00000006,0x0000000e,0x00000000,0x00040020,0x0000000f,0x00000009,
+	0x00000009,0x00040017,0x00000012,0x00000009,0x00000003,0x00040020,0x00000013,0x00000001,
+	0x00000012,0x0004003b,0x00000013,0x00000014,0x00000001,0x0004002b,0x00000009,0x00000015,
+	0x00000000,0x00040020,0x00000016,0x00000001,0x00000009,0x0004002b,0x00000006,0x0000001c,
+	0x00000002,0x00040020,0x00000023,0x00000007,0x0000000a,0x0004002b,0x00000006,0x00000025,
+	0x00000004,0x00040020,0x00000026,0x00000009,0x0000000a,0x00090019,0x00000029,0x00000006,
+	0x00000005,0x00000000,0x00000000,0x00000000,0x00000002,0x00000015,0x00040020,0x0000002a,
+	0x00000000,0x00000029,0x0004003b,0x0000002a,0x0000002b,0x00000000,0x0004002b,0x00000009,
+	0x0000002f,0x00000040,0x0004002b,0x00000009,0x00000030,0x00000001,0x0006002c,0x00000012,
+	0x00000031,0x0000002f,0x00000030,0x00000030,0x00050036,0x00000002,0x00000004,0x00000000,
+	0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b,
+	0x00000007,0x0000001b,0x00000007,0x0004003b,0x00000023,0x00000024,0x00000007,0x00050041,
+	0x0000000f,0x00000010,0x0000000d,0x0000000e,0x0004003d,0x00000009,0x00000011,0x00000010,
+	0x00050041,0x00000016,0x00000017,0x00000014,0x00000015,0x0004003d,0x00000009,0x00000018,
+	0x00000017,0x00050080,0x00000009,0x00000019,0x00000011,0x00000018,0x0004007c,0x00000006,
+	0x0000001a,0x00000019,0x0003003e,0x00000008,0x0000001a,0x00050041,0x0000000f,0x0000001d,
+	0x0000000d,0x0000001c,0x0004003d,0x00000009,0x0000001e,0x0000001d,0x00050041,0x00000016,
+	0x0000001f,0x00000014,0x00000015,0x0004003d,0x00000009,0x00000020,0x0000001f,0x00050080,
+	0x00000009,0x00000021,0x0000001e,0x00000020,0x0004007c,0x00000006,0x00000022,0x00000021,
+	0x0003003e,0x0000001b,0x00000022,0x00050041,0x00000026,0x00000027,0x0000000d,0x00000025,
+	0x0004003d,0x0000000a,0x00000028,0x00000027,0x0003003e,0x00000024,0x00000028,0x0004003d,
+	0x00000029,0x0000002c,0x0000002b,0x0004003d,0x00000006,0x0000002d,0x00000008,0x0004003d,
+	0x0000000a,0x0000002e,0x00000024,0x00040063,0x0000002c,0x0000002d,0x0000002e,0x000100fd,
+	0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32i)uniform writeonly iimageBuffer dest;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        ivec4 clearValue;
+} params;
+
+void main()
+{
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        ivec4 srcValue = params . clearValue;
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc
new file mode 100644
index 0000000..126ddca
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc
@@ -0,0 +1,97 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000006[] = {
+	0x07230203,0x00010000,0x00080007,0x00000040,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002e,0x00020011,0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,
+	0x00000000,0x0003000e,0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,
+	0x00000000,0x00000009,0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,
+	0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00080005,
+	0x00000009,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,
+	0x00000010,0x68737550,0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000010,0x00000000,
+	0x74736564,0x7366664f,0x00007465,0x00050006,0x00000010,0x00000001,0x657a6973,0x00000000,
+	0x00060006,0x00000010,0x00000002,0x4f637273,0x65736666,0x00000074,0x00050006,0x00000010,
+	0x00000003,0x64646170,0x00676e69,0x00060006,0x00000010,0x00000004,0x61656c63,0x6c615672,
+	0x00006575,0x00040005,0x00000012,0x61726170,0x0000736d,0x00050005,0x0000001d,0x74736564,
+	0x65646e49,0x00000078,0x00050005,0x00000025,0x49637273,0x7865646e,0x00000000,0x00050005,
+	0x0000002e,0x56637273,0x65756c61,0x00000000,0x00030005,0x00000032,0x00637273,0x00040005,
+	0x00000039,0x74736564,0x00000000,0x00040047,0x00000009,0x0000000b,0x0000001c,0x00050048,
+	0x00000010,0x00000000,0x00000023,0x00000000,0x00050048,0x00000010,0x00000001,0x00000023,
+	0x00000004,0x00050048,0x00000010,0x00000002,0x00000023,0x00000008,0x00050048,0x00000010,
+	0x00000003,0x00000023,0x0000000c,0x00050048,0x00000010,0x00000004,0x00000023,0x00000010,
+	0x00030047,0x00000010,0x00000002,0x00040047,0x00000032,0x00000022,0x00000000,0x00040047,
+	0x00000032,0x00000021,0x00000001,0x00040047,0x00000039,0x00000022,0x00000000,0x00040047,
+	0x00000039,0x00000021,0x00000000,0x00030047,0x00000039,0x00000019,0x00040047,0x0000003f,
+	0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
+	0x00000006,0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000003,0x00040020,
+	0x00000008,0x00000001,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000001,0x0004002b,
+	0x00000006,0x0000000a,0x00000000,0x00040020,0x0000000b,0x00000001,0x00000006,0x00040015,
+	0x0000000e,0x00000020,0x00000001,0x00040017,0x0000000f,0x0000000e,0x00000004,0x0007001e,
+	0x00000010,0x00000006,0x00000006,0x00000006,0x00000006,0x0000000f,0x00040020,0x00000011,
+	0x00000009,0x00000010,0x0004003b,0x00000011,0x00000012,0x00000009,0x0004002b,0x0000000e,
+	0x00000013,0x00000001,0x00040020,0x00000014,0x00000009,0x00000006,0x00020014,0x00000017,
+	0x00040020,0x0000001c,0x00000007,0x0000000e,0x0004002b,0x0000000e,0x0000001e,0x00000000,
+	0x0004002b,0x0000000e,0x00000026,0x00000002,0x00040020,0x0000002d,0x00000007,0x0000000f,
+	0x00090019,0x0000002f,0x0000000e,0x00000005,0x00000000,0x00000000,0x00000000,0x00000001,
+	0x00000000,0x0003001b,0x00000030,0x0000002f,0x00040020,0x00000031,0x00000000,0x00000030,
+	0x0004003b,0x00000031,0x00000032,0x00000000,0x00090019,0x00000037,0x0000000e,0x00000005,
+	0x00000000,0x00000000,0x00000000,0x00000002,0x00000015,0x00040020,0x00000038,0x00000000,
+	0x00000037,0x0004003b,0x00000038,0x00000039,0x00000000,0x0004002b,0x00000006,0x0000003d,
+	0x00000040,0x0004002b,0x00000006,0x0000003e,0x00000001,0x0006002c,0x00000007,0x0000003f,
+	0x0000003d,0x0000003e,0x0000003e,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,
+	0x000200f8,0x00000005,0x0004003b,0x0000001c,0x0000001d,0x00000007,0x0004003b,0x0000001c,
+	0x00000025,0x00000007,0x0004003b,0x0000002d,0x0000002e,0x00000007,0x00050041,0x0000000b,
+	0x0000000c,0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000000d,0x0000000c,0x00050041,
+	0x00000014,0x00000015,0x00000012,0x00000013,0x0004003d,0x00000006,0x00000016,0x00000015,
+	0x000500ae,0x00000017,0x00000018,0x0000000d,0x00000016,0x000300f7,0x0000001a,0x00000000,
+	0x000400fa,0x00000018,0x00000019,0x0000001a,0x000200f8,0x00000019,0x000100fd,0x000200f8,
+	0x0000001a,0x00050041,0x00000014,0x0000001f,0x00000012,0x0000001e,0x0004003d,0x00000006,
+	0x00000020,0x0000001f,0x00050041,0x0000000b,0x00000021,0x00000009,0x0000000a,0x0004003d,
+	0x00000006,0x00000022,0x00000021,0x00050080,0x00000006,0x00000023,0x00000020,0x00000022,
+	0x0004007c,0x0000000e,0x00000024,0x00000023,0x0003003e,0x0000001d,0x00000024,0x00050041,
+	0x00000014,0x00000027,0x00000012,0x00000026,0x0004003d,0x00000006,0x00000028,0x00000027,
+	0x00050041,0x0000000b,0x00000029,0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000002a,
+	0x00000029,0x00050080,0x00000006,0x0000002b,0x00000028,0x0000002a,0x0004007c,0x0000000e,
+	0x0000002c,0x0000002b,0x0003003e,0x00000025,0x0000002c,0x0004003d,0x00000030,0x00000033,
+	0x00000032,0x0004003d,0x0000000e,0x00000034,0x00000025,0x00040064,0x0000002f,0x00000035,
+	0x00000033,0x0005005f,0x0000000f,0x00000036,0x00000035,0x00000034,0x0003003e,0x0000002e,
+	0x00000036,0x0004003d,0x00000037,0x0000003a,0x00000039,0x0004003d,0x0000000e,0x0000003b,
+	0x0000001d,0x0004003d,0x0000000f,0x0000003c,0x0000002e,0x00040063,0x0000003a,0x0000003b,
+	0x0000003c,0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32i)uniform writeonly iimageBuffer dest;
+
+layout(set = 0, binding = 1)uniform isamplerBuffer src;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        ivec4 clearValue;
+} params;
+
+void main()
+{
+
+    if(gl_GlobalInvocationID . x >= params . size)
+        return;
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        ivec4 srcValue = texelFetch(src, srcIndex);
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc
new file mode 100644
index 0000000..f114f4d
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc
@@ -0,0 +1,89 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000007[] = {
+	0x07230203,0x00010000,0x00080007,0x00000036,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002e,0x00020011,0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,
+	0x00000000,0x0003000e,0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,
+	0x00000000,0x00000014,0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,
+	0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,
+	0x00000008,0x74736564,0x65646e49,0x00000078,0x00060005,0x0000000b,0x68737550,0x736e6f43,
+	0x746e6174,0x00000073,0x00060006,0x0000000b,0x00000000,0x74736564,0x7366664f,0x00007465,
+	0x00050006,0x0000000b,0x00000001,0x657a6973,0x00000000,0x00060006,0x0000000b,0x00000002,
+	0x4f637273,0x65736666,0x00000074,0x00050006,0x0000000b,0x00000003,0x64646170,0x00676e69,
+	0x00060006,0x0000000b,0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,0x0000000d,
+	0x61726170,0x0000736d,0x00080005,0x00000014,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,
+	0x496e6f69,0x00000044,0x00050005,0x0000001b,0x49637273,0x7865646e,0x00000000,0x00050005,
+	0x00000024,0x56637273,0x65756c61,0x00000000,0x00030005,0x00000028,0x00637273,0x00040005,
+	0x0000002f,0x74736564,0x00000000,0x00050048,0x0000000b,0x00000000,0x00000023,0x00000000,
+	0x00050048,0x0000000b,0x00000001,0x00000023,0x00000004,0x00050048,0x0000000b,0x00000002,
+	0x00000023,0x00000008,0x00050048,0x0000000b,0x00000003,0x00000023,0x0000000c,0x00050048,
+	0x0000000b,0x00000004,0x00000023,0x00000010,0x00030047,0x0000000b,0x00000002,0x00040047,
+	0x00000014,0x0000000b,0x0000001c,0x00040047,0x00000028,0x00000022,0x00000000,0x00040047,
+	0x00000028,0x00000021,0x00000001,0x00040047,0x0000002f,0x00000022,0x00000000,0x00040047,
+	0x0000002f,0x00000021,0x00000000,0x00030047,0x0000002f,0x00000019,0x00040047,0x00000035,
+	0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
+	0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,
+	0x00000009,0x00000020,0x00000000,0x00040017,0x0000000a,0x00000006,0x00000004,0x0007001e,
+	0x0000000b,0x00000009,0x00000009,0x00000009,0x00000009,0x0000000a,0x00040020,0x0000000c,
+	0x00000009,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000009,0x0004002b,0x00000006,
+	0x0000000e,0x00000000,0x00040020,0x0000000f,0x00000009,0x00000009,0x00040017,0x00000012,
+	0x00000009,0x00000003,0x00040020,0x00000013,0x00000001,0x00000012,0x0004003b,0x00000013,
+	0x00000014,0x00000001,0x0004002b,0x00000009,0x00000015,0x00000000,0x00040020,0x00000016,
+	0x00000001,0x00000009,0x0004002b,0x00000006,0x0000001c,0x00000002,0x00040020,0x00000023,
+	0x00000007,0x0000000a,0x00090019,0x00000025,0x00000006,0x00000005,0x00000000,0x00000000,
+	0x00000000,0x00000001,0x00000000,0x0003001b,0x00000026,0x00000025,0x00040020,0x00000027,
+	0x00000000,0x00000026,0x0004003b,0x00000027,0x00000028,0x00000000,0x00090019,0x0000002d,
+	0x00000006,0x00000005,0x00000000,0x00000000,0x00000000,0x00000002,0x00000015,0x00040020,
+	0x0000002e,0x00000000,0x0000002d,0x0004003b,0x0000002e,0x0000002f,0x00000000,0x0004002b,
+	0x00000009,0x00000033,0x00000040,0x0004002b,0x00000009,0x00000034,0x00000001,0x0006002c,
+	0x00000012,0x00000035,0x00000033,0x00000034,0x00000034,0x00050036,0x00000002,0x00000004,
+	0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,
+	0x0004003b,0x00000007,0x0000001b,0x00000007,0x0004003b,0x00000023,0x00000024,0x00000007,
+	0x00050041,0x0000000f,0x00000010,0x0000000d,0x0000000e,0x0004003d,0x00000009,0x00000011,
+	0x00000010,0x00050041,0x00000016,0x00000017,0x00000014,0x00000015,0x0004003d,0x00000009,
+	0x00000018,0x00000017,0x00050080,0x00000009,0x00000019,0x00000011,0x00000018,0x0004007c,
+	0x00000006,0x0000001a,0x00000019,0x0003003e,0x00000008,0x0000001a,0x00050041,0x0000000f,
+	0x0000001d,0x0000000d,0x0000001c,0x0004003d,0x00000009,0x0000001e,0x0000001d,0x00050041,
+	0x00000016,0x0000001f,0x00000014,0x00000015,0x0004003d,0x00000009,0x00000020,0x0000001f,
+	0x00050080,0x00000009,0x00000021,0x0000001e,0x00000020,0x0004007c,0x00000006,0x00000022,
+	0x00000021,0x0003003e,0x0000001b,0x00000022,0x0004003d,0x00000026,0x00000029,0x00000028,
+	0x0004003d,0x00000006,0x0000002a,0x0000001b,0x00040064,0x00000025,0x0000002b,0x00000029,
+	0x0005005f,0x0000000a,0x0000002c,0x0000002b,0x0000002a,0x0003003e,0x00000024,0x0000002c,
+	0x0004003d,0x0000002d,0x00000030,0x0000002f,0x0004003d,0x00000006,0x00000031,0x00000008,
+	0x0004003d,0x0000000a,0x00000032,0x00000024,0x00040063,0x00000030,0x00000031,0x00000032,
+	0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32i)uniform writeonly iimageBuffer dest;
+
+layout(set = 0, binding = 1)uniform isamplerBuffer src;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        ivec4 clearValue;
+} params;
+
+void main()
+{
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        ivec4 srcValue = texelFetch(src, srcIndex);
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc
new file mode 100644
index 0000000..1147597
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc
@@ -0,0 +1,91 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000008[] = {
+	0x07230203,0x00010000,0x00080007,0x0000003c,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
+	0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000009,
+	0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,0x00030003,0x00000002,
+	0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00080005,0x00000009,0x475f6c67,
+	0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,0x0000000f,0x68737550,
+	0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000f,0x00000000,0x74736564,0x7366664f,
+	0x00007465,0x00050006,0x0000000f,0x00000001,0x657a6973,0x00000000,0x00060006,0x0000000f,
+	0x00000002,0x4f637273,0x65736666,0x00000074,0x00050006,0x0000000f,0x00000003,0x64646170,
+	0x00676e69,0x00060006,0x0000000f,0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,
+	0x00000011,0x61726170,0x0000736d,0x00050005,0x0000001d,0x74736564,0x65646e49,0x00000078,
+	0x00050005,0x00000025,0x49637273,0x7865646e,0x00000000,0x00050005,0x0000002e,0x56637273,
+	0x65756c61,0x00000000,0x00040005,0x00000035,0x74736564,0x00000000,0x00040047,0x00000009,
+	0x0000000b,0x0000001c,0x00050048,0x0000000f,0x00000000,0x00000023,0x00000000,0x00050048,
+	0x0000000f,0x00000001,0x00000023,0x00000004,0x00050048,0x0000000f,0x00000002,0x00000023,
+	0x00000008,0x00050048,0x0000000f,0x00000003,0x00000023,0x0000000c,0x00050048,0x0000000f,
+	0x00000004,0x00000023,0x00000010,0x00030047,0x0000000f,0x00000002,0x00040047,0x00000035,
+	0x00000022,0x00000000,0x00040047,0x00000035,0x00000021,0x00000000,0x00030047,0x00000035,
+	0x00000019,0x00040047,0x0000003b,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,
+	0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000000,0x00040017,0x00000007,
+	0x00000006,0x00000003,0x00040020,0x00000008,0x00000001,0x00000007,0x0004003b,0x00000008,
+	0x00000009,0x00000001,0x0004002b,0x00000006,0x0000000a,0x00000000,0x00040020,0x0000000b,
+	0x00000001,0x00000006,0x00040017,0x0000000e,0x00000006,0x00000004,0x0007001e,0x0000000f,
+	0x00000006,0x00000006,0x00000006,0x00000006,0x0000000e,0x00040020,0x00000010,0x00000009,
+	0x0000000f,0x0004003b,0x00000010,0x00000011,0x00000009,0x00040015,0x00000012,0x00000020,
+	0x00000001,0x0004002b,0x00000012,0x00000013,0x00000001,0x00040020,0x00000014,0x00000009,
+	0x00000006,0x00020014,0x00000017,0x00040020,0x0000001c,0x00000007,0x00000012,0x0004002b,
+	0x00000012,0x0000001e,0x00000000,0x0004002b,0x00000012,0x00000026,0x00000002,0x00040020,
+	0x0000002d,0x00000007,0x0000000e,0x0004002b,0x00000012,0x0000002f,0x00000004,0x00040020,
+	0x00000030,0x00000009,0x0000000e,0x00090019,0x00000033,0x00000006,0x00000005,0x00000000,
+	0x00000000,0x00000000,0x00000002,0x0000001e,0x00040020,0x00000034,0x00000000,0x00000033,
+	0x0004003b,0x00000034,0x00000035,0x00000000,0x0004002b,0x00000006,0x00000039,0x00000040,
+	0x0004002b,0x00000006,0x0000003a,0x00000001,0x0006002c,0x00000007,0x0000003b,0x00000039,
+	0x0000003a,0x0000003a,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
+	0x00000005,0x0004003b,0x0000001c,0x0000001d,0x00000007,0x0004003b,0x0000001c,0x00000025,
+	0x00000007,0x0004003b,0x0000002d,0x0000002e,0x00000007,0x00050041,0x0000000b,0x0000000c,
+	0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000000d,0x0000000c,0x00050041,0x00000014,
+	0x00000015,0x00000011,0x00000013,0x0004003d,0x00000006,0x00000016,0x00000015,0x000500ae,
+	0x00000017,0x00000018,0x0000000d,0x00000016,0x000300f7,0x0000001a,0x00000000,0x000400fa,
+	0x00000018,0x00000019,0x0000001a,0x000200f8,0x00000019,0x000100fd,0x000200f8,0x0000001a,
+	0x00050041,0x00000014,0x0000001f,0x00000011,0x0000001e,0x0004003d,0x00000006,0x00000020,
+	0x0000001f,0x00050041,0x0000000b,0x00000021,0x00000009,0x0000000a,0x0004003d,0x00000006,
+	0x00000022,0x00000021,0x00050080,0x00000006,0x00000023,0x00000020,0x00000022,0x0004007c,
+	0x00000012,0x00000024,0x00000023,0x0003003e,0x0000001d,0x00000024,0x00050041,0x00000014,
+	0x00000027,0x00000011,0x00000026,0x0004003d,0x00000006,0x00000028,0x00000027,0x00050041,
+	0x0000000b,0x00000029,0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000002a,0x00000029,
+	0x00050080,0x00000006,0x0000002b,0x00000028,0x0000002a,0x0004007c,0x00000012,0x0000002c,
+	0x0000002b,0x0003003e,0x00000025,0x0000002c,0x00050041,0x00000030,0x00000031,0x00000011,
+	0x0000002f,0x0004003d,0x0000000e,0x00000032,0x00000031,0x0003003e,0x0000002e,0x00000032,
+	0x0004003d,0x00000033,0x00000036,0x00000035,0x0004003d,0x00000012,0x00000037,0x0000001d,
+	0x0004003d,0x0000000e,0x00000038,0x0000002e,0x00040063,0x00000036,0x00000037,0x00000038,
+	0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimageBuffer dest;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        uvec4 clearValue;
+} params;
+
+void main()
+{
+
+    if(gl_GlobalInvocationID . x >= params . size)
+        return;
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        uvec4 srcValue = params . clearValue;
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc
new file mode 100644
index 0000000..07de488
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc
@@ -0,0 +1,83 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_00000009[] = {
+	0x07230203,0x00010000,0x00080007,0x00000032,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,
+	0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x00000014,
+	0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,0x00030003,0x00000002,
+	0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,0x00000008,0x74736564,
+	0x65646e49,0x00000078,0x00060005,0x0000000b,0x68737550,0x736e6f43,0x746e6174,0x00000073,
+	0x00060006,0x0000000b,0x00000000,0x74736564,0x7366664f,0x00007465,0x00050006,0x0000000b,
+	0x00000001,0x657a6973,0x00000000,0x00060006,0x0000000b,0x00000002,0x4f637273,0x65736666,
+	0x00000074,0x00050006,0x0000000b,0x00000003,0x64646170,0x00676e69,0x00060006,0x0000000b,
+	0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,0x0000000d,0x61726170,0x0000736d,
+	0x00080005,0x00000014,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,
+	0x00050005,0x0000001b,0x49637273,0x7865646e,0x00000000,0x00050005,0x00000024,0x56637273,
+	0x65756c61,0x00000000,0x00040005,0x0000002b,0x74736564,0x00000000,0x00050048,0x0000000b,
+	0x00000000,0x00000023,0x00000000,0x00050048,0x0000000b,0x00000001,0x00000023,0x00000004,
+	0x00050048,0x0000000b,0x00000002,0x00000023,0x00000008,0x00050048,0x0000000b,0x00000003,
+	0x00000023,0x0000000c,0x00050048,0x0000000b,0x00000004,0x00000023,0x00000010,0x00030047,
+	0x0000000b,0x00000002,0x00040047,0x00000014,0x0000000b,0x0000001c,0x00040047,0x0000002b,
+	0x00000022,0x00000000,0x00040047,0x0000002b,0x00000021,0x00000000,0x00030047,0x0000002b,
+	0x00000019,0x00040047,0x00000031,0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,
+	0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,
+	0x00000007,0x00000006,0x00040015,0x00000009,0x00000020,0x00000000,0x00040017,0x0000000a,
+	0x00000009,0x00000004,0x0007001e,0x0000000b,0x00000009,0x00000009,0x00000009,0x00000009,
+	0x0000000a,0x00040020,0x0000000c,0x00000009,0x0000000b,0x0004003b,0x0000000c,0x0000000d,
+	0x00000009,0x0004002b,0x00000006,0x0000000e,0x00000000,0x00040020,0x0000000f,0x00000009,
+	0x00000009,0x00040017,0x00000012,0x00000009,0x00000003,0x00040020,0x00000013,0x00000001,
+	0x00000012,0x0004003b,0x00000013,0x00000014,0x00000001,0x0004002b,0x00000009,0x00000015,
+	0x00000000,0x00040020,0x00000016,0x00000001,0x00000009,0x0004002b,0x00000006,0x0000001c,
+	0x00000002,0x00040020,0x00000023,0x00000007,0x0000000a,0x0004002b,0x00000006,0x00000025,
+	0x00000004,0x00040020,0x00000026,0x00000009,0x0000000a,0x00090019,0x00000029,0x00000009,
+	0x00000005,0x00000000,0x00000000,0x00000000,0x00000002,0x0000001e,0x00040020,0x0000002a,
+	0x00000000,0x00000029,0x0004003b,0x0000002a,0x0000002b,0x00000000,0x0004002b,0x00000009,
+	0x0000002f,0x00000040,0x0004002b,0x00000009,0x00000030,0x00000001,0x0006002c,0x00000012,
+	0x00000031,0x0000002f,0x00000030,0x00000030,0x00050036,0x00000002,0x00000004,0x00000000,
+	0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,0x0004003b,
+	0x00000007,0x0000001b,0x00000007,0x0004003b,0x00000023,0x00000024,0x00000007,0x00050041,
+	0x0000000f,0x00000010,0x0000000d,0x0000000e,0x0004003d,0x00000009,0x00000011,0x00000010,
+	0x00050041,0x00000016,0x00000017,0x00000014,0x00000015,0x0004003d,0x00000009,0x00000018,
+	0x00000017,0x00050080,0x00000009,0x00000019,0x00000011,0x00000018,0x0004007c,0x00000006,
+	0x0000001a,0x00000019,0x0003003e,0x00000008,0x0000001a,0x00050041,0x0000000f,0x0000001d,
+	0x0000000d,0x0000001c,0x0004003d,0x00000009,0x0000001e,0x0000001d,0x00050041,0x00000016,
+	0x0000001f,0x00000014,0x00000015,0x0004003d,0x00000009,0x00000020,0x0000001f,0x00050080,
+	0x00000009,0x00000021,0x0000001e,0x00000020,0x0004007c,0x00000006,0x00000022,0x00000021,
+	0x0003003e,0x0000001b,0x00000022,0x00050041,0x00000026,0x00000027,0x0000000d,0x00000025,
+	0x0004003d,0x0000000a,0x00000028,0x00000027,0x0003003e,0x00000024,0x00000028,0x0004003d,
+	0x00000029,0x0000002c,0x0000002b,0x0004003d,0x00000006,0x0000002d,0x00000008,0x0004003d,
+	0x0000000a,0x0000002e,0x00000024,0x00040063,0x0000002c,0x0000002d,0x0000002e,0x000100fd,
+	0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimageBuffer dest;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        uvec4 clearValue;
+} params;
+
+void main()
+{
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        uvec4 srcValue = params . clearValue;
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc
new file mode 100644
index 0000000..1d0ade7
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc
@@ -0,0 +1,97 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_0000000A[] = {
+	0x07230203,0x00010000,0x00080007,0x00000040,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002e,0x00020011,0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,
+	0x00000000,0x0003000e,0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,
+	0x00000000,0x00000009,0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,
+	0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00080005,
+	0x00000009,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,
+	0x0000000f,0x68737550,0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000000f,0x00000000,
+	0x74736564,0x7366664f,0x00007465,0x00050006,0x0000000f,0x00000001,0x657a6973,0x00000000,
+	0x00060006,0x0000000f,0x00000002,0x4f637273,0x65736666,0x00000074,0x00050006,0x0000000f,
+	0x00000003,0x64646170,0x00676e69,0x00060006,0x0000000f,0x00000004,0x61656c63,0x6c615672,
+	0x00006575,0x00040005,0x00000011,0x61726170,0x0000736d,0x00050005,0x0000001d,0x74736564,
+	0x65646e49,0x00000078,0x00050005,0x00000025,0x49637273,0x7865646e,0x00000000,0x00050005,
+	0x0000002e,0x56637273,0x65756c61,0x00000000,0x00030005,0x00000032,0x00637273,0x00040005,
+	0x00000039,0x74736564,0x00000000,0x00040047,0x00000009,0x0000000b,0x0000001c,0x00050048,
+	0x0000000f,0x00000000,0x00000023,0x00000000,0x00050048,0x0000000f,0x00000001,0x00000023,
+	0x00000004,0x00050048,0x0000000f,0x00000002,0x00000023,0x00000008,0x00050048,0x0000000f,
+	0x00000003,0x00000023,0x0000000c,0x00050048,0x0000000f,0x00000004,0x00000023,0x00000010,
+	0x00030047,0x0000000f,0x00000002,0x00040047,0x00000032,0x00000022,0x00000000,0x00040047,
+	0x00000032,0x00000021,0x00000001,0x00040047,0x00000039,0x00000022,0x00000000,0x00040047,
+	0x00000039,0x00000021,0x00000000,0x00030047,0x00000039,0x00000019,0x00040047,0x0000003f,
+	0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
+	0x00000006,0x00000020,0x00000000,0x00040017,0x00000007,0x00000006,0x00000003,0x00040020,
+	0x00000008,0x00000001,0x00000007,0x0004003b,0x00000008,0x00000009,0x00000001,0x0004002b,
+	0x00000006,0x0000000a,0x00000000,0x00040020,0x0000000b,0x00000001,0x00000006,0x00040017,
+	0x0000000e,0x00000006,0x00000004,0x0007001e,0x0000000f,0x00000006,0x00000006,0x00000006,
+	0x00000006,0x0000000e,0x00040020,0x00000010,0x00000009,0x0000000f,0x0004003b,0x00000010,
+	0x00000011,0x00000009,0x00040015,0x00000012,0x00000020,0x00000001,0x0004002b,0x00000012,
+	0x00000013,0x00000001,0x00040020,0x00000014,0x00000009,0x00000006,0x00020014,0x00000017,
+	0x00040020,0x0000001c,0x00000007,0x00000012,0x0004002b,0x00000012,0x0000001e,0x00000000,
+	0x0004002b,0x00000012,0x00000026,0x00000002,0x00040020,0x0000002d,0x00000007,0x0000000e,
+	0x00090019,0x0000002f,0x00000006,0x00000005,0x00000000,0x00000000,0x00000000,0x00000001,
+	0x00000000,0x0003001b,0x00000030,0x0000002f,0x00040020,0x00000031,0x00000000,0x00000030,
+	0x0004003b,0x00000031,0x00000032,0x00000000,0x00090019,0x00000037,0x00000006,0x00000005,
+	0x00000000,0x00000000,0x00000000,0x00000002,0x0000001e,0x00040020,0x00000038,0x00000000,
+	0x00000037,0x0004003b,0x00000038,0x00000039,0x00000000,0x0004002b,0x00000006,0x0000003d,
+	0x00000040,0x0004002b,0x00000006,0x0000003e,0x00000001,0x0006002c,0x00000007,0x0000003f,
+	0x0000003d,0x0000003e,0x0000003e,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,
+	0x000200f8,0x00000005,0x0004003b,0x0000001c,0x0000001d,0x00000007,0x0004003b,0x0000001c,
+	0x00000025,0x00000007,0x0004003b,0x0000002d,0x0000002e,0x00000007,0x00050041,0x0000000b,
+	0x0000000c,0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000000d,0x0000000c,0x00050041,
+	0x00000014,0x00000015,0x00000011,0x00000013,0x0004003d,0x00000006,0x00000016,0x00000015,
+	0x000500ae,0x00000017,0x00000018,0x0000000d,0x00000016,0x000300f7,0x0000001a,0x00000000,
+	0x000400fa,0x00000018,0x00000019,0x0000001a,0x000200f8,0x00000019,0x000100fd,0x000200f8,
+	0x0000001a,0x00050041,0x00000014,0x0000001f,0x00000011,0x0000001e,0x0004003d,0x00000006,
+	0x00000020,0x0000001f,0x00050041,0x0000000b,0x00000021,0x00000009,0x0000000a,0x0004003d,
+	0x00000006,0x00000022,0x00000021,0x00050080,0x00000006,0x00000023,0x00000020,0x00000022,
+	0x0004007c,0x00000012,0x00000024,0x00000023,0x0003003e,0x0000001d,0x00000024,0x00050041,
+	0x00000014,0x00000027,0x00000011,0x00000026,0x0004003d,0x00000006,0x00000028,0x00000027,
+	0x00050041,0x0000000b,0x00000029,0x00000009,0x0000000a,0x0004003d,0x00000006,0x0000002a,
+	0x00000029,0x00050080,0x00000006,0x0000002b,0x00000028,0x0000002a,0x0004007c,0x00000012,
+	0x0000002c,0x0000002b,0x0003003e,0x00000025,0x0000002c,0x0004003d,0x00000030,0x00000033,
+	0x00000032,0x0004003d,0x00000012,0x00000034,0x00000025,0x00040064,0x0000002f,0x00000035,
+	0x00000033,0x0005005f,0x0000000e,0x00000036,0x00000035,0x00000034,0x0003003e,0x0000002e,
+	0x00000036,0x0004003d,0x00000037,0x0000003a,0x00000039,0x0004003d,0x00000012,0x0000003b,
+	0x0000001d,0x0004003d,0x0000000e,0x0000003c,0x0000002e,0x00040063,0x0000003a,0x0000003b,
+	0x0000003c,0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimageBuffer dest;
+
+layout(set = 0, binding = 1)uniform usamplerBuffer src;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        uvec4 clearValue;
+} params;
+
+void main()
+{
+
+    if(gl_GlobalInvocationID . x >= params . size)
+        return;
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        uvec4 srcValue = texelFetch(src, srcIndex);
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc
new file mode 100644
index 0000000..e261d1b
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc
@@ -0,0 +1,89 @@
+	// 7.10.2904
+	 #pragma once
+const uint32_t kBufferUtils_comp_0000000B[] = {
+	0x07230203,0x00010000,0x00080007,0x00000036,0x00000000,0x00020011,0x00000001,0x00020011,
+	0x0000002e,0x00020011,0x0000002f,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,
+	0x00000000,0x0003000e,0x00000000,0x00000001,0x0006000f,0x00000005,0x00000004,0x6e69616d,
+	0x00000000,0x00000014,0x00060010,0x00000004,0x00000011,0x00000040,0x00000001,0x00000001,
+	0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00050005,
+	0x00000008,0x74736564,0x65646e49,0x00000078,0x00060005,0x0000000b,0x68737550,0x736e6f43,
+	0x746e6174,0x00000073,0x00060006,0x0000000b,0x00000000,0x74736564,0x7366664f,0x00007465,
+	0x00050006,0x0000000b,0x00000001,0x657a6973,0x00000000,0x00060006,0x0000000b,0x00000002,
+	0x4f637273,0x65736666,0x00000074,0x00050006,0x0000000b,0x00000003,0x64646170,0x00676e69,
+	0x00060006,0x0000000b,0x00000004,0x61656c63,0x6c615672,0x00006575,0x00040005,0x0000000d,
+	0x61726170,0x0000736d,0x00080005,0x00000014,0x475f6c67,0x61626f6c,0x766e496c,0x7461636f,
+	0x496e6f69,0x00000044,0x00050005,0x0000001b,0x49637273,0x7865646e,0x00000000,0x00050005,
+	0x00000024,0x56637273,0x65756c61,0x00000000,0x00030005,0x00000028,0x00637273,0x00040005,
+	0x0000002f,0x74736564,0x00000000,0x00050048,0x0000000b,0x00000000,0x00000023,0x00000000,
+	0x00050048,0x0000000b,0x00000001,0x00000023,0x00000004,0x00050048,0x0000000b,0x00000002,
+	0x00000023,0x00000008,0x00050048,0x0000000b,0x00000003,0x00000023,0x0000000c,0x00050048,
+	0x0000000b,0x00000004,0x00000023,0x00000010,0x00030047,0x0000000b,0x00000002,0x00040047,
+	0x00000014,0x0000000b,0x0000001c,0x00040047,0x00000028,0x00000022,0x00000000,0x00040047,
+	0x00000028,0x00000021,0x00000001,0x00040047,0x0000002f,0x00000022,0x00000000,0x00040047,
+	0x0000002f,0x00000021,0x00000000,0x00030047,0x0000002f,0x00000019,0x00040047,0x00000035,
+	0x0000000b,0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,
+	0x00000006,0x00000020,0x00000001,0x00040020,0x00000007,0x00000007,0x00000006,0x00040015,
+	0x00000009,0x00000020,0x00000000,0x00040017,0x0000000a,0x00000009,0x00000004,0x0007001e,
+	0x0000000b,0x00000009,0x00000009,0x00000009,0x00000009,0x0000000a,0x00040020,0x0000000c,
+	0x00000009,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000009,0x0004002b,0x00000006,
+	0x0000000e,0x00000000,0x00040020,0x0000000f,0x00000009,0x00000009,0x00040017,0x00000012,
+	0x00000009,0x00000003,0x00040020,0x00000013,0x00000001,0x00000012,0x0004003b,0x00000013,
+	0x00000014,0x00000001,0x0004002b,0x00000009,0x00000015,0x00000000,0x00040020,0x00000016,
+	0x00000001,0x00000009,0x0004002b,0x00000006,0x0000001c,0x00000002,0x00040020,0x00000023,
+	0x00000007,0x0000000a,0x00090019,0x00000025,0x00000009,0x00000005,0x00000000,0x00000000,
+	0x00000000,0x00000001,0x00000000,0x0003001b,0x00000026,0x00000025,0x00040020,0x00000027,
+	0x00000000,0x00000026,0x0004003b,0x00000027,0x00000028,0x00000000,0x00090019,0x0000002d,
+	0x00000009,0x00000005,0x00000000,0x00000000,0x00000000,0x00000002,0x0000001e,0x00040020,
+	0x0000002e,0x00000000,0x0000002d,0x0004003b,0x0000002e,0x0000002f,0x00000000,0x0004002b,
+	0x00000009,0x00000033,0x00000040,0x0004002b,0x00000009,0x00000034,0x00000001,0x0006002c,
+	0x00000012,0x00000035,0x00000033,0x00000034,0x00000034,0x00050036,0x00000002,0x00000004,
+	0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000007,0x00000008,0x00000007,
+	0x0004003b,0x00000007,0x0000001b,0x00000007,0x0004003b,0x00000023,0x00000024,0x00000007,
+	0x00050041,0x0000000f,0x00000010,0x0000000d,0x0000000e,0x0004003d,0x00000009,0x00000011,
+	0x00000010,0x00050041,0x00000016,0x00000017,0x00000014,0x00000015,0x0004003d,0x00000009,
+	0x00000018,0x00000017,0x00050080,0x00000009,0x00000019,0x00000011,0x00000018,0x0004007c,
+	0x00000006,0x0000001a,0x00000019,0x0003003e,0x00000008,0x0000001a,0x00050041,0x0000000f,
+	0x0000001d,0x0000000d,0x0000001c,0x0004003d,0x00000009,0x0000001e,0x0000001d,0x00050041,
+	0x00000016,0x0000001f,0x00000014,0x00000015,0x0004003d,0x00000009,0x00000020,0x0000001f,
+	0x00050080,0x00000009,0x00000021,0x0000001e,0x00000020,0x0004007c,0x00000006,0x00000022,
+	0x00000021,0x0003003e,0x0000001b,0x00000022,0x0004003d,0x00000026,0x00000029,0x00000028,
+	0x0004003d,0x00000006,0x0000002a,0x0000001b,0x00040064,0x00000025,0x0000002b,0x00000029,
+	0x0005005f,0x0000000a,0x0000002c,0x0000002b,0x0000002a,0x0003003e,0x00000024,0x0000002c,
+	0x0004003d,0x0000002d,0x00000030,0x0000002f,0x0004003d,0x00000006,0x00000031,0x00000008,
+	0x0004003d,0x0000000a,0x00000032,0x00000024,0x00040063,0x00000030,0x00000031,0x00000032,
+	0x000100fd,0x00010038
+};
+
+#if 0  // Generated from:
+#version 450 core
+
+layout(local_size_x = 64, local_size_y = 1, local_size_z = 1)in;
+
+layout(set = 0, binding = 0, rgba32ui)uniform writeonly uimageBuffer dest;
+
+layout(set = 0, binding = 1)uniform usamplerBuffer src;
+
+layout(push_constant)uniform PushConstants
+{
+
+    uint destOffset;
+
+    uint size;
+
+    uint srcOffset;
+    uint padding;
+
+        uvec4 clearValue;
+} params;
+
+void main()
+{
+
+    int destIndex = int(params . destOffset . x + gl_GlobalInvocationID . x);
+    int srcIndex = int(params . srcOffset . x + gl_GlobalInvocationID . x);
+
+        uvec4 srcValue = texelFetch(src, srcIndex);
+
+    imageStore(dest, destIndex, srcValue);
+}
+#endif  // Preprocessed code
diff --git a/src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp b/src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp
new file mode 100644
index 0000000..328b1df
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp
@@ -0,0 +1,82 @@
+//
+// Copyright 2018 The ANGLE Project Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+// BufferUtils.comp: various utilities such as clear and copy.
+//
+// The following defines tweak the functionality, and a different shader is built based on these.
+//
+//   - Flags:
+//     * IsAligned: if true, assumes the workgroup size divides the buffer size, so there is no
+//                  need for bound checking
+//   - Format:
+//     * IsFloat
+//     * IsInt
+//     * IsUint
+//   - Function:
+//     * IsClear: the buffer will be cleared
+//     * IsCopy: a buffer will be copied to another
+//
+
+#version 450 core
+
+layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
+
+#if IsFloat
+#define ADD_TYPE_PREFIX(type) type
+#define BUFFER_FORMAT rgba32f
+#define GVEC4 vec4
+#elif IsInt
+#define ADD_TYPE_PREFIX(type) i ## type
+#define BUFFER_FORMAT rgba32i
+#define GVEC4 ivec4
+#elif IsUint
+#define ADD_TYPE_PREFIX(type) u ## type
+#define BUFFER_FORMAT rgba32ui
+#define GVEC4 uvec4
+#else
+#error "Not all formats are accounted for"
+#endif
+
+#define BUFFER_WRITE_TYPE ADD_TYPE_PREFIX(imageBuffer)
+#define BUFFER_READ_TYPE ADD_TYPE_PREFIX(samplerBuffer)
+
+layout (set = 0, binding = 0, BUFFER_FORMAT) uniform writeonly BUFFER_WRITE_TYPE dest;
+#if IsCopy
+layout (set = 0, binding = 1) uniform BUFFER_READ_TYPE src;
+#endif // IsCopy
+
+layout (push_constant) uniform PushConstants
+{
+    // destOffset: used in all cases
+    uint destOffset;
+    // size: used if !IsAligned
+    uint size;
+    // srcOffset: used if IsCopy
+    uint srcOffset;
+    uint padding;
+    // clearValue: used if IsClear
+    GVEC4 clearValue;
+} params;
+
+void main()
+{
+#if !IsAligned
+    if (gl_GlobalInvocationID.x >= params.size)
+        return;
+#endif // IsAligned
+
+    int destIndex = int(params.destOffset.x + gl_GlobalInvocationID.x);
+    int srcIndex = int(params.srcOffset.x + gl_GlobalInvocationID.x);
+
+#if IsClear
+    GVEC4 srcValue = params.clearValue;
+#elif IsCopy
+    GVEC4 srcValue = texelFetch(src, srcIndex);
+#else
+#error "Not all functions are accounted for"
+#endif // Function
+
+    imageStore(dest, destIndex, srcValue);
+}
diff --git a/src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp.json b/src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp.json
new file mode 100644
index 0000000..0bf883d
--- /dev/null
+++ b/src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp.json
@@ -0,0 +1,22 @@
+{
+    "Description": [
+        "Copyright 2018 The ANGLE Project Authors. All rights reserved.",
+        "Use of this source code is governed by a BSD-style license that can be",
+        "found in the LICENSE file.",
+        "",
+        "BufferUtils.comp.json: Build parameters for BufferUtils.comp."
+    ],
+    "Flags": [
+        "IsAligned"
+    ],
+    "Format": [
+        "IsFloat",
+        "IsInt",
+        "IsUint"
+    ],
+    "Function": [
+        "IsClear",
+        "IsCopy"
+    ]
+}
+
diff --git a/src/libANGLE/renderer/vulkan/vk_format_utils.cpp b/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
index edccfd3..ef2bcd2 100644
--- a/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_format_utils.cpp
@@ -120,7 +120,10 @@
       textureInitializerFunction(nullptr),
       textureLoadFunctions(),
       vertexLoadRequiresConversion(false),
-      vkBufferFormatIsPacked(false)
+      vkBufferFormatIsPacked(false),
+      vkSupportsStorageBuffer(false),
+      vkFormatIsInt(false),
+      vkFormatIsUnsigned(false)
 {}
 
 void Format::initTextureFallback(RendererVk *renderer,
@@ -196,6 +199,9 @@
             continue;
         }
 
+        format.vkSupportsStorageBuffer = renderer->hasBufferFormatFeatureBits(
+            format.vkBufferFormat, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT);
+
         gl::TextureCaps textureCaps;
         FillTextureFormatCaps(renderer, format.vkTextureFormat, &textureCaps);
         outTextureCapsMap->set(formatID, textureCaps);
diff --git a/src/libANGLE/renderer/vulkan/vk_format_utils.h b/src/libANGLE/renderer/vulkan/vk_format_utils.h
index f96d611..348a24c 100644
--- a/src/libANGLE/renderer/vulkan/vk_format_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_format_utils.h
@@ -77,6 +77,9 @@
 
     bool vertexLoadRequiresConversion;
     bool vkBufferFormatIsPacked;
+    bool vkSupportsStorageBuffer;
+    bool vkFormatIsInt;
+    bool vkFormatIsUnsigned;
 };
 
 bool operator==(const Format &lhs, const Format &rhs);
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index 49bff15..08c29b5 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -21,7 +21,8 @@
 namespace
 {
 constexpr VkBufferUsageFlags kLineLoopDynamicBufferUsage =
-    (VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT);
+    VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
+    VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
 constexpr int kLineLoopDynamicBufferMinSize = 1024 * 1024;
 
 // This is an arbitrary max. We can change this later if necessary.
@@ -890,6 +891,7 @@
       mMemoryPropertyFlags{},
       mSize(0),
       mMappedMemory(nullptr),
+      mViewFormat(nullptr),
       mCurrentWriteAccess(0),
       mCurrentReadAccess(0)
 {}
@@ -909,7 +911,8 @@
 void BufferHelper::destroy(VkDevice device)
 {
     unmap(device);
-    mSize = 0;
+    mSize       = 0;
+    mViewFormat = nullptr;
 
     mBuffer.destroy(device);
     mBufferView.destroy(device);
@@ -919,7 +922,8 @@
 void BufferHelper::release(RendererVk *renderer)
 {
     unmap(renderer->getDevice());
-    mSize = 0;
+    mSize       = 0;
+    mViewFormat = nullptr;
 
     renderer->releaseObject(getStoredQueueSerial(), &mBuffer);
     renderer->releaseObject(getStoredQueueSerial(), &mBufferView);
@@ -980,9 +984,14 @@
 
 angle::Result BufferHelper::initBufferView(Context *context, const Format &format)
 {
-    ASSERT(!mBufferView.valid());
     ASSERT(format.valid());
 
+    if (mBufferView.valid())
+    {
+        ASSERT(mViewFormat->vkBufferFormat == format.vkBufferFormat);
+        return angle::Result::Continue();
+    }
+
     VkBufferViewCreateInfo viewCreateInfo = {};
     viewCreateInfo.sType                  = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
     viewCreateInfo.buffer                 = mBuffer.getHandle();
@@ -991,6 +1000,7 @@
     viewCreateInfo.range                  = mSize;
 
     ANGLE_VK_TRY(context, mBufferView.init(context->getDevice(), viewCreateInfo));
+    mViewFormat = &format;
 
     return angle::Result::Continue();
 }
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index 418cd6a..ef87a2f 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -400,17 +400,19 @@
                                  const Buffer &buffer,
                                  const VkBufferCopy &copyRegion);
 
-    angle::Result getBufferView(Context *context, const Format &format, BufferView **bufferViewOut)
-    {
-        // Note: currently only one view is allowed.  If needs be, multiple views can be created
-        // based on format.
-        if (!mBufferView.valid())
-        {
-            ANGLE_TRY(initBufferView(context, format));
-        }
+    // Note: currently only one view is allowed.  If needs be, multiple views can be created
+    // based on format.
+    angle::Result initBufferView(Context *context, const Format &format);
 
-        *bufferViewOut = &mBufferView;
-        return angle::Result::Continue();
+    const BufferView &getBufferView() const
+    {
+        ASSERT(mBufferView.valid());
+        return mBufferView;
+    }
+    const Format &getViewFormat() const
+    {
+        ASSERT(mViewFormat);
+        return *mViewFormat;
     }
 
     angle::Result map(Context *context, uint8_t **ptrOut)
@@ -432,7 +434,6 @@
 
   private:
     angle::Result mapImpl(Context *context);
-    angle::Result initBufferView(Context *context, const Format &format);
 
     // Vulkan objects.
     Buffer mBuffer;
@@ -443,6 +444,7 @@
     VkMemoryPropertyFlags mMemoryPropertyFlags;
     VkDeviceSize mSize;
     uint8_t *mMappedMemory;
+    const Format *mViewFormat;
 
     // For memory barriers.
     VkFlags mCurrentWriteAccess;
diff --git a/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp b/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp
index 87ad3ac..caa3c28 100644
--- a/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp
@@ -16,6 +16,18 @@
 {
 namespace
 {
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000002.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000003.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000004.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000005.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000006.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000007.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000008.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000009.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000A.inc"
+#include "libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.0000000B.inc"
 #include "libANGLE/renderer/vulkan/shaders/gen/FullScreenQuad.vert.00000000.inc"
 #include "libANGLE/renderer/vulkan/shaders/gen/PushConstantColor.frag.00000000.inc"
 
@@ -26,6 +38,20 @@
     size_t codeSize;
 };
 
+constexpr ShaderBlob kBufferUtils_comp_shaders[] = {
+    {kBufferUtils_comp_00000000, sizeof(kBufferUtils_comp_00000000)},
+    {kBufferUtils_comp_00000001, sizeof(kBufferUtils_comp_00000001)},
+    {kBufferUtils_comp_00000002, sizeof(kBufferUtils_comp_00000002)},
+    {kBufferUtils_comp_00000003, sizeof(kBufferUtils_comp_00000003)},
+    {kBufferUtils_comp_00000004, sizeof(kBufferUtils_comp_00000004)},
+    {kBufferUtils_comp_00000005, sizeof(kBufferUtils_comp_00000005)},
+    {kBufferUtils_comp_00000006, sizeof(kBufferUtils_comp_00000006)},
+    {kBufferUtils_comp_00000007, sizeof(kBufferUtils_comp_00000007)},
+    {kBufferUtils_comp_00000008, sizeof(kBufferUtils_comp_00000008)},
+    {kBufferUtils_comp_00000009, sizeof(kBufferUtils_comp_00000009)},
+    {kBufferUtils_comp_0000000A, sizeof(kBufferUtils_comp_0000000A)},
+    {kBufferUtils_comp_0000000B, sizeof(kBufferUtils_comp_0000000B)},
+};
 constexpr ShaderBlob kFullScreenQuad_vert_shaders[] = {
     {kFullScreenQuad_vert_00000000, sizeof(kFullScreenQuad_vert_00000000)},
 };
@@ -63,6 +89,10 @@
 
 void ShaderLibrary::destroy(VkDevice device)
 {
+    for (RefCounted<ShaderAndSerial> &shader : mBufferUtils_comp_shaders)
+    {
+        shader.get().destroy(device);
+    }
     for (RefCounted<ShaderAndSerial> &shader : mFullScreenQuad_vert_shaders)
     {
         shader.get().destroy(device);
@@ -73,6 +103,14 @@
     }
 }
 
+angle::Result ShaderLibrary::getBufferUtils_comp(Context *context,
+                                                 uint32_t shaderFlags,
+                                                 RefCounted<ShaderAndSerial> **shaderOut)
+{
+    return GetShader(context, mBufferUtils_comp_shaders, kBufferUtils_comp_shaders,
+                     ArraySize(kBufferUtils_comp_shaders), shaderFlags, shaderOut);
+}
+
 angle::Result ShaderLibrary::getFullScreenQuad_vert(Context *context,
                                                     uint32_t shaderFlags,
                                                     RefCounted<ShaderAndSerial> **shaderOut)
diff --git a/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni b/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni
index 3b70792..e09d9f2 100644
--- a/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni
+++ b/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.gni
@@ -9,6 +9,18 @@
 #   List of generated shaders for inclusion in ANGLE's build process.
 
 angle_vulkan_internal_shaders = [
+  "shaders/gen/BufferUtils.comp.00000000.inc",
+  "shaders/gen/BufferUtils.comp.00000001.inc",
+  "shaders/gen/BufferUtils.comp.00000002.inc",
+  "shaders/gen/BufferUtils.comp.00000003.inc",
+  "shaders/gen/BufferUtils.comp.00000004.inc",
+  "shaders/gen/BufferUtils.comp.00000005.inc",
+  "shaders/gen/BufferUtils.comp.00000006.inc",
+  "shaders/gen/BufferUtils.comp.00000007.inc",
+  "shaders/gen/BufferUtils.comp.00000008.inc",
+  "shaders/gen/BufferUtils.comp.00000009.inc",
+  "shaders/gen/BufferUtils.comp.0000000A.inc",
+  "shaders/gen/BufferUtils.comp.0000000B.inc",
   "shaders/gen/FullScreenQuad.vert.00000000.inc",
   "shaders/gen/PushConstantColor.frag.00000000.inc",
 ]
diff --git a/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h b/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h
index 620a05f..fb4aab7 100644
--- a/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h
+++ b/src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h
@@ -19,6 +19,28 @@
 {
 namespace InternalShader
 {
+namespace BufferUtils_comp
+{
+enum flags
+{
+    kIsAligned = 0x00000001,
+    kFlagsMask = 0x00000001,
+};
+enum Function
+{
+    kIsClear      = 0x00000000,
+    kIsCopy       = 0x00000002,
+    kFunctionMask = 0x00000002,
+};
+enum Format
+{
+    kIsFloat    = 0x00000000,
+    kIsInt      = 0x00000004,
+    kIsUint     = 0x00000008,
+    kFormatMask = 0x0000000C,
+};
+}  // namespace BufferUtils_comp
+
 namespace FullScreenQuad_vert
 {}  // namespace FullScreenQuad_vert
 
@@ -35,6 +57,9 @@
 
     void destroy(VkDevice device);
 
+    angle::Result getBufferUtils_comp(Context *context,
+                                      uint32_t shaderFlags,
+                                      RefCounted<ShaderAndSerial> **shaderOut);
     angle::Result getFullScreenQuad_vert(Context *context,
                                          uint32_t shaderFlags,
                                          RefCounted<ShaderAndSerial> **shaderOut);
@@ -43,6 +68,10 @@
                                             RefCounted<ShaderAndSerial> **shaderOut);
 
   private:
+    RefCounted<ShaderAndSerial>
+        mBufferUtils_comp_shaders[InternalShader::BufferUtils_comp::kFlagsMask |
+                                  InternalShader::BufferUtils_comp::kFunctionMask |
+                                  InternalShader::BufferUtils_comp::kFormatMask];
     RefCounted<ShaderAndSerial> mFullScreenQuad_vert_shaders[1];
     RefCounted<ShaderAndSerial> mPushConstantColor_frag_shaders[1];
 };
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.cpp b/src/libANGLE/renderer/vulkan/vk_utils.cpp
index e95a89a..f2c5945 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_utils.cpp
@@ -1250,6 +1250,9 @@
         case HandleType::Buffer:
             vkDestroyBuffer(device, reinterpret_cast<VkBuffer>(mHandle), nullptr);
             break;
+        case HandleType::BufferView:
+            vkDestroyBufferView(device, reinterpret_cast<VkBufferView>(mHandle), nullptr);
+            break;
         case HandleType::Image:
             vkDestroyImage(device, reinterpret_cast<VkImage>(mHandle), nullptr);
             break;
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.h b/src/libANGLE/renderer/vulkan/vk_utils.h
index 30b1532..3496735 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -400,6 +400,12 @@
                          firstInstance);
     }
 
+    void dispatch(uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ)
+    {
+        ASSERT(valid());
+        vkCmdDispatch(mHandle, groupCountX, groupCountY, groupCountZ);
+    }
+
     void bindPipeline(VkPipelineBindPoint pipelineBindPoint, const Pipeline &pipeline);
     void bindVertexBuffers(uint32_t firstBinding,
                            uint32_t bindingCount,
diff --git a/src/libGLESv2.gni b/src/libGLESv2.gni
index be79c6b..25f009d 100644
--- a/src/libGLESv2.gni
+++ b/src/libGLESv2.gni
@@ -703,6 +703,8 @@
   "src/libANGLE/renderer/vulkan/ContextVk.h",
   "src/libANGLE/renderer/vulkan/DeviceVk.cpp",
   "src/libANGLE/renderer/vulkan/DeviceVk.h",
+  "src/libANGLE/renderer/vulkan/DispatchUtilsVk.cpp",
+  "src/libANGLE/renderer/vulkan/DispatchUtilsVk.h",
   "src/libANGLE/renderer/vulkan/DisplayVk.cpp",
   "src/libANGLE/renderer/vulkan/DisplayVk.h",
   "src/libANGLE/renderer/vulkan/FenceNVVk.cpp",