Vulkan: Clean up Error usage.

* Adds a nodiscard to the Error class.
* Fixes the places where Error was discard.
* Uses more vk::Error instead of gl::Error.

This enables the Vulkan back-end Error refactoring.

Bug: angleproject:2713
Change-Id: I09606d965e8b7cfd341ad7fb95cf029b9d694ef4
Reviewed-on: https://chromium-review.googlesource.com/1128922
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Frank Henigman <fjhenigman@chromium.org>
diff --git a/src/libANGLE/renderer/vulkan/CommandGraph.cpp b/src/libANGLE/renderer/vulkan/CommandGraph.cpp
index 939f163..1a991ad 100644
--- a/src/libANGLE/renderer/vulkan/CommandGraph.cpp
+++ b/src/libANGLE/renderer/vulkan/CommandGraph.cpp
@@ -459,7 +459,7 @@
 {
     if (mOutsideRenderPassCommands.valid())
     {
-        mOutsideRenderPassCommands.end();
+        ANGLE_TRY(mOutsideRenderPassCommands.end());
         primaryCommandBuffer->executeCommands(1, &mOutsideRenderPassCommands);
     }
 
@@ -471,7 +471,7 @@
         ANGLE_TRY(
             renderPassCache->getCompatibleRenderPass(device, serial, mRenderPassDesc, &renderPass));
 
-        mInsideRenderPassCommands.end();
+        ANGLE_TRY(mInsideRenderPassCommands.end());
 
         VkRenderPassBeginInfo beginInfo;
         beginInfo.sType                    = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
index bfdf0da..9d16033 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.cpp
@@ -1052,7 +1052,7 @@
     return mEmulatedAlphaAttachmentMask;
 }
 
-gl::Error FramebufferVk::readPixelsImpl(const gl::Context *context,
+vk::Error FramebufferVk::readPixelsImpl(const gl::Context *context,
                                         const gl::Rectangle &area,
                                         const PackPixelsParams &packPixelsParams,
                                         void *pixels)
@@ -1082,8 +1082,8 @@
     uint32_t stagingOffset           = 0;
     size_t allocationSize            = area.width * angleFormat.pixelBytes * area.height;
 
-    mReadPixelsBuffer.allocate(renderer, allocationSize, &readPixelBuffer, &bufferHandle,
-                               &stagingOffset, &newBufferAllocated);
+    ANGLE_TRY(mReadPixelsBuffer.allocate(renderer, allocationSize, &readPixelBuffer, &bufferHandle,
+                                         &stagingOffset, &newBufferAllocated));
 
     VkBufferImageCopy region;
     region.bufferImageHeight               = area.height;
diff --git a/src/libANGLE/renderer/vulkan/FramebufferVk.h b/src/libANGLE/renderer/vulkan/FramebufferVk.h
index 68c591c..402a89e 100644
--- a/src/libANGLE/renderer/vulkan/FramebufferVk.h
+++ b/src/libANGLE/renderer/vulkan/FramebufferVk.h
@@ -94,7 +94,7 @@
                                       vk::RecordingMode *modeOut);
 
     // Internal helper function for readPixels operations.
-    gl::Error readPixelsImpl(const gl::Context *context,
+    vk::Error readPixelsImpl(const gl::Context *context,
                              const gl::Rectangle &area,
                              const PackPixelsParams &packPixelsParams,
                              void *pixels);
diff --git a/src/libANGLE/renderer/vulkan/RendererVk.cpp b/src/libANGLE/renderer/vulkan/RendererVk.cpp
index a9b2b1e..727d68e 100644
--- a/src/libANGLE/renderer/vulkan/RendererVk.cpp
+++ b/src/libANGLE/renderer/vulkan/RendererVk.cpp
@@ -816,7 +816,7 @@
     poolInfo.flags            = 0;
     poolInfo.queueFamilyIndex = mCurrentQueueFamilyIndex;
 
-    mCommandPool.init(mDevice, poolInfo);
+    ANGLE_TRY(mCommandPool.init(mDevice, poolInfo));
 
     return vk::NoError();
 }
diff --git a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
index 65b1916..0f12ba9 100644
--- a/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
+++ b/src/libANGLE/renderer/vulkan/SurfaceVk.cpp
@@ -282,7 +282,7 @@
     VkInstance instance        = renderer->getInstance();
 
     // We might not need to flush the pipe here.
-    renderer->finish(display->getProxyContext());
+    ANGLE_SWALLOW_ERR(renderer->finish(display->getProxyContext()));
 
     mAcquireNextImageSemaphore.destroy(device);
 
@@ -483,8 +483,9 @@
     {
         SwapchainImage &member = mSwapchainImages[imageIndex];
         member.image.init2DWeakReference(swapchainImages[imageIndex], extents, format, 1);
-        member.image.initImageView(device, gl::TextureType::_2D, VK_IMAGE_ASPECT_COLOR_BIT,
-                                   gl::SwizzleState(), &member.imageView, 1);
+        ANGLE_TRY(member.image.initImageView(device, gl::TextureType::_2D,
+                                             VK_IMAGE_ASPECT_COLOR_BIT, gl::SwizzleState(),
+                                             &member.imageView, 1));
 
         // Set transfer dest layout, and clear the image to black.
         member.image.clearColor(transparentBlack, 0, 1, commandBuffer);
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.cpp b/src/libANGLE/renderer/vulkan/TextureVk.cpp
index d08f830..658b1ac 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.cpp
+++ b/src/libANGLE/renderer/vulkan/TextureVk.cpp
@@ -91,7 +91,7 @@
         mSubresourceUpdates.end());
 }
 
-gl::Error PixelBuffer::stageSubresourceUpdate(ContextVk *contextVk,
+vk::Error PixelBuffer::stageSubresourceUpdate(ContextVk *contextVk,
                                               const gl::ImageIndex &index,
                                               const gl::Extents &extents,
                                               const gl::Offset &offset,
@@ -101,19 +101,19 @@
                                               const uint8_t *pixels)
 {
     GLuint inputRowPitch = 0;
-    ANGLE_TRY_CHECKED_MATH(formatInfo.computeRowPitch(type, extents.width, unpack.alignment,
-                                                      unpack.rowLength, &inputRowPitch));
+    ANGLE_TRY_VK_CHECKED_MATH(formatInfo.computeRowPitch(type, extents.width, unpack.alignment,
+                                                         unpack.rowLength, &inputRowPitch));
 
     GLuint inputDepthPitch = 0;
-    ANGLE_TRY_CHECKED_MATH(formatInfo.computeDepthPitch(extents.height, unpack.imageHeight,
-                                                        inputRowPitch, &inputDepthPitch));
+    ANGLE_TRY_VK_CHECKED_MATH(formatInfo.computeDepthPitch(extents.height, unpack.imageHeight,
+                                                           inputRowPitch, &inputDepthPitch));
 
     // TODO(jmadill): skip images for 3D Textures.
     bool applySkipImages = false;
 
     GLuint inputSkipBytes = 0;
-    ANGLE_TRY_CHECKED_MATH(formatInfo.computeSkipBytes(type, inputRowPitch, inputDepthPitch, unpack,
-                                                       applySkipImages, &inputSkipBytes));
+    ANGLE_TRY_VK_CHECKED_MATH(formatInfo.computeSkipBytes(
+        type, inputRowPitch, inputDepthPitch, unpack, applySkipImages, &inputSkipBytes));
 
     RendererVk *renderer = contextVk->getRenderer();
 
@@ -129,8 +129,8 @@
     bool newBufferAllocated = false;
     uint32_t stagingOffset  = 0;
     size_t allocationSize   = outputDepthPitch * extents.depth;
-    mStagingBuffer.allocate(renderer, allocationSize, &stagingPointer, &bufferHandle,
-                            &stagingOffset, &newBufferAllocated);
+    ANGLE_TRY(mStagingBuffer.allocate(renderer, allocationSize, &stagingPointer, &bufferHandle,
+                                      &stagingOffset, &newBufferAllocated));
 
     const uint8_t *source = pixels + inputSkipBytes;
 
@@ -154,10 +154,10 @@
 
     mSubresourceUpdates.emplace_back(bufferHandle, copy);
 
-    return gl::NoError();
+    return vk::NoError();
 }
 
-gl::Error PixelBuffer::stageSubresourceUpdateFromFramebuffer(const gl::Context *context,
+vk::Error PixelBuffer::stageSubresourceUpdateFromFramebuffer(const gl::Context *context,
                                                              const gl::ImageIndex &index,
                                                              const gl::Rectangle &sourceArea,
                                                              const gl::Offset &dstOffset,
@@ -174,7 +174,7 @@
                        &clippedRectangle))
     {
         // Empty source area, nothing to do.
-        return gl::NoError();
+        return vk::NoError();
     }
 
     bool isViewportFlipEnabled = contextVk->isViewportFlipEnabledForDrawFBO();
@@ -201,8 +201,8 @@
 
     // The destination is only one layer deep.
     size_t allocationSize = outputDepthPitch;
-    mStagingBuffer.allocate(renderer, allocationSize, &stagingPointer, &bufferHandle,
-                            &stagingOffset, &newBufferAllocated);
+    ANGLE_TRY(mStagingBuffer.allocate(renderer, allocationSize, &stagingPointer, &bufferHandle,
+                                      &stagingOffset, &newBufferAllocated));
 
     gl::PixelPackState pixelPackState = gl::PixelPackState();
     // TODO(lucferron): The pixel pack state alignment should probably be 1 instead of 4.
@@ -229,7 +229,7 @@
         size_t bufferSize =
             storageFormat.pixelBytes * clippedRectangle.width * clippedRectangle.height;
         angle::MemoryBuffer *memoryBuffer = nullptr;
-        ANGLE_TRY_ALLOCATION(context->getScratchBuffer(bufferSize, &memoryBuffer));
+        ANGLE_TRY_VK_ALLOCATION(context->getScratchBuffer(bufferSize, &memoryBuffer));
 
         // Read into the scratch buffer
         ANGLE_TRY(
@@ -260,10 +260,10 @@
 
     // 3- enqueue the destination image subresource update
     mSubresourceUpdates.emplace_back(bufferHandle, copyToImage);
-    return gl::NoError();
+    return vk::NoError();
 }
 
-gl::Error PixelBuffer::allocate(RendererVk *renderer,
+vk::Error PixelBuffer::allocate(RendererVk *renderer,
                                 size_t sizeInBytes,
                                 uint8_t **ptrOut,
                                 VkBuffer *handleOut,
@@ -335,7 +335,7 @@
     return mSubresourceUpdates.empty();
 }
 
-gl::Error PixelBuffer::stageSubresourceUpdateAndGetData(RendererVk *renderer,
+vk::Error PixelBuffer::stageSubresourceUpdateAndGetData(RendererVk *renderer,
                                                         size_t allocationSize,
                                                         const gl::ImageIndex &imageIndex,
                                                         const gl::Extents &extents,
@@ -362,10 +362,10 @@
 
     mSubresourceUpdates.emplace_back(bufferHandle, copy);
 
-    return gl::NoError();
+    return vk::NoError();
 }
 
-gl::Error TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk,
+vk::Error TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk,
                                                  const angle::Format &sourceFormat,
                                                  GLuint layer,
                                                  GLuint firstMipLevel,
@@ -412,7 +412,7 @@
         previousLevelRowPitch = destRowPitch;
     }
 
-    return gl::NoError();
+    return vk::NoError();
 }
 
 PixelBuffer::SubresourceUpdate::SubresourceUpdate() : bufferHandle(VK_NULL_HANDLE)
@@ -644,12 +644,12 @@
     return gl::InternalError();
 }
 
-void TextureVk::generateMipmapWithBlit(RendererVk *renderer)
+vk::Error TextureVk::generateMipmapWithBlit(RendererVk *renderer)
 {
     uint32_t imageLayerCount           = GetImageLayerCount(mState.getType());
     const gl::Extents baseLevelExtents = mImage.getExtents();
     vk::CommandBuffer *commandBuffer   = nullptr;
-    getCommandBufferForWrite(renderer, &commandBuffer);
+    ANGLE_TRY(getCommandBufferForWrite(renderer, &commandBuffer));
 
     // We are able to use blitImage since the image format we are using supports it. This
     // is a faster way we can generate the mips.
@@ -719,9 +719,11 @@
     // This is just changing the internal state of the image helper so that the next call
     // to changeLayoutWithStages will use this layout as the "oldLayout" argument.
     mImage.updateLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
+
+    return vk::NoError();
 }
 
-gl::Error TextureVk::generateMipmapWithCPU(const gl::Context *context)
+vk::Error TextureVk::generateMipmapWithCPU(const gl::Context *context)
 {
     ContextVk *contextVk = vk::GetImpl(context);
     RendererVk *renderer = contextVk->getRenderer();
@@ -734,7 +736,7 @@
     size_t baseLevelAllocationSize     = sourceRowPitch * baseLevelExtents.height;
 
     vk::CommandBuffer *commandBuffer = nullptr;
-    getCommandBufferForWrite(renderer, &commandBuffer);
+    ANGLE_TRY(getCommandBufferForWrite(renderer, &commandBuffer));
 
     // Requirement of the copyImageToBuffer, the source image must be in SRC_OPTIMAL layout.
     mImage.changeLayoutWithStages(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
@@ -788,8 +790,7 @@
             sourceRowPitch, baseLevelBuffers + bufferOffset));
     }
 
-    mPixelBuffer.flushUpdatesToImage(renderer, levelCount, &mImage, commandBuffer);
-    return gl::NoError();
+    return mPixelBuffer.flushUpdatesToImage(renderer, levelCount, &mImage, commandBuffer);
 }
 
 gl::Error TextureVk::generateMipmap(const gl::Context *context)
@@ -821,7 +822,7 @@
     // only.
     if (IsMaskFlagSet(kBlitFeatureFlags, imageProperties.linearTilingFeatures))
     {
-        generateMipmapWithBlit(renderer);
+        ANGLE_TRY(generateMipmapWithBlit(renderer));
     }
     else
     {
diff --git a/src/libANGLE/renderer/vulkan/TextureVk.h b/src/libANGLE/renderer/vulkan/TextureVk.h
index 35b7f70..ba48b4d 100644
--- a/src/libANGLE/renderer/vulkan/TextureVk.h
+++ b/src/libANGLE/renderer/vulkan/TextureVk.h
@@ -28,7 +28,7 @@
 
     void removeStagedUpdates(const gl::ImageIndex &index);
 
-    gl::Error stageSubresourceUpdate(ContextVk *contextVk,
+    vk::Error stageSubresourceUpdate(ContextVk *contextVk,
                                      const gl::ImageIndex &index,
                                      const gl::Extents &extents,
                                      const gl::Offset &offset,
@@ -37,14 +37,14 @@
                                      GLenum type,
                                      const uint8_t *pixels);
 
-    gl::Error stageSubresourceUpdateAndGetData(RendererVk *renderer,
+    vk::Error stageSubresourceUpdateAndGetData(RendererVk *renderer,
                                                size_t allocationSize,
                                                const gl::ImageIndex &imageIndex,
                                                const gl::Extents &extents,
                                                const gl::Offset &offset,
                                                uint8_t **destData);
 
-    gl::Error stageSubresourceUpdateFromFramebuffer(const gl::Context *context,
+    vk::Error stageSubresourceUpdateFromFramebuffer(const gl::Context *context,
                                                     const gl::ImageIndex &index,
                                                     const gl::Rectangle &sourceArea,
                                                     const gl::Offset &dstOffset,
@@ -54,7 +54,7 @@
 
     // This will use the underlying dynamic buffer to allocate some memory to be used as a src or
     // dst.
-    gl::Error allocate(RendererVk *renderer,
+    vk::Error allocate(RendererVk *renderer,
                        size_t sizeInBytes,
                        uint8_t **ptrOut,
                        VkBuffer *handleOut,
@@ -178,11 +178,11 @@
     vk::Error ensureImageInitialized(ContextVk *contextVk);
 
   private:
-    void generateMipmapWithBlit(RendererVk *renderer);
+    vk::Error generateMipmapWithBlit(RendererVk *renderer);
 
-    gl::Error generateMipmapWithCPU(const gl::Context *context);
+    vk::Error generateMipmapWithCPU(const gl::Context *context);
 
-    gl::Error generateMipmapLevelsWithCPU(ContextVk *contextVk,
+    vk::Error generateMipmapLevelsWithCPU(ContextVk *contextVk,
                                           const angle::Format &sourceFormat,
                                           GLuint layer,
                                           GLuint firstMipLevel,
diff --git a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
index 28b50bd..dd329e9 100644
--- a/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
+++ b/src/libANGLE/renderer/vulkan/VertexArrayVk.cpp
@@ -529,9 +529,9 @@
             uint8_t *allocatedData      = nullptr;
             bool newBufferAllocated     = false;
             uint32_t expandedDataOffset = 0;
-            mTranslatedByteIndexData.allocate(
+            ANGLE_TRY(mTranslatedByteIndexData.allocate(
                 renderer, static_cast<size_t>(bufferVk->getSize()) * 2, &allocatedData,
-                &mCurrentElementArrayBufferHandle, &expandedDataOffset, &newBufferAllocated);
+                &mCurrentElementArrayBufferHandle, &expandedDataOffset, &newBufferAllocated));
             mCurrentElementArrayBufferOffset = static_cast<VkDeviceSize>(expandedDataOffset);
 
             // Expand the source into the destination
@@ -543,7 +543,7 @@
             }
 
             // Make sure our writes are available.
-            mTranslatedByteIndexData.flush(renderer->getDevice());
+            ANGLE_TRY(mTranslatedByteIndexData.flush(renderer->getDevice()));
             GLboolean result = false;
             ANGLE_TRY(bufferVk->unmap(context, &result));
 
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.cpp b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
index 19ffa61..f5a0214 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.cpp
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.cpp
@@ -359,7 +359,7 @@
 
 LineLoopHelper::~LineLoopHelper() = default;
 
-gl::Error LineLoopHelper::getIndexBufferForDrawArrays(RendererVk *renderer,
+vk::Error LineLoopHelper::getIndexBufferForDrawArrays(RendererVk *renderer,
                                                       const gl::DrawCallParams &drawCallParams,
                                                       VkBuffer *bufferHandleOut,
                                                       VkDeviceSize *offsetOut)
@@ -390,10 +390,10 @@
     // writing.
     ANGLE_TRY(mDynamicIndexBuffer.flush(renderer->getDevice()));
 
-    return gl::NoError();
+    return vk::NoError();
 }
 
-gl::Error LineLoopHelper::getIndexBufferForElementArrayBuffer(RendererVk *renderer,
+vk::Error LineLoopHelper::getIndexBufferForElementArrayBuffer(RendererVk *renderer,
                                                               BufferVk *elementArrayBufferVk,
                                                               VkIndexType indexType,
                                                               int indexCount,
@@ -422,17 +422,17 @@
     std::array<VkBufferCopy, 2> copies = {{copy1, copy2}};
 
     vk::CommandBuffer *commandBuffer;
-    beginWriteResource(renderer, &commandBuffer);
+    ANGLE_TRY(beginWriteResource(renderer, &commandBuffer));
 
     elementArrayBufferVk->addReadDependency(this);
     commandBuffer->copyBuffer(elementArrayBufferVk->getVkBuffer().getHandle(), *bufferHandleOut, 2,
                               copies.data());
 
     ANGLE_TRY(mDynamicIndexBuffer.flush(renderer->getDevice()));
-    return gl::NoError();
+    return vk::NoError();
 }
 
-gl::Error LineLoopHelper::getIndexBufferForClientElementArray(
+vk::Error LineLoopHelper::getIndexBufferForClientElementArray(
     RendererVk *renderer,
     const gl::DrawCallParams &drawCallParams,
     VkBuffer *bufferHandleOut,
@@ -471,7 +471,7 @@
     }
 
     ANGLE_TRY(mDynamicIndexBuffer.flush(renderer->getDevice()));
-    return gl::NoError();
+    return vk::NoError();
 }
 
 void LineLoopHelper::destroy(VkDevice device)
diff --git a/src/libANGLE/renderer/vulkan/vk_helpers.h b/src/libANGLE/renderer/vulkan/vk_helpers.h
index 9756edd..f2fc95b 100644
--- a/src/libANGLE/renderer/vulkan/vk_helpers.h
+++ b/src/libANGLE/renderer/vulkan/vk_helpers.h
@@ -136,18 +136,18 @@
     LineLoopHelper(RendererVk *renderer);
     ~LineLoopHelper();
 
-    gl::Error getIndexBufferForDrawArrays(RendererVk *renderer,
+    vk::Error getIndexBufferForDrawArrays(RendererVk *renderer,
                                           const gl::DrawCallParams &drawCallParams,
                                           VkBuffer *bufferHandleOut,
                                           VkDeviceSize *offsetOut);
-    gl::Error getIndexBufferForElementArrayBuffer(RendererVk *renderer,
+    vk::Error getIndexBufferForElementArrayBuffer(RendererVk *renderer,
                                                   BufferVk *elementArrayBufferVk,
                                                   VkIndexType indexType,
                                                   int indexCount,
                                                   intptr_t elementArrayOffset,
                                                   VkBuffer *bufferHandleOut,
                                                   VkDeviceSize *bufferOffsetOut);
-    gl::Error getIndexBufferForClientElementArray(RendererVk *renderer,
+    vk::Error getIndexBufferForClientElementArray(RendererVk *renderer,
                                                   const gl::DrawCallParams &drawCallParams,
                                                   VkBuffer *bufferHandleOut,
                                                   VkDeviceSize *bufferOffsetOut);
diff --git a/src/libANGLE/renderer/vulkan/vk_utils.h b/src/libANGLE/renderer/vulkan/vk_utils.h
index 16878ab..ffdb4bf 100644
--- a/src/libANGLE/renderer/vulkan/vk_utils.h
+++ b/src/libANGLE/renderer/vulkan/vk_utils.h
@@ -118,7 +118,7 @@
     return GetImplAs<GetImplType<T>>(glObject);
 }
 
-class Error final
+class ANGLE_NO_DISCARD Error final
 {
   public:
     Error(VkResult result);
@@ -156,6 +156,18 @@
     return Error(VK_SUCCESS);
 }
 
+#define ANGLE_TRY_VK_CHECKED_MATH(result)                 \
+    if (!result)                                          \
+    {                                                     \
+        return vk::Error(VK_ERROR_VALIDATION_FAILED_EXT); \
+    }
+
+#define ANGLE_TRY_VK_ALLOCATION(result)                \
+    if (!result)                                       \
+    {                                                  \
+        return vk::Error(VK_ERROR_OUT_OF_HOST_MEMORY); \
+    }
+
 // Unimplemented handle types:
 // Instance
 // PhysicalDevice