From 3f0b7673f070dca3b5487f81f29667c1da9e11e2 Mon Sep 17 00:00:00 2001
From: ReinUsesLisp <reinuseslisp@airmail.cc>
Date: Fri, 27 Mar 2020 02:50:27 -0300
Subject: [PATCH] renderer_vulkan/wrapper: Add exception class

---
 src/video_core/renderer_vulkan/wrapper.cpp |  4 +++
 src/video_core/renderer_vulkan/wrapper.h   | 30 ++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git a/src/video_core/renderer_vulkan/wrapper.cpp b/src/video_core/renderer_vulkan/wrapper.cpp
index b4afafbd5..1adf1b8c2 100644
--- a/src/video_core/renderer_vulkan/wrapper.cpp
+++ b/src/video_core/renderer_vulkan/wrapper.cpp
@@ -14,6 +14,10 @@
 
 namespace Vulkan::vk {
 
+const char* Exception::what() const noexcept {
+    return ToString(result);
+}
+
 const char* ToString(VkResult result) noexcept {
     switch (result) {
     case VkResult::VK_SUCCESS:
diff --git a/src/video_core/renderer_vulkan/wrapper.h b/src/video_core/renderer_vulkan/wrapper.h
index 8ecc1b5a3..b13d3882e 100644
--- a/src/video_core/renderer_vulkan/wrapper.h
+++ b/src/video_core/renderer_vulkan/wrapper.h
@@ -80,7 +80,37 @@ private:
     std::size_t num = 0;
 };
 
+/// Vulkan exception generated from a VkResult.
+class Exception final : public std::exception {
+public:
+    /// Construct the exception with a result.
+    /// @pre result != VK_SUCCESS
+    explicit Exception(VkResult result_) : result{result_} {}
+    virtual ~Exception() = default;
+
+    const char* what() const noexcept override;
+
+private:
+    VkResult result;
+};
+
 /// Converts a VkResult enum into a rodata string
 const char* ToString(VkResult) noexcept;
 
+/// Throws a Vulkan exception if result is not success.
+inline void Check(VkResult result) {
+    if (result != VK_SUCCESS) {
+        throw Exception(result);
+    }
+}
+
+/// Throws a Vulkan exception if result is an error.
+/// @return result
+inline VkResult Filter(VkResult result) {
+    if (result < 0) {
+        throw Exception(result);
+    }
+    return result;
+}
+
 } // namespace Vulkan::vk