webgpu.h: Return wgpu::Status enums

Bug: 42241199
Change-Id: I8e56efd63d6c47ff06c4e988823c9574d1fc2d95
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/184660
Reviewed-by: Loko Kung <lokokung@google.com>
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Austin Eng <enga@chromium.org>
diff --git a/generator/templates/api_cpp.h b/generator/templates/api_cpp.h
index 4eebbc5..1fb80ed 100644
--- a/generator/templates/api_cpp.h
+++ b/generator/templates/api_cpp.h
@@ -139,6 +139,23 @@
     {{BoolCType}} mValue = static_cast<{{BoolCType}}>(false);
 };
 
+// Helper class to wrap Status which allows implicit conversion to bool.
+// Used while callers switch to checking the Status enum instead of booleans.
+// TODO(crbug.com/42241199): Remove when all callers check the enum.
+struct ConvertibleStatus {
+    // NOLINTNEXTLINE(runtime/explicit) allow implicit construction
+    constexpr ConvertibleStatus(Status status) : status(status) {}
+    // NOLINTNEXTLINE(runtime/explicit) allow implicit conversion
+    constexpr operator bool() const {
+        return status == Status::Success;
+    }
+    // NOLINTNEXTLINE(runtime/explicit) allow implicit conversion
+    constexpr operator Status() const {
+        return status;
+    }
+    Status status;
+};
+
 template<typename Derived, typename CType>
 class ObjectBase {
   public:
@@ -305,7 +322,7 @@
     {% set OriginalMethodName = method.name.CamelCase() %}
     {% set MethodName = OriginalMethodName[:-1] if method.name.chunks[-1] == "f" else OriginalMethodName %}
     {% set MethodName = CppType + "::" + MethodName if dfn else MethodName %}
-    {{as_cppType(method.return_type.name)}} {{MethodName}}(
+    {{"ConvertibleStatus" if method.return_type.name.get() == "status" else as_cppType(method.return_type.name)}} {{MethodName}}(
         {%- for arg in method.arguments -%}
             {%- if not loop.first %}, {% endif -%}
             {%- if arg.type.category == "object" and arg.annotation == "value" -%}
diff --git a/include/dawn/native/DawnNative.h b/include/dawn/native/DawnNative.h
index 2a44d87..1ff8d9b 100644
--- a/include/dawn/native/DawnNative.h
+++ b/include/dawn/native/DawnNative.h
@@ -89,11 +89,11 @@
 
     // Essentially webgpu.h's wgpuAdapterGetProperties while we don't have WGPUAdapter in
     // dawn.json
-    void GetProperties(wgpu::AdapterProperties* properties) const;
-    void GetProperties(WGPUAdapterProperties* properties) const;
+    wgpu::Status GetProperties(wgpu::AdapterProperties* properties) const;
+    wgpu::Status GetProperties(WGPUAdapterProperties* properties) const;
 
     std::vector<const char*> GetSupportedFeatures() const;
-    bool GetLimits(WGPUSupportedLimits* limits) const;
+    wgpu::ConvertibleStatus GetLimits(WGPUSupportedLimits* limits) const;
 
     void SetUseTieredLimits(bool useTieredLimits);
 
diff --git a/src/dawn/common/xlib_with_undefs.h b/src/dawn/common/xlib_with_undefs.h
index f9dc708..6f419e8 100644
--- a/src/dawn/common/xlib_with_undefs.h
+++ b/src/dawn/common/xlib_with_undefs.h
@@ -47,6 +47,7 @@
 #undef None
 #undef Always
 #undef Bool
+#undef Status
 
 using XErrorHandler = int (*)(Display*, XErrorEvent*);
 
diff --git a/src/dawn/dawn.json b/src/dawn/dawn.json
index c76f9c2..4b71a1a 100644
--- a/src/dawn/dawn.json
+++ b/src/dawn/dawn.json
@@ -126,13 +126,14 @@
             },
             {
                 "name": "get limits",
-                "returns": "bool",
+                "returns": "status",
                 "args": [
                     {"name": "limits", "type": "supported limits", "annotation": "*"}
                 ]
             },
             {
                 "name": "get properties",
+                "returns": "status",
                 "args": [
                     {"name": "properties", "type": "adapter properties", "annotation": "*"}
                 ]
@@ -190,7 +191,7 @@
             {
                 "name": "get format capabilities",
                 "tags": ["dawn"],
-                "returns": "bool",
+                "returns": "status",
                 "args": [
                     {"name": "format", "type": "texture format"},
                     {"name": "capabilities", "type": "format capabilities", "annotation": "*"}
@@ -1402,7 +1403,7 @@
             },
             {
                 "name": "get limits",
-                "returns": "bool",
+                "returns": "status",
                 "args": [
                     {"name": "limits", "type": "supported limits", "annotation": "*"}
                 ]
@@ -1805,6 +1806,13 @@
             {"name": "rotation", "type": "external texture rotation", "default": "rotate 0 degrees"}
         ]
     },
+    "status": {
+        "category": "enum",
+        "values": [
+            {"value": 0, "name": "success"},
+            {"value": 1, "name": "error"}
+        ]
+    },
     "shared buffer memory": {
         "category": "object",
         "tags": ["dawn", "native"],
@@ -1818,7 +1826,7 @@
             },
             {
                 "name": "get properties",
-                "returns": "void",
+                "returns": "status",
                 "args": [
                     {"name": "properties", "type": "shared buffer memory properties", "annotation": "*"}
                 ]
@@ -1883,7 +1891,7 @@
             },
             {
                 "name": "get properties",
-                "returns": "void",
+                "returns": "status",
                 "args": [
                     {"name": "properties", "type": "shared texture memory properties", "annotation": "*"}
                 ]
@@ -2529,8 +2537,7 @@
     },
     "get instance features": {
         "category": "function",
-        "_comment": "TODO(crbug.com/dawn/1987): Figure out how to return error codes for functions like this (https://github.com/webgpu-native/webgpu-headers/issues/115).",
-        "returns": "bool",
+        "returns": "status",
         "args": [
             {"name": "features", "type": "instance features", "annotation": "*"}
         ]
@@ -3602,7 +3609,7 @@
             },
             {
                 "name": "get capabilities",
-                "returns": "void",
+                "returns": "status",
                 "args": [
                     {"name": "adapter", "type": "adapter"},
                     {"name": "capabilities", "type": "surface capabilities", "annotation": "*"}
diff --git a/src/dawn/native/Adapter.cpp b/src/dawn/native/Adapter.cpp
index c9b005a..819fe20 100644
--- a/src/dawn/native/Adapter.cpp
+++ b/src/dawn/native/Adapter.cpp
@@ -92,11 +92,11 @@
     return instance;
 }
 
-bool AdapterBase::APIGetLimits(SupportedLimits* limits) const {
+wgpu::Status AdapterBase::APIGetLimits(SupportedLimits* limits) const {
     DAWN_ASSERT(limits != nullptr);
     UnpackedPtr<SupportedLimits> unpacked;
     if (mInstance->ConsumedError(ValidateAndUnpack(limits), &unpacked)) {
-        return false;
+        return wgpu::Status::Error;
     }
 
     if (mUseTieredLimits) {
@@ -116,31 +116,35 @@
         }
     }
 
-    return true;
+    return wgpu::Status::Success;
 }
 
-void AdapterBase::APIGetProperties(AdapterProperties* properties) const {
+wgpu::Status AdapterBase::APIGetProperties(AdapterProperties* properties) const {
     DAWN_ASSERT(properties != nullptr);
     UnpackedPtr<AdapterProperties> unpacked;
     if (mInstance->ConsumedError(ValidateAndUnpack(properties), &unpacked)) {
-        return;
+        return wgpu::Status::Error;
     }
 
+    bool hadError = false;
     if (unpacked.Get<AdapterPropertiesMemoryHeaps>() != nullptr &&
         !mSupportedFeatures.IsEnabled(wgpu::FeatureName::AdapterPropertiesMemoryHeaps)) {
-        [[maybe_unused]] bool hadError = mInstance->ConsumedError(
+        hadError |= mInstance->ConsumedError(
             DAWN_VALIDATION_ERROR("Feature AdapterPropertiesMemoryHeaps is not available."));
     }
     if (unpacked.Get<AdapterPropertiesD3D>() != nullptr &&
         !mSupportedFeatures.IsEnabled(wgpu::FeatureName::AdapterPropertiesD3D)) {
-        [[maybe_unused]] bool hadError = mInstance->ConsumedError(
+        hadError |= mInstance->ConsumedError(
             DAWN_VALIDATION_ERROR("Feature AdapterPropertiesD3D is not available."));
     }
     if (unpacked.Get<AdapterPropertiesVk>() != nullptr &&
         !mSupportedFeatures.IsEnabled(wgpu::FeatureName::AdapterPropertiesVk)) {
-        [[maybe_unused]] bool hadError = mInstance->ConsumedError(
+        hadError |= mInstance->ConsumedError(
             DAWN_VALIDATION_ERROR("Feature AdapterPropertiesVk is not available."));
     }
+    if (hadError) {
+        return wgpu::Status::Error;
+    }
 
     if (auto* powerPreferenceDesc = unpacked.Get<DawnAdapterPropertiesPowerPreference>()) {
         powerPreferenceDesc->powerPreference = mPowerPreference;
@@ -178,6 +182,8 @@
     properties->driverDescription = ptr;
     memcpy(ptr, mPhysicalDevice->GetDriverDescription().c_str(), driverDescriptionCLen);
     ptr += driverDescriptionCLen;
+
+    return wgpu::Status::Success;
 }
 
 void APIAdapterPropertiesFreeMembers(WGPUAdapterProperties properties) {
@@ -263,8 +269,8 @@
                         "can not chain after requiredLimits.");
 
         SupportedLimits supportedLimits;
-        bool success = APIGetLimits(&supportedLimits);
-        DAWN_ASSERT(success);
+        wgpu::Status status = APIGetLimits(&supportedLimits);
+        DAWN_ASSERT(status == wgpu::Status::Success);
 
         DAWN_TRY_CONTEXT(ValidateLimits(supportedLimits.limits, descriptor->requiredLimits->limits),
                          "validating required limits");
@@ -370,29 +376,29 @@
     return {futureID};
 }
 
-bool AdapterBase::APIGetFormatCapabilities(wgpu::TextureFormat format,
-                                           FormatCapabilities* capabilities) {
+wgpu::Status AdapterBase::APIGetFormatCapabilities(wgpu::TextureFormat format,
+                                                   FormatCapabilities* capabilities) {
     if (!mSupportedFeatures.IsEnabled(wgpu::FeatureName::FormatCapabilities)) {
         [[maybe_unused]] bool hadError = mInstance->ConsumedError(
             DAWN_VALIDATION_ERROR("Feature FormatCapabilities is not available."));
-        return false;
+        return wgpu::Status::Error;
     }
     DAWN_ASSERT(capabilities != nullptr);
 
     UnpackedPtr<FormatCapabilities> unpacked;
     if (mInstance->ConsumedError(ValidateAndUnpack(capabilities), &unpacked)) {
-        return false;
+        return wgpu::Status::Error;
     }
 
     if (unpacked.Get<DrmFormatCapabilities>() != nullptr &&
         !mSupportedFeatures.IsEnabled(wgpu::FeatureName::DrmFormatCapabilities)) {
         [[maybe_unused]] bool hadError = mInstance->ConsumedError(
             DAWN_VALIDATION_ERROR("Feature DrmFormatCapabilities is not available."));
-        return false;
+        return wgpu::Status::Error;
     }
 
     mPhysicalDevice->PopulateBackendFormatCapabilities(format, unpacked);
-    return true;
+    return wgpu::Status::Success;
 }
 
 const TogglesState& AdapterBase::GetTogglesState() const {
diff --git a/src/dawn/native/Adapter.h b/src/dawn/native/Adapter.h
index e11a98b..0404c6a 100644
--- a/src/dawn/native/Adapter.h
+++ b/src/dawn/native/Adapter.h
@@ -60,8 +60,8 @@
 
     // WebGPU API
     InstanceBase* APIGetInstance() const;
-    bool APIGetLimits(SupportedLimits* limits) const;
-    void APIGetProperties(AdapterProperties* properties) const;
+    wgpu::Status APIGetLimits(SupportedLimits* limits) const;
+    wgpu::Status APIGetProperties(AdapterProperties* properties) const;
     bool APIHasFeature(wgpu::FeatureName feature) const;
     size_t APIEnumerateFeatures(wgpu::FeatureName* features) const;
     void APIRequestDevice(const DeviceDescriptor* descriptor,
@@ -72,7 +72,8 @@
     Future APIRequestDevice2(const DeviceDescriptor* descriptor,
                              const WGPURequestDeviceCallbackInfo2& callbackInfo);
     DeviceBase* APICreateDevice(const DeviceDescriptor* descriptor = nullptr);
-    bool APIGetFormatCapabilities(wgpu::TextureFormat format, FormatCapabilities* capabilities);
+    wgpu::Status APIGetFormatCapabilities(wgpu::TextureFormat format,
+                                          FormatCapabilities* capabilities);
 
     void SetUseTieredLimits(bool useTieredLimits);
 
diff --git a/src/dawn/native/DawnNative.cpp b/src/dawn/native/DawnNative.cpp
index cacb74c..71374e6 100644
--- a/src/dawn/native/DawnNative.cpp
+++ b/src/dawn/native/DawnNative.cpp
@@ -89,12 +89,12 @@
     return *this;
 }
 
-void Adapter::GetProperties(wgpu::AdapterProperties* properties) const {
-    GetProperties(reinterpret_cast<WGPUAdapterProperties*>(properties));
+wgpu::Status Adapter::GetProperties(wgpu::AdapterProperties* properties) const {
+    return GetProperties(reinterpret_cast<WGPUAdapterProperties*>(properties));
 }
 
-void Adapter::GetProperties(WGPUAdapterProperties* properties) const {
-    mImpl->APIGetProperties(FromAPI(properties));
+wgpu::Status Adapter::GetProperties(WGPUAdapterProperties* properties) const {
+    return mImpl->APIGetProperties(FromAPI(properties));
 }
 
 WGPUAdapter Adapter::Get() const {
@@ -106,7 +106,7 @@
     return supportedFeaturesSet.GetEnabledFeatureNames();
 }
 
-bool Adapter::GetLimits(WGPUSupportedLimits* limits) const {
+wgpu::ConvertibleStatus Adapter::GetLimits(WGPUSupportedLimits* limits) const {
     return mImpl->APIGetLimits(FromAPI(limits));
 }
 
diff --git a/src/dawn/native/Device.cpp b/src/dawn/native/Device.cpp
index 07b5905..eeae081 100644
--- a/src/dawn/native/Device.cpp
+++ b/src/dawn/native/Device.cpp
@@ -1851,13 +1851,13 @@
     }
 }
 
-bool DeviceBase::APIGetLimits(SupportedLimits* limits) const {
+wgpu::Status DeviceBase::APIGetLimits(SupportedLimits* limits) const {
     DAWN_ASSERT(limits != nullptr);
     InstanceBase* instance = GetAdapter()->GetInstance();
 
     UnpackedPtr<SupportedLimits> unpacked;
     if (instance->ConsumedError(ValidateAndUnpack(limits), &unpacked)) {
-        return false;
+        return wgpu::Status::Error;
     }
 
     limits->limits = mLimits.v1;
@@ -1873,7 +1873,7 @@
         }
     }
 
-    return true;
+    return wgpu::Status::Success;
 }
 
 bool DeviceBase::APIHasFeature(wgpu::FeatureName feature) const {
diff --git a/src/dawn/native/Device.h b/src/dawn/native/Device.h
index 360b1b5..8cef28e 100644
--- a/src/dawn/native/Device.h
+++ b/src/dawn/native/Device.h
@@ -288,7 +288,7 @@
     AdapterBase* APIGetAdapter();
     QueueBase* APIGetQueue();
 
-    bool APIGetLimits(SupportedLimits* limits) const;
+    wgpu::Status APIGetLimits(SupportedLimits* limits) const;
     bool APIHasFeature(wgpu::FeatureName feature) const;
     size_t APIEnumerateFeatures(wgpu::FeatureName* features) const;
     void APIInjectError(wgpu::ErrorType type, const char* message);
diff --git a/src/dawn/native/Instance.cpp b/src/dawn/native/Instance.cpp
index 847a232..8e97cd3 100644
--- a/src/dawn/native/Instance.cpp
+++ b/src/dawn/native/Instance.cpp
@@ -114,14 +114,14 @@
 
 }  // anonymous namespace
 
-wgpu::Bool APIGetInstanceFeatures(InstanceFeatures* features) {
+wgpu::Status APIGetInstanceFeatures(InstanceFeatures* features) {
     if (features->nextInChain != nullptr) {
-        return false;
+        return wgpu::Status::Error;
     }
 
     features->timedWaitAnyEnable = true;
     features->timedWaitAnyMaxCount = kTimedWaitAnyMaxCountDefault;
-    return true;
+    return wgpu::Status::Success;
 }
 
 InstanceBase* APICreateInstance(const InstanceDescriptor* descriptor) {
diff --git a/src/dawn/native/Instance.h b/src/dawn/native/Instance.h
index 942a8e3..b0e26b3 100644
--- a/src/dawn/native/Instance.h
+++ b/src/dawn/native/Instance.h
@@ -66,7 +66,7 @@
 using BackendsArray = ityp::
     array<wgpu::BackendType, std::unique_ptr<BackendConnection>, kEnumCount<wgpu::BackendType>>;
 
-wgpu::Bool APIGetInstanceFeatures(InstanceFeatures* features);
+wgpu::Status APIGetInstanceFeatures(InstanceFeatures* features);
 InstanceBase* APICreateInstance(const InstanceDescriptor* descriptor);
 
 // This is called InstanceBase for consistency across the frontend, even if the backends don't
diff --git a/src/dawn/native/SharedBufferMemory.cpp b/src/dawn/native/SharedBufferMemory.cpp
index 510993a..d112b9d 100644
--- a/src/dawn/native/SharedBufferMemory.cpp
+++ b/src/dawn/native/SharedBufferMemory.cpp
@@ -86,15 +86,17 @@
     return ObjectType::SharedBufferMemory;
 }
 
-void SharedBufferMemoryBase::APIGetProperties(SharedBufferMemoryProperties* properties) const {
+wgpu::Status SharedBufferMemoryBase::APIGetProperties(
+    SharedBufferMemoryProperties* properties) const {
     properties->usage = mProperties.usage;
     properties->size = mProperties.size;
 
     UnpackedPtr<SharedBufferMemoryProperties> unpacked;
     if (GetDevice()->ConsumedError(ValidateAndUnpack(properties), &unpacked,
                                    "calling %s.GetProperties", this)) {
-        return;
+        return wgpu::Status::Error;
     }
+    return wgpu::Status::Success;
 }
 
 BufferBase* SharedBufferMemoryBase::APICreateBuffer(const BufferDescriptor* descriptor) {
diff --git a/src/dawn/native/SharedBufferMemory.h b/src/dawn/native/SharedBufferMemory.h
index f8e60e1..b4e76ca 100644
--- a/src/dawn/native/SharedBufferMemory.h
+++ b/src/dawn/native/SharedBufferMemory.h
@@ -52,7 +52,7 @@
     static SharedBufferMemoryBase* MakeError(DeviceBase* device,
                                              const SharedBufferMemoryDescriptor* descriptor);
 
-    void APIGetProperties(SharedBufferMemoryProperties* properties) const;
+    wgpu::Status APIGetProperties(SharedBufferMemoryProperties* properties) const;
     BufferBase* APICreateBuffer(const BufferDescriptor* descriptor);
 
     ObjectType GetType() const override;
diff --git a/src/dawn/native/SharedTextureMemory.cpp b/src/dawn/native/SharedTextureMemory.cpp
index f37a65b..041b3e5 100644
--- a/src/dawn/native/SharedTextureMemory.cpp
+++ b/src/dawn/native/SharedTextureMemory.cpp
@@ -106,10 +106,12 @@
     return ObjectType::SharedTextureMemory;
 }
 
-void SharedTextureMemoryBase::APIGetProperties(SharedTextureMemoryProperties* properties) const {
+wgpu::Status SharedTextureMemoryBase::APIGetProperties(
+    SharedTextureMemoryProperties* properties) const {
     if (GetDevice()->ConsumedError(GetProperties(properties), "calling %s.GetProperties", this)) {
-        return;
+        return wgpu::Status::Error;
     }
+    return wgpu::Status::Success;
 }
 
 MaybeError SharedTextureMemoryBase::GetProperties(SharedTextureMemoryProperties* properties) const {
diff --git a/src/dawn/native/SharedTextureMemory.h b/src/dawn/native/SharedTextureMemory.h
index 1fb8b14..839f2c8 100644
--- a/src/dawn/native/SharedTextureMemory.h
+++ b/src/dawn/native/SharedTextureMemory.h
@@ -55,7 +55,7 @@
     static Ref<SharedTextureMemoryBase> MakeError(DeviceBase* device,
                                                   const SharedTextureMemoryDescriptor* descriptor);
 
-    void APIGetProperties(SharedTextureMemoryProperties* properties) const;
+    wgpu::Status APIGetProperties(SharedTextureMemoryProperties* properties) const;
     TextureBase* APICreateTexture(const TextureDescriptor* descriptor);
 
     ObjectType GetType() const override;
diff --git a/src/dawn/native/Surface.cpp b/src/dawn/native/Surface.cpp
index 90aced4..b6a931e 100644
--- a/src/dawn/native/Surface.cpp
+++ b/src/dawn/native/Surface.cpp
@@ -607,13 +607,17 @@
     }
 }
 
-void Surface::APIGetCapabilities(AdapterBase* adapter, SurfaceCapabilities* capabilities) const {
+wgpu::Status Surface::APIGetCapabilities(AdapterBase* adapter,
+                                         SurfaceCapabilities* capabilities) const {
     MaybeError maybeError = GetCapabilities(adapter, capabilities);
     if (!GetCurrentDevice()) {
         [[maybe_unused]] bool error = mInstance->ConsumedError(std::move(maybeError));
+        return wgpu::Status::Error;
     } else {
-        [[maybe_unused]] bool error = GetCurrentDevice()->ConsumedError(
-            std::move(maybeError), "calling %s.Configure().", this);
+        return GetCurrentDevice()->ConsumedError(std::move(maybeError), "calling %s.Configure().",
+                                                 this)
+                   ? wgpu::Status::Error
+                   : wgpu::Status::Success;
     }
 }
 
diff --git a/src/dawn/native/Surface.h b/src/dawn/native/Surface.h
index f31d908..9ac666a 100644
--- a/src/dawn/native/Surface.h
+++ b/src/dawn/native/Surface.h
@@ -123,7 +123,7 @@
 
     // Dawn API
     void APIConfigure(const SurfaceConfiguration* config);
-    void APIGetCapabilities(AdapterBase* adapter, SurfaceCapabilities* capabilities) const;
+    wgpu::Status APIGetCapabilities(AdapterBase* adapter, SurfaceCapabilities* capabilities) const;
     void APIGetCurrentTexture(SurfaceTexture* surfaceTexture) const;
     wgpu::TextureFormat APIGetPreferredFormat(AdapterBase* adapter) const;
     void APIPresent();
diff --git a/src/dawn/tests/end2end/AdapterFormatCapabilitiesVkTests.cpp b/src/dawn/tests/end2end/AdapterFormatCapabilitiesVkTests.cpp
index 516914d..2a72f39 100644
--- a/src/dawn/tests/end2end/AdapterFormatCapabilitiesVkTests.cpp
+++ b/src/dawn/tests/end2end/AdapterFormatCapabilitiesVkTests.cpp
@@ -40,7 +40,7 @@
     wgpu::DrmFormatCapabilities drmCapabilities;
     capabilities.nextInChain = &drmCapabilities;
 
-    EXPECT_EQ(supported,
+    EXPECT_EQ(supported ? wgpu::Status::Success : wgpu::Status::Error,
               adapter.GetFormatCapabilities(wgpu::TextureFormat::RGBA8Unorm, &capabilities));
 }
 
diff --git a/src/dawn/tests/end2end/BasicTests.cpp b/src/dawn/tests/end2end/BasicTests.cpp
index 6be182d..fb75573 100644
--- a/src/dawn/tests/end2end/BasicTests.cpp
+++ b/src/dawn/tests/end2end/BasicTests.cpp
@@ -76,16 +76,16 @@
 
 TEST_P(BasicTests, GetInstanceFeatures) {
     wgpu::InstanceFeatures instanceFeatures{};
-    bool success = wgpu::GetInstanceFeatures(&instanceFeatures);
-    EXPECT_TRUE(success);
+    auto status = wgpu::GetInstanceFeatures(&instanceFeatures);
+    EXPECT_EQ(status, wgpu::Status::Success);
     EXPECT_EQ(instanceFeatures.timedWaitAnyEnable, !UsesWire());
     EXPECT_EQ(instanceFeatures.timedWaitAnyMaxCount, kTimedWaitAnyMaxCountDefault);
     EXPECT_EQ(instanceFeatures.nextInChain, nullptr);
 
     wgpu::ChainedStruct chained{};
     instanceFeatures.nextInChain = &chained;
-    success = wgpu::GetInstanceFeatures(&instanceFeatures);
-    EXPECT_FALSE(success);
+    status = wgpu::GetInstanceFeatures(&instanceFeatures);
+    EXPECT_EQ(status, wgpu::Status::Error);
 }
 
 DAWN_INSTANTIATE_TEST(BasicTests,
diff --git a/src/dawn/tests/end2end/ExperimentalSubgroupsTests.cpp b/src/dawn/tests/end2end/ExperimentalSubgroupsTests.cpp
index 37b9e86..ec569bf 100644
--- a/src/dawn/tests/end2end/ExperimentalSubgroupsTests.cpp
+++ b/src/dawn/tests/end2end/ExperimentalSubgroupsTests.cpp
@@ -90,7 +90,7 @@
         wgpu::SupportedLimits limits{};
         wgpu::DawnExperimentalSubgroupLimits subgroupLimits{};
         limits.nextInChain = &subgroupLimits;
-        EXPECT_TRUE(device.GetLimits(&limits));
+        EXPECT_EQ(device.GetLimits(&limits), wgpu::Status::Success);
         uint32_t maxSubgroupSize = subgroupLimits.maxSubgroupSize;
         EXPECT_TRUE(1 <= maxSubgroupSize && maxSubgroupSize <= 128);
         // maxSubgroupSize should be a power of 2.
diff --git a/src/dawn/tests/unittests/validation/DeviceValidationTests.cpp b/src/dawn/tests/unittests/validation/DeviceValidationTests.cpp
index a6f04bc..f8179d5 100644
--- a/src/dawn/tests/unittests/validation/DeviceValidationTests.cpp
+++ b/src/dawn/tests/unittests/validation/DeviceValidationTests.cpp
@@ -92,7 +92,7 @@
     descriptor.requiredLimits = &limits;
 
     wgpu::SupportedLimits supportedLimits;
-    EXPECT_TRUE(adapter.GetLimits(&supportedLimits));
+    EXPECT_EQ(adapter.GetLimits(&supportedLimits), wgpu::Status::Success);
 
     // If we can support better than the default, test below the max.
     if (supportedLimits.limits.maxBindGroups > 4u) {
@@ -157,7 +157,7 @@
     descriptor.requiredLimits = &limits;
 
     wgpu::SupportedLimits supportedLimits;
-    EXPECT_TRUE(adapter.GetLimits(&supportedLimits));
+    EXPECT_EQ(adapter.GetLimits(&supportedLimits), wgpu::Status::Success);
 
     // Test below the min.
     limits.limits.minUniformBufferOffsetAlignment =
diff --git a/src/dawn/tests/unittests/wire/WireAdapterTests.cpp b/src/dawn/tests/unittests/wire/WireAdapterTests.cpp
index b865b3e..afcfb03 100644
--- a/src/dawn/tests/unittests/wire/WireAdapterTests.cpp
+++ b/src/dawn/tests/unittests/wire/WireAdapterTests.cpp
@@ -181,7 +181,7 @@
             EXPECT_CALL(api, DeviceGetLimits(apiDevice, NotNull()))
                 .WillOnce(WithArg<1>(Invoke([&](WGPUSupportedLimits* limits) {
                     *reinterpret_cast<wgpu::SupportedLimits*>(limits) = fakeLimits;
-                    return true;
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, DeviceEnumerateFeatures(apiDevice, nullptr))
@@ -215,7 +215,7 @@
                 device = wgpu::Device::Acquire(cDevice);
 
                 wgpu::SupportedLimits limits;
-                EXPECT_TRUE(device.GetLimits(&limits));
+                EXPECT_EQ(device.GetLimits(&limits), wgpu::Status::Success);
                 EXPECT_EQ(limits.limits.maxTextureDimension1D,
                           fakeLimits.limits.maxTextureDimension1D);
                 EXPECT_EQ(limits.limits.maxVertexAttributes, fakeLimits.limits.maxVertexAttributes);
@@ -355,7 +355,7 @@
             EXPECT_CALL(api, DeviceGetLimits(apiDevice, NotNull()))
                 .WillOnce(WithArg<1>(Invoke([&](WGPUSupportedLimits* limits) {
                     *reinterpret_cast<wgpu::SupportedLimits*>(limits) = fakeLimits;
-                    return true;
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, DeviceEnumerateFeatures(apiDevice, nullptr))
diff --git a/src/dawn/tests/unittests/wire/WireInstanceTests.cpp b/src/dawn/tests/unittests/wire/WireInstanceTests.cpp
index 4d1b4d1..f92488f 100644
--- a/src/dawn/tests/unittests/wire/WireInstanceTests.cpp
+++ b/src/dawn/tests/unittests/wire/WireInstanceTests.cpp
@@ -145,12 +145,15 @@
             EXPECT_CALL(api, AdapterHasFeature(apiAdapter, _)).WillRepeatedly(Return(false));
 
             EXPECT_CALL(api, AdapterGetProperties(apiAdapter, NotNull()))
-                .WillOnce(SetArgPointee<1>(fakeProperties));
+                .WillOnce(WithArg<1>(Invoke([&](WGPUAdapterProperties* properties) {
+                    *properties = fakeProperties;
+                    return WGPUStatus_Success;
+                })));
 
             EXPECT_CALL(api, AdapterGetLimits(apiAdapter, NotNull()))
                 .WillOnce(WithArg<1>(Invoke([&](WGPUSupportedLimits* limits) {
                     *limits = fakeLimits;
-                    return true;
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, AdapterEnumerateFeatures(apiAdapter, nullptr))
@@ -186,7 +189,7 @@
                 EXPECT_EQ(properties.adapterType, fakeProperties.adapterType);
 
                 WGPUSupportedLimits limits = {};
-                EXPECT_TRUE(wgpuAdapterGetLimits(adapter, &limits));
+                EXPECT_EQ(wgpuAdapterGetLimits(adapter, &limits), WGPUStatus_Success);
                 EXPECT_EQ(limits.limits.maxTextureDimension1D,
                           fakeLimits.limits.maxTextureDimension1D);
                 EXPECT_EQ(limits.limits.maxVertexAttributes, fakeLimits.limits.maxVertexAttributes);
@@ -268,7 +271,8 @@
                                     fakeVkProperties;
                                 break;
                             default:
-                                FAIL() << "Unexpected chain";
+                                ADD_FAILURE() << "Unexpected chain";
+                                return WGPUStatus_Error;
                         }
                         // update next pointer back to the original since it would be overwritten
                         // in the switch statement
@@ -276,12 +280,13 @@
 
                         chain = next;
                     }
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, AdapterGetLimits(apiAdapter, NotNull()))
                 .WillOnce(WithArg<1>(Invoke([&](WGPUSupportedLimits* limits) {
                     *limits = {};
-                    return true;
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, AdapterEnumerateFeatures(apiAdapter, nullptr))
@@ -372,12 +377,13 @@
                     properties->architecture = "";
                     properties->name = "";
                     properties->driverDescription = "";
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, AdapterGetLimits(apiAdapter, NotNull()))
                 .WillOnce(WithArg<1>(Invoke([&](WGPUSupportedLimits* limits) {
                     *limits = {};
-                    return true;
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, AdapterEnumerateFeatures(apiAdapter, nullptr))
diff --git a/src/dawn/tests/unittests/wire/WireTest.cpp b/src/dawn/tests/unittests/wire/WireTest.cpp
index dc02191..2cf9061 100644
--- a/src/dawn/tests/unittests/wire/WireTest.cpp
+++ b/src/dawn/tests/unittests/wire/WireTest.cpp
@@ -105,12 +105,13 @@
                 properties->architecture = "";
                 properties->name = "";
                 properties->driverDescription = "";
+                return WGPUStatus_Success;
             })));
 
         EXPECT_CALL(api, AdapterGetLimits(apiAdapter, NotNull()))
             .WillOnce(WithArg<1>(Invoke([&](WGPUSupportedLimits* limits) {
                 *limits = {};
-                return true;
+                return WGPUStatus_Success;
             })));
 
         EXPECT_CALL(api, AdapterEnumerateFeatures(apiAdapter, nullptr))
@@ -159,7 +160,7 @@
             EXPECT_CALL(api, DeviceGetLimits(apiDevice, NotNull()))
                 .WillOnce(WithArg<1>(Invoke([&](WGPUSupportedLimits* limits) {
                     *limits = {};
-                    return true;
+                    return WGPUStatus_Success;
                 })));
 
             EXPECT_CALL(api, DeviceEnumerateFeatures(apiDevice, nullptr))
diff --git a/src/dawn/wire/client/Adapter.cpp b/src/dawn/wire/client/Adapter.cpp
index ccc3dc5..0da876c 100644
--- a/src/dawn/wire/client/Adapter.cpp
+++ b/src/dawn/wire/client/Adapter.cpp
@@ -137,7 +137,7 @@
     return ObjectType::Adapter;
 }
 
-bool Adapter::GetLimits(WGPUSupportedLimits* limits) const {
+WGPUStatus Adapter::GetLimits(WGPUSupportedLimits* limits) const {
     return mLimitsAndFeatures.GetLimits(limits);
 }
 
@@ -192,7 +192,7 @@
     }
 }
 
-void Adapter::GetProperties(WGPUAdapterProperties* properties) const {
+WGPUStatus Adapter::GetProperties(WGPUAdapterProperties* properties) const {
     // Loop through the chained struct.
     WGPUChainedStructOut* chain = properties->nextInChain;
     while (chain != nullptr) {
@@ -251,6 +251,8 @@
     properties->driverDescription = ptr;
     memcpy(ptr, mProperties.driverDescription, driverDescriptionCLen);
     ptr += driverDescriptionCLen;
+
+    return WGPUStatus_Success;
 }
 
 void Adapter::RequestDevice(const WGPUDeviceDescriptor* descriptor,
@@ -357,10 +359,10 @@
     return nullptr;
 }
 
-bool Adapter::GetFormatCapabilities(WGPUTextureFormat format,
-                                    WGPUFormatCapabilities* capabilities) {
+WGPUStatus Adapter::GetFormatCapabilities(WGPUTextureFormat format,
+                                          WGPUFormatCapabilities* capabilities) {
     dawn::ErrorLog() << "adapter.GetFormatCapabilities not supported with dawn_wire.";
-    return false;
+    return WGPUStatus_Error;
 }
 
 }  // namespace dawn::wire::client
diff --git a/src/dawn/wire/client/Adapter.h b/src/dawn/wire/client/Adapter.h
index 7a89cd1..bb23d0e 100644
--- a/src/dawn/wire/client/Adapter.h
+++ b/src/dawn/wire/client/Adapter.h
@@ -44,13 +44,13 @@
 
     ObjectType GetObjectType() const override;
 
-    bool GetLimits(WGPUSupportedLimits* limits) const;
+    WGPUStatus GetLimits(WGPUSupportedLimits* limits) const;
     bool HasFeature(WGPUFeatureName feature) const;
     size_t EnumerateFeatures(WGPUFeatureName* features) const;
     void SetLimits(const WGPUSupportedLimits* limits);
     void SetFeatures(const WGPUFeatureName* features, uint32_t featuresCount);
     void SetProperties(const WGPUAdapterProperties* properties);
-    void GetProperties(WGPUAdapterProperties* properties) const;
+    WGPUStatus GetProperties(WGPUAdapterProperties* properties) const;
     void RequestDevice(const WGPUDeviceDescriptor* descriptor,
                        WGPURequestDeviceCallback callback,
                        void* userdata);
@@ -62,7 +62,8 @@
     // Unimplementable. Only availale in dawn_native.
     WGPUInstance GetInstance() const;
     WGPUDevice CreateDevice(const WGPUDeviceDescriptor*);
-    bool GetFormatCapabilities(WGPUTextureFormat format, WGPUFormatCapabilities* capabilities);
+    WGPUStatus GetFormatCapabilities(WGPUTextureFormat format,
+                                     WGPUFormatCapabilities* capabilities);
 
   private:
     LimitsAndFeatures mLimitsAndFeatures;
diff --git a/src/dawn/wire/client/Device.cpp b/src/dawn/wire/client/Device.cpp
index 6e132f3..5c94973 100644
--- a/src/dawn/wire/client/Device.cpp
+++ b/src/dawn/wire/client/Device.cpp
@@ -293,7 +293,7 @@
     return refCount;
 }
 
-bool Device::GetLimits(WGPUSupportedLimits* limits) const {
+WGPUStatus Device::GetLimits(WGPUSupportedLimits* limits) const {
     return mLimitsAndFeatures.GetLimits(limits);
 }
 
diff --git a/src/dawn/wire/client/Device.h b/src/dawn/wire/client/Device.h
index 28418ba..ff93c60 100644
--- a/src/dawn/wire/client/Device.h
+++ b/src/dawn/wire/client/Device.h
@@ -80,7 +80,7 @@
     void HandleLogging(WGPULoggingType loggingType, const char* message);
     void HandleDeviceLost(WGPUDeviceLostReason reason, const char* message);
 
-    bool GetLimits(WGPUSupportedLimits* limits) const;
+    WGPUStatus GetLimits(WGPUSupportedLimits* limits) const;
     bool HasFeature(WGPUFeatureName feature) const;
     size_t EnumerateFeatures(WGPUFeatureName* features) const;
     void SetLimits(const WGPUSupportedLimits* limits);
diff --git a/src/dawn/wire/client/Instance.cpp b/src/dawn/wire/client/Instance.cpp
index c4ed227..acfdc8c 100644
--- a/src/dawn/wire/client/Instance.cpp
+++ b/src/dawn/wire/client/Instance.cpp
@@ -366,14 +366,14 @@
 
 // Free-standing API functions
 
-DAWN_WIRE_EXPORT WGPUBool wgpuDawnWireClientGetInstanceFeatures(WGPUInstanceFeatures* features) {
+DAWN_WIRE_EXPORT WGPUStatus wgpuDawnWireClientGetInstanceFeatures(WGPUInstanceFeatures* features) {
     if (features->nextInChain != nullptr) {
-        return false;
+        return WGPUStatus_Error;
     }
 
     features->timedWaitAnyEnable = false;
     features->timedWaitAnyMaxCount = dawn::kTimedWaitAnyMaxCountDefault;
-    return true;
+    return WGPUStatus_Success;
 }
 
 DAWN_WIRE_EXPORT WGPUInstance
diff --git a/src/dawn/wire/client/LimitsAndFeatures.cpp b/src/dawn/wire/client/LimitsAndFeatures.cpp
index 0fe29d5..74454a0 100644
--- a/src/dawn/wire/client/LimitsAndFeatures.cpp
+++ b/src/dawn/wire/client/LimitsAndFeatures.cpp
@@ -36,7 +36,7 @@
 
 LimitsAndFeatures::~LimitsAndFeatures() = default;
 
-bool LimitsAndFeatures::GetLimits(WGPUSupportedLimits* limits) const {
+WGPUStatus LimitsAndFeatures::GetLimits(WGPUSupportedLimits* limits) const {
     DAWN_ASSERT(limits != nullptr);
     auto* originalNextInChain = limits->nextInChain;
     *limits = mLimits;
@@ -55,12 +55,12 @@
             }
             default:
                 // Fail if unknown sType found.
-                return false;
+                return WGPUStatus_Error;
         }
         // Restore the chain.
         *chain = originalChainedStructOut;
     }
-    return true;
+    return WGPUStatus_Success;
 }
 
 bool LimitsAndFeatures::HasFeature(WGPUFeatureName feature) const {
diff --git a/src/dawn/wire/client/LimitsAndFeatures.h b/src/dawn/wire/client/LimitsAndFeatures.h
index 6c6e6c7..bb2ee95 100644
--- a/src/dawn/wire/client/LimitsAndFeatures.h
+++ b/src/dawn/wire/client/LimitsAndFeatures.h
@@ -38,7 +38,7 @@
     LimitsAndFeatures();
     ~LimitsAndFeatures();
 
-    bool GetLimits(WGPUSupportedLimits* limits) const;
+    WGPUStatus GetLimits(WGPUSupportedLimits* limits) const;
     bool HasFeature(WGPUFeatureName feature) const;
     size_t EnumerateFeatures(WGPUFeatureName* features) const;
 
diff --git a/src/dawn/wire/client/Surface.cpp b/src/dawn/wire/client/Surface.cpp
index d72592e..0979838 100644
--- a/src/dawn/wire/client/Surface.cpp
+++ b/src/dawn/wire/client/Surface.cpp
@@ -65,9 +65,11 @@
     return WGPUTextureFormat_BGRA8Unorm;
 }
 
-void Surface::GetCapabilities(WGPUAdapter adapter, WGPUSurfaceCapabilities* capabilities) const {
+WGPUStatus Surface::GetCapabilities(WGPUAdapter adapter,
+                                    WGPUSurfaceCapabilities* capabilities) const {
     // TODO(dawn:2320): Implement this
     dawn::ErrorLog() << "surface.GetCapabilities not supported yet with dawn_wire.";
+    return WGPUStatus_Error;
 }
 
 void Surface::GetCurrentTexture(WGPUSurfaceTexture* surfaceTexture) {
diff --git a/src/dawn/wire/client/Surface.h b/src/dawn/wire/client/Surface.h
index f153c63..a95a700 100644
--- a/src/dawn/wire/client/Surface.h
+++ b/src/dawn/wire/client/Surface.h
@@ -46,7 +46,7 @@
 
     WGPUTextureFormat GetPreferredFormat(WGPUAdapter adapter) const;
 
-    void GetCapabilities(WGPUAdapter adapter, WGPUSurfaceCapabilities* capabilities) const;
+    WGPUStatus GetCapabilities(WGPUAdapter adapter, WGPUSurfaceCapabilities* capabilities) const;
 
     void GetCurrentTexture(WGPUSurfaceTexture* surfaceTexture);