Просмотр исходного кода

renderer_vulkan/wrapper: Add exception class

ReinUsesLisp 6 лет назад
Родитель
Сommit
3f0b7673f0

+ 4 - 0
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:

+ 30 - 0
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