| // Copyright 2018 The Dawn Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef SRC_DAWN_NATIVE_ERRORDATA_H_ |
| #define SRC_DAWN_NATIVE_ERRORDATA_H_ |
| |
| #include <cstdint> |
| #include <memory> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| #include "absl/strings/str_format.h" |
| #include "dawn/common/Compiler.h" |
| |
| namespace wgpu { |
| enum class ErrorType : uint32_t; |
| } |
| |
| namespace dawn { |
| using ErrorType = wgpu::ErrorType; |
| } |
| |
| namespace dawn::native { |
| enum class InternalErrorType : uint32_t; |
| |
| class [[nodiscard]] ErrorData { |
| public: |
| [[nodiscard]] static std::unique_ptr<ErrorData> Create(InternalErrorType type, |
| std::string message, |
| const char* file, |
| const char* function, |
| int line); |
| ErrorData(InternalErrorType type, std::string message); |
| ~ErrorData(); |
| |
| struct BacktraceRecord { |
| const char* file; |
| const char* function; |
| int line; |
| }; |
| void AppendBacktrace(const char* file, const char* function, int line); |
| void AppendContext(std::string context); |
| template <typename... Args> |
| void AppendContext(const char* formatStr, const Args&... args) { |
| std::string out; |
| absl::UntypedFormatSpec format(formatStr); |
| if (absl::FormatUntyped(&out, format, {absl::FormatArg(args)...})) { |
| AppendContext(std::move(out)); |
| } else { |
| AppendContext(absl::StrFormat("[Failed to format error: \"%s\"]", formatStr)); |
| } |
| } |
| void AppendDebugGroup(std::string label); |
| void AppendBackendMessage(std::string message); |
| |
| InternalErrorType GetType() const; |
| const std::string& GetMessage() const; |
| const std::vector<BacktraceRecord>& GetBacktrace() const; |
| const std::vector<std::string>& GetContexts() const; |
| const std::vector<std::string>& GetDebugGroups() const; |
| const std::vector<std::string>& GetBackendMessages() const; |
| |
| std::string GetFormattedMessage() const; |
| |
| private: |
| InternalErrorType mType; |
| std::string mMessage; |
| std::vector<BacktraceRecord> mBacktrace; |
| std::vector<std::string> mContexts; |
| std::vector<std::string> mDebugGroups; |
| std::vector<std::string> mBackendMessages; |
| }; |
| |
| } // namespace dawn::native |
| |
| #endif // SRC_DAWN_NATIVE_ERRORDATA_H_ |