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