[WebGPU backend] Add a CheckWGPUSuccess macro
CheckWGPUSuccess(resultIn, "do something")
static_cast various WebGPU status enum to webgpu::GenericStatus,
assuming all "success" status have the same value of 1.
Bug: 413053623
Change-Id: I544b4f36e6eb7309f092ec29f61746dc34e8dd4d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/246254
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Shrek Shao <shrekshao@google.com>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/dawn/native/BUILD.gn b/src/dawn/native/BUILD.gn
index 81329a1..6b7226d 100644
--- a/src/dawn/native/BUILD.gn
+++ b/src/dawn/native/BUILD.gn
@@ -718,6 +718,7 @@
"webgpu/PhysicalDeviceWGPU.h",
"webgpu/QueueWGPU.cpp",
"webgpu/QueueWGPU.h",
+ "webgpu/WebGPUError.h",
]
}
diff --git a/src/dawn/native/CMakeLists.txt b/src/dawn/native/CMakeLists.txt
index 7ca2a2e..1b69194 100644
--- a/src/dawn/native/CMakeLists.txt
+++ b/src/dawn/native/CMakeLists.txt
@@ -578,6 +578,7 @@
"webgpu/Forward.h"
"webgpu/PhysicalDeviceWGPU.h"
"webgpu/QueueWGPU.h"
+ "webgpu/WebGPUError.h"
)
list(APPEND sources
"webgpu/BackendWGPU.cpp"
diff --git a/src/dawn/native/webgpu/QueueWGPU.cpp b/src/dawn/native/webgpu/QueueWGPU.cpp
index 4e916a7..3d096f2 100644
--- a/src/dawn/native/webgpu/QueueWGPU.cpp
+++ b/src/dawn/native/webgpu/QueueWGPU.cpp
@@ -35,6 +35,7 @@
#include "dawn/native/webgpu/BufferWGPU.h"
#include "dawn/native/webgpu/CommandBufferWGPU.h"
#include "dawn/native/webgpu/DeviceWGPU.h"
+#include "dawn/native/webgpu/WebGPUError.h"
namespace dawn::native::webgpu {
@@ -101,10 +102,7 @@
if (status == WGPUWaitStatus_TimedOut) {
return fenceSerial;
}
- if (status != WGPUWaitStatus_Success) {
- return DAWN_FORMAT_INTERNAL_ERROR("inner instanceWaitAny status is (%s).",
- FromAPI(status));
- }
+ DAWN_TRY(CheckWGPUSuccess(status, "instanceWaitAny"));
// Update fenceSerial since future is ready.
fenceSerial = tentativeSerial;
diff --git a/src/dawn/native/webgpu/WebGPUError.h b/src/dawn/native/webgpu/WebGPUError.h
new file mode 100644
index 0000000..f0f1104
--- /dev/null
+++ b/src/dawn/native/webgpu/WebGPUError.h
@@ -0,0 +1,57 @@
+// Copyright 2025 The Dawn & Tint Authors
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this
+// list of conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice,
+// this list of conditions and the following disclaimer in the documentation
+// and/or other materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#ifndef SRC_DAWN_NATIVE_WEBGPU_WEBGPUERROR_H_
+#define SRC_DAWN_NATIVE_WEBGPU_WEBGPUERROR_H_
+
+#include <string>
+
+#include "dawn/native/Error.h"
+
+namespace dawn::native::webgpu {
+
+template <typename CEnum>
+MaybeError CheckWGPUSuccessImpl(CEnum result, const char* context) {
+ using CppEnum = decltype(FromAPI(result));
+ const CEnum successValue = ToAPI(CppEnum::Success);
+ if (result == successValue) [[likely]] {
+ return {};
+ }
+
+ return DAWN_FORMAT_INTERNAL_ERROR(" %s failed with (%s)", context, FromAPI(result));
+}
+
+// Returns a success only if resultIn is "success", otherwise returns an error with the context and
+// stringified resultIn value instead. Can be used like this:
+//
+// DAWN_TRY(CheckWGPUSuccess(wgpuDoSomething, "doing something"));
+#define CheckWGPUSuccess(resultIn, contextIn) \
+ ::dawn::native::webgpu::CheckWGPUSuccessImpl(resultIn, contextIn)
+
+} // namespace dawn::native::webgpu
+
+#endif // SRC_DAWN_NATIVE_WEBGPU_WEBGPUERROR_H_