[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_