dawn::wire::server: Use WireResult consistently for error handling.

This will prevent accidentally forgetting to handle errors since
WireResult is tagged as [[must_use]]. Also it allows using WIRE_TRY()
which is marginally less verbose.

Bug: dawn:1821
Change-Id: I675c4c73d2523411d8da8f08ffedd5c9b4c8201a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/134680
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Loko Kung <lokokung@google.com>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/generator/templates/dawn/wire/server/ServerBase.h b/generator/templates/dawn/wire/server/ServerBase.h
index 7ca4b3a..02add56 100644
--- a/generator/templates/dawn/wire/server/ServerBase.h
+++ b/generator/templates/dawn/wire/server/ServerBase.h
@@ -71,10 +71,7 @@
         // Implementation of the ObjectIdResolver interface
         {% for type in by_category["object"] %}
             WireResult GetFromId(ObjectId id, {{as_cType(type.name)}}* out) const final {
-                if (!mKnown{{type.name.CamelCase()}}.GetNativeHandle(id, out)) {
-                    return WireResult::FatalError;
-                }
-                return WireResult::Success;
+                return mKnown{{type.name.CamelCase()}}.GetNativeHandle(id, out);
             }
 
             WireResult GetOptionalFromId(ObjectId id, {{as_cType(type.name)}}* out) const final {
diff --git a/generator/templates/dawn/wire/server/ServerDoers.cpp b/generator/templates/dawn/wire/server/ServerDoers.cpp
index 7906556..9d6c32f 100644
--- a/generator/templates/dawn/wire/server/ServerDoers.cpp
+++ b/generator/templates/dawn/wire/server/ServerDoers.cpp
@@ -25,7 +25,7 @@
         {% set Suffix = command.name.CamelCase() %}
         {% if Suffix not in client_side_commands %}
             {% if is_method and Suffix not in server_handwritten_commands %}
-                bool Server::Do{{Suffix}}(
+                WireResult Server::Do{{Suffix}}(
                     {%- for member in command.members -%}
                         {%- if member.is_return_value -%}
                             {%- if member.handle_type -%}
@@ -58,25 +58,19 @@
                         //* object creation functions.
                         ASSERT(*{{as_varName(ret[0].name)}} != nullptr);
                     {% endif %}
-                    return true;
+                    return WireResult::Success;
                 }
             {% endif %}
         {% endif %}
     {% endfor %}
 
-    bool Server::DoDestroyObject(ObjectType objectType, ObjectId objectId) {
-        //* ID 0 are reserved for nullptr and cannot be destroyed.
-        if (objectId == 0) {
-            return false;
-        }
-
+    WireResult Server::DoDestroyObject(ObjectType objectType, ObjectId objectId) {
         switch(objectType) {
             {% for type in by_category["object"] %}
                 case ObjectType::{{type.name.CamelCase()}}: {
                     Known<WGPU{{type.name.CamelCase()}}> obj;
-                    if (!{{type.name.CamelCase()}}Objects().Get(objectId, &obj)) {
-                        return false;
-                    }
+                    WIRE_TRY({{type.name.CamelCase()}}Objects().Get(objectId, &obj));
+
                     if (obj->state == AllocationState::Allocated) {
                         ASSERT(obj->handle != nullptr);
                         {% if type.name.CamelCase() in server_reverse_lookup_objects %}
@@ -94,11 +88,11 @@
                         mProcs.{{as_varName(type.name, Name("release"))}}(obj->handle);
                     }
                     {{type.name.CamelCase()}}Objects().Free(objectId);
-                    return true;
+                    return WireResult::Success;
                 }
             {% endfor %}
             default:
-                return false;
+                return WireResult::FatalError;
         }
     }
 
diff --git a/generator/templates/dawn/wire/server/ServerHandlers.cpp b/generator/templates/dawn/wire/server/ServerHandlers.cpp
index 91cac0b..0f59d4c 100644
--- a/generator/templates/dawn/wire/server/ServerHandlers.cpp
+++ b/generator/templates/dawn/wire/server/ServerHandlers.cpp
@@ -23,22 +23,16 @@
 
         {% set Suffix = command.name.CamelCase() %}
         //* The generic command handlers
-        bool Server::Handle{{Suffix}}(DeserializeBuffer* deserializeBuffer) {
+        WireResult Server::Handle{{Suffix}}(DeserializeBuffer* deserializeBuffer) {
             {{Suffix}}Cmd cmd;
-            WireResult deserializeResult = cmd.Deserialize(deserializeBuffer, &mAllocator
+            WIRE_TRY(cmd.Deserialize(deserializeBuffer, &mAllocator
                 {%- if command.may_have_dawn_object -%}
                     , *this
                 {%- endif -%}
-            );
-
-            if (deserializeResult == WireResult::FatalError) {
-                return false;
-            }
+            ));
 
             {% if Suffix in server_custom_pre_handler_commands %}
-                if (!PreHandle{{Suffix}}(cmd)) {
-                    return false;
-                }
+                WIRE_TRY(PreHandle{{Suffix}}(cmd));
             {% endif %}
 
             //* Allocate any result objects
@@ -48,22 +42,18 @@
                 {% set name = as_varName(member.name) %}
 
                 Known<WGPU{{Type}}> {{name}}Data;
-                if (!{{Type}}Objects().Allocate(&{{name}}Data, cmd.{{name}})) {
-                    return false;
-                }
+                WIRE_TRY({{Type}}Objects().Allocate(&{{name}}Data, cmd.{{name}}));
                 {{name}}Data->generation = cmd.{{name}}.generation;
             {% endfor %}
 
             {%- for member in command.members if member.id_type != None -%}
                 {% set name = as_varName(member.name) %}
                 Known<WGPU{{member.id_type.name.CamelCase()}}> {{name}}Handle;
-                if (!{{member.id_type.name.CamelCase()}}Objects().Get(cmd.{{name}}, &{{name}}Handle)) {
-                    return false;
-                }
+                WIRE_TRY({{member.id_type.name.CamelCase()}}Objects().Get(cmd.{{name}}, &{{name}}Handle));
             {%- endfor -%}
 
             //* Do command
-            bool success = Do{{Suffix}}(
+            WIRE_TRY(Do{{Suffix}}(
                 {%- for member in command.members -%}
                     {%- if member.is_return_value -%}
                         {%- if member.handle_type -%}
@@ -78,11 +68,7 @@
                     {%- endif -%}
                     {%- if not loop.last -%}, {% endif %}
                 {%- endfor -%}
-            );
-
-            if (!success) {
-                return false;
-            }
+            ));
 
             {%- for member in command.members if member.is_return_value and member.handle_type -%}
                 {% set Type = member.handle_type.name.CamelCase() %}
@@ -94,7 +80,7 @@
                 {% endif %}
             {% endfor %}
 
-            return true;
+            return WireResult::Success;
         }
     {% endfor %}
 
@@ -115,18 +101,18 @@
 
             WireCmd cmdId = *static_cast<const volatile WireCmd*>(static_cast<const volatile void*>(
                 deserializeBuffer.Buffer() + sizeof(CmdHeader)));
-            bool success = false;
+            WireResult result;
             switch (cmdId) {
                 {% for command in cmd_records["command"] %}
                     case WireCmd::{{command.name.CamelCase()}}:
-                        success = Handle{{command.name.CamelCase()}}(&deserializeBuffer);
+                        result = Handle{{command.name.CamelCase()}}(&deserializeBuffer);
                         break;
                 {% endfor %}
                 default:
-                    success = false;
+                    result = WireResult::FatalError;
             }
 
-            if (!success) {
+            if (result != WireResult::Success) {
                 return nullptr;
             }
             mAllocator.Reset();
diff --git a/generator/templates/dawn/wire/server/ServerPrototypes.inc b/generator/templates/dawn/wire/server/ServerPrototypes.inc
index 302343b..bab9ce9 100644
--- a/generator/templates/dawn/wire/server/ServerPrototypes.inc
+++ b/generator/templates/dawn/wire/server/ServerPrototypes.inc
@@ -15,9 +15,9 @@
 // Command handlers & doers
 {% for command in cmd_records["command"] %}
     {% set Suffix = command.name.CamelCase() %}
-    bool Handle{{Suffix}}(DeserializeBuffer* deserializeBuffer);
+    WireResult Handle{{Suffix}}(DeserializeBuffer* deserializeBuffer);
 
-    bool Do{{Suffix}}(
+    WireResult Do{{Suffix}}(
         {%- for member in command.members -%}
             {%- if member.is_return_value -%}
                 {%- if member.handle_type -%}
@@ -36,5 +36,5 @@
 {% endfor %}
 
 {% for CommandName in server_custom_pre_handler_commands %}
-    bool PreHandle{{CommandName}}(const {{CommandName}}Cmd& cmd);
+    WireResult PreHandle{{CommandName}}(const {{CommandName}}Cmd& cmd);
 {% endfor %}
diff --git a/src/dawn/wire/WireServer.cpp b/src/dawn/wire/WireServer.cpp
index b864112..0be6e1e 100644
--- a/src/dawn/wire/WireServer.cpp
+++ b/src/dawn/wire/WireServer.cpp
@@ -35,7 +35,8 @@
                                uint32_t generation,
                                uint32_t deviceId,
                                uint32_t deviceGeneration) {
-    return mImpl->InjectTexture(texture, id, generation, deviceId, deviceGeneration);
+    return mImpl->InjectTexture(texture, id, generation, deviceId, deviceGeneration) ==
+           WireResult::Success;
 }
 
 bool WireServer::InjectSwapChain(WGPUSwapChain swapchain,
@@ -43,15 +44,16 @@
                                  uint32_t generation,
                                  uint32_t deviceId,
                                  uint32_t deviceGeneration) {
-    return mImpl->InjectSwapChain(swapchain, id, generation, deviceId, deviceGeneration);
+    return mImpl->InjectSwapChain(swapchain, id, generation, deviceId, deviceGeneration) ==
+           WireResult::Success;
 }
 
 bool WireServer::InjectDevice(WGPUDevice device, uint32_t id, uint32_t generation) {
-    return mImpl->InjectDevice(device, id, generation);
+    return mImpl->InjectDevice(device, id, generation) == WireResult::Success;
 }
 
 bool WireServer::InjectInstance(WGPUInstance instance, uint32_t id, uint32_t generation) {
-    return mImpl->InjectInstance(instance, id, generation);
+    return mImpl->InjectInstance(instance, id, generation) == WireResult::Success;
 }
 
 WGPUDevice WireServer::GetDevice(uint32_t id, uint32_t generation) {
diff --git a/src/dawn/wire/server/ObjectStorage.h b/src/dawn/wire/server/ObjectStorage.h
index 6d3167c..daac448 100644
--- a/src/dawn/wire/server/ObjectStorage.h
+++ b/src/dawn/wire/server/ObjectStorage.h
@@ -111,33 +111,33 @@
     }
 
     // Get a backend objects for a given client ID.
-    // Returns whether the object was previously allocated.
-    bool GetNativeHandle(ObjectId id, T* handle) const {
+    // Returns an error if the object wasn't previously allocated.
+    WireResult GetNativeHandle(ObjectId id, T* handle) const {
         if (id >= mKnown.size()) {
-            return false;
+            return WireResult::FatalError;
         }
 
         const Data* data = &mKnown[id];
         if (data->state != AllocationState::Allocated) {
-            return false;
+            return WireResult::FatalError;
         }
         *handle = data->handle;
 
-        return true;
+        return WireResult::Success;
     }
 
-    bool Get(ObjectId id, Known<T>* result) {
+    WireResult Get(ObjectId id, Known<T>* result) {
         if (id >= mKnown.size()) {
-            return false;
+            return WireResult::FatalError;
         }
 
         Data* data = &mKnown[id];
         if (data->state != AllocationState::Allocated) {
-            return false;
+            return WireResult::FatalError;
         }
 
         *result = Known<T>{id, data};
-        return true;
+        return WireResult::Success;
     }
 
     Known<T> FillReservation(ObjectId id, T handle) {
@@ -152,11 +152,11 @@
     // Allocates the data for a given ID and returns it in result.
     // Returns false if the ID is already allocated, or too far ahead, or if ID is 0 (ID 0 is
     // reserved for nullptr). Invalidates all the Data*
-    bool Allocate(Known<T>* result,
-                  ObjectHandle handle,
-                  AllocationState state = AllocationState::Allocated) {
+    WireResult Allocate(Known<T>* result,
+                        ObjectHandle handle,
+                        AllocationState state = AllocationState::Allocated) {
         if (handle.id == 0 || handle.id > mKnown.size()) {
-            return false;
+            return WireResult::FatalError;
         }
 
         Data data;
@@ -166,16 +166,16 @@
         if (handle.id >= mKnown.size()) {
             mKnown.push_back(std::move(data));
             *result = {handle.id, &mKnown.back()};
-            return true;
+            return WireResult::Success;
         }
 
         if (mKnown[handle.id].state != AllocationState::Free) {
-            return false;
+            return WireResult::FatalError;
         }
 
         // The generation should be strictly increasing.
         if (handle.generation <= mKnown[handle.id].generation) {
-            return false;
+            return WireResult::FatalError;
         }
         // update the generation in the slot
         data.generation = handle.generation;
@@ -183,7 +183,7 @@
         mKnown[handle.id] = std::move(data);
 
         *result = {handle.id, &mKnown[handle.id]};
-        return true;
+        return WireResult::Success;
     }
 
     // Marks an ID as deallocated
@@ -231,14 +231,12 @@
   public:
     KnownObjects() = default;
 
-    bool Allocate(Known<WGPUDevice>* result,
-                  ObjectHandle handle,
-                  AllocationState state = AllocationState::Allocated) {
-        if (KnownObjectsBase<WGPUDevice>::Allocate(result, handle, state)) {
-            AddToKnownSet(*result);
-            return true;
-        }
-        return false;
+    WireResult Allocate(Known<WGPUDevice>* result,
+                        ObjectHandle handle,
+                        AllocationState state = AllocationState::Allocated) {
+        WIRE_TRY(KnownObjectsBase<WGPUDevice>::Allocate(result, handle, state));
+        AddToKnownSet(*result);
+        return WireResult::Success;
     }
 
     Known<WGPUDevice> FillReservation(ObjectId id, WGPUDevice handle) {
diff --git a/src/dawn/wire/server/Server.cpp b/src/dawn/wire/server/Server.cpp
index 8c9c62d..e51eb55 100644
--- a/src/dawn/wire/server/Server.cpp
+++ b/src/dawn/wire/server/Server.cpp
@@ -43,21 +43,20 @@
     DestroyAllObjects(mProcs);
 }
 
-bool Server::InjectTexture(WGPUTexture texture,
-                           uint32_t id,
-                           uint32_t generation,
-                           uint32_t deviceId,
-                           uint32_t deviceGeneration) {
+WireResult Server::InjectTexture(WGPUTexture texture,
+                                 uint32_t id,
+                                 uint32_t generation,
+                                 uint32_t deviceId,
+                                 uint32_t deviceGeneration) {
     ASSERT(texture != nullptr);
     Known<WGPUDevice> device;
-    if (!DeviceObjects().Get(deviceId, &device) || device->generation != deviceGeneration) {
-        return false;
+    WIRE_TRY(DeviceObjects().Get(deviceId, &device));
+    if (device->generation != deviceGeneration) {
+        return WireResult::FatalError;
     }
 
     Known<WGPUTexture> data;
-    if (!TextureObjects().Allocate(&data, ObjectHandle{id, generation})) {
-        return false;
-    }
+    WIRE_TRY(TextureObjects().Allocate(&data, ObjectHandle{id, generation}));
 
     data->handle = texture;
     data->generation = generation;
@@ -67,24 +66,23 @@
     // message from the client. Add a reference to counterbalance the eventual release.
     mProcs.textureReference(texture);
 
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::InjectSwapChain(WGPUSwapChain swapchain,
-                             uint32_t id,
-                             uint32_t generation,
-                             uint32_t deviceId,
-                             uint32_t deviceGeneration) {
+WireResult Server::InjectSwapChain(WGPUSwapChain swapchain,
+                                   uint32_t id,
+                                   uint32_t generation,
+                                   uint32_t deviceId,
+                                   uint32_t deviceGeneration) {
     ASSERT(swapchain != nullptr);
     Known<WGPUDevice> device;
-    if (!DeviceObjects().Get(deviceId, &device) || device->generation != deviceGeneration) {
-        return false;
+    WIRE_TRY(DeviceObjects().Get(deviceId, &device));
+    if (device->generation != deviceGeneration) {
+        return WireResult::FatalError;
     }
 
     Known<WGPUSwapChain> data;
-    if (!SwapChainObjects().Allocate(&data, ObjectHandle{id, generation})) {
-        return false;
-    }
+    WIRE_TRY(SwapChainObjects().Allocate(&data, ObjectHandle{id, generation}));
 
     data->handle = swapchain;
     data->generation = generation;
@@ -94,15 +92,13 @@
     // message from the client. Add a reference to counterbalance the eventual release.
     mProcs.swapChainReference(swapchain);
 
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::InjectDevice(WGPUDevice device, uint32_t id, uint32_t generation) {
+WireResult Server::InjectDevice(WGPUDevice device, uint32_t id, uint32_t generation) {
     ASSERT(device != nullptr);
     Known<WGPUDevice> data;
-    if (!DeviceObjects().Allocate(&data, ObjectHandle{id, generation})) {
-        return false;
-    }
+    WIRE_TRY(DeviceObjects().Allocate(&data, ObjectHandle{id, generation}));
 
     data->handle = device;
     data->generation = generation;
@@ -116,15 +112,13 @@
 
     // Set callbacks to forward errors to the client.
     SetForwardingDeviceCallbacks(data);
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::InjectInstance(WGPUInstance instance, uint32_t id, uint32_t generation) {
+WireResult Server::InjectInstance(WGPUInstance instance, uint32_t id, uint32_t generation) {
     ASSERT(instance != nullptr);
     Known<WGPUInstance> data;
-    if (!InstanceObjects().Allocate(&data, ObjectHandle{id, generation})) {
-        return false;
-    }
+    WIRE_TRY(InstanceObjects().Allocate(&data, ObjectHandle{id, generation}));
 
     data->handle = instance;
     data->generation = generation;
@@ -134,12 +128,13 @@
     // message from the client. Add a reference to counterbalance the eventual release.
     mProcs.instanceReference(instance);
 
-    return true;
+    return WireResult::Success;
 }
 
 WGPUDevice Server::GetDevice(uint32_t id, uint32_t generation) {
     Known<WGPUDevice> device;
-    if (!DeviceObjects().Get(id, &device) || device->generation != generation) {
+    if (DeviceObjects().Get(id, &device) != WireResult::Success ||
+        device->generation != generation) {
         return nullptr;
     }
     return device->handle;
diff --git a/src/dawn/wire/server/Server.h b/src/dawn/wire/server/Server.h
index fbf8f14..61058ba 100644
--- a/src/dawn/wire/server/Server.h
+++ b/src/dawn/wire/server/Server.h
@@ -153,21 +153,21 @@
     // ChunkedCommandHandler implementation
     const volatile char* HandleCommandsImpl(const volatile char* commands, size_t size) override;
 
-    bool InjectTexture(WGPUTexture texture,
-                       uint32_t id,
-                       uint32_t generation,
-                       uint32_t deviceId,
-                       uint32_t deviceGeneration);
+    WireResult InjectTexture(WGPUTexture texture,
+                             uint32_t id,
+                             uint32_t generation,
+                             uint32_t deviceId,
+                             uint32_t deviceGeneration);
 
-    bool InjectSwapChain(WGPUSwapChain swapchain,
-                         uint32_t id,
-                         uint32_t generation,
-                         uint32_t deviceId,
-                         uint32_t deviceGeneration);
+    WireResult InjectSwapChain(WGPUSwapChain swapchain,
+                               uint32_t id,
+                               uint32_t generation,
+                               uint32_t deviceId,
+                               uint32_t deviceGeneration);
 
-    bool InjectDevice(WGPUDevice device, uint32_t id, uint32_t generation);
+    WireResult InjectDevice(WGPUDevice device, uint32_t id, uint32_t generation);
 
-    bool InjectInstance(WGPUInstance instance, uint32_t id, uint32_t generation);
+    WireResult InjectInstance(WGPUInstance instance, uint32_t id, uint32_t generation);
 
     WGPUDevice GetDevice(uint32_t id, uint32_t generation);
     bool IsDeviceKnown(WGPUDevice device) const;
diff --git a/src/dawn/wire/server/ServerAdapter.cpp b/src/dawn/wire/server/ServerAdapter.cpp
index 67dc056..2c19136 100644
--- a/src/dawn/wire/server/ServerAdapter.cpp
+++ b/src/dawn/wire/server/ServerAdapter.cpp
@@ -19,14 +19,12 @@
 
 namespace dawn::wire::server {
 
-bool Server::DoAdapterRequestDevice(Known<WGPUAdapter> adapter,
-                                    uint64_t requestSerial,
-                                    ObjectHandle deviceHandle,
-                                    const WGPUDeviceDescriptor* descriptor) {
+WireResult Server::DoAdapterRequestDevice(Known<WGPUAdapter> adapter,
+                                          uint64_t requestSerial,
+                                          ObjectHandle deviceHandle,
+                                          const WGPUDeviceDescriptor* descriptor) {
     Known<WGPUDevice> device;
-    if (!DeviceObjects().Allocate(&device, deviceHandle, AllocationState::Reserved)) {
-        return false;
-    }
+    WIRE_TRY(DeviceObjects().Allocate(&device, deviceHandle, AllocationState::Reserved));
 
     auto userdata = MakeUserdata<RequestDeviceUserdata>();
     userdata->adapter = adapter.AsHandle();
@@ -36,7 +34,7 @@
     mProcs.adapterRequestDevice(adapter->handle, descriptor,
                                 ForwardToServer<&Server::OnRequestDeviceCallback>,
                                 userdata.release());
-    return true;
+    return WireResult::Success;
 }
 
 void Server::OnRequestDeviceCallback(RequestDeviceUserdata* data,
diff --git a/src/dawn/wire/server/ServerBuffer.cpp b/src/dawn/wire/server/ServerBuffer.cpp
index c4c89ba..9040f7a 100644
--- a/src/dawn/wire/server/ServerBuffer.cpp
+++ b/src/dawn/wire/server/ServerBuffer.cpp
@@ -22,11 +22,9 @@
 
 namespace dawn::wire::server {
 
-bool Server::PreHandleBufferUnmap(const BufferUnmapCmd& cmd) {
+WireResult Server::PreHandleBufferUnmap(const BufferUnmapCmd& cmd) {
     Known<WGPUBuffer> buffer;
-    if (!BufferObjects().Get(cmd.selfId, &buffer)) {
-        return false;
-    }
+    WIRE_TRY(BufferObjects().Get(cmd.selfId, &buffer));
 
     if (buffer->mappedAtCreation && !(buffer->usage & WGPUMapMode_Write)) {
         // This indicates the writeHandle is for mappedAtCreation only. Destroy on unmap
@@ -37,29 +35,27 @@
 
     buffer->mapWriteState = BufferMapWriteState::Unmapped;
 
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::PreHandleBufferDestroy(const BufferDestroyCmd& cmd) {
+WireResult Server::PreHandleBufferDestroy(const BufferDestroyCmd& cmd) {
     // Destroying a buffer does an implicit unmapping.
     Known<WGPUBuffer> buffer;
-    if (!BufferObjects().Get(cmd.selfId, &buffer)) {
-        return false;
-    }
+    WIRE_TRY(BufferObjects().Get(cmd.selfId, &buffer));
 
     // The buffer was destroyed. Clear the Read/WriteHandle.
     buffer->readHandle = nullptr;
     buffer->writeHandle = nullptr;
     buffer->mapWriteState = BufferMapWriteState::Unmapped;
 
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::DoBufferMapAsync(Known<WGPUBuffer> buffer,
-                              uint64_t requestSerial,
-                              WGPUMapModeFlags mode,
-                              uint64_t offset64,
-                              uint64_t size64) {
+WireResult Server::DoBufferMapAsync(Known<WGPUBuffer> buffer,
+                                    uint64_t requestSerial,
+                                    WGPUMapModeFlags mode,
+                                    uint64_t offset64,
+                                    uint64_t size64) {
     // These requests are just forwarded to the buffer, with userdata containing what the
     // client will require in the return command.
     std::unique_ptr<MapUserdata> userdata = MakeUserdata<MapUserdata>();
@@ -75,11 +71,11 @@
     // in server. All other invalid actual size can be caught by dawn native side validation.
     if (offset64 > std::numeric_limits<size_t>::max()) {
         OnBufferMapAsyncCallback(userdata.get(), WGPUBufferMapAsyncStatus_OffsetOutOfRange);
-        return true;
+        return WireResult::Success;
     }
     if (size64 >= WGPU_WHOLE_MAP_SIZE) {
         OnBufferMapAsyncCallback(userdata.get(), WGPUBufferMapAsyncStatus_SizeOutOfRange);
-        return true;
+        return WireResult::Success;
     }
 
     size_t offset = static_cast<size_t>(offset64);
@@ -91,21 +87,19 @@
     mProcs.bufferMapAsync(buffer->handle, mode, offset, size,
                           ForwardToServer<&Server::OnBufferMapAsyncCallback>, userdata.release());
 
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::DoDeviceCreateBuffer(Known<WGPUDevice> device,
-                                  const WGPUBufferDescriptor* descriptor,
-                                  ObjectHandle bufferHandle,
-                                  uint64_t readHandleCreateInfoLength,
-                                  const uint8_t* readHandleCreateInfo,
-                                  uint64_t writeHandleCreateInfoLength,
-                                  const uint8_t* writeHandleCreateInfo) {
+WireResult Server::DoDeviceCreateBuffer(Known<WGPUDevice> device,
+                                        const WGPUBufferDescriptor* descriptor,
+                                        ObjectHandle bufferHandle,
+                                        uint64_t readHandleCreateInfoLength,
+                                        const uint8_t* readHandleCreateInfo,
+                                        uint64_t writeHandleCreateInfoLength,
+                                        const uint8_t* writeHandleCreateInfo) {
     // Create and register the buffer object.
     Known<WGPUBuffer> buffer;
-    if (!BufferObjects().Allocate(&buffer, bufferHandle)) {
-        return false;
-    }
+    WIRE_TRY(BufferObjects().Allocate(&buffer, bufferHandle));
     buffer->handle = mProcs.deviceCreateBuffer(device->handle, descriptor);
     buffer->usage = descriptor->usage;
     buffer->mappedAtCreation = descriptor->mappedAtCreation;
@@ -121,7 +115,7 @@
         writeHandleCreateInfoLength > std::numeric_limits<size_t>::max() ||
         readHandleCreateInfoLength >
             std::numeric_limits<size_t>::max() - writeHandleCreateInfoLength) {
-        return false;
+        return WireResult::FatalError;
     }
 
     if (isWriteMode) {
@@ -130,7 +124,7 @@
         if (!mMemoryTransferService->DeserializeWriteHandle(
                 writeHandleCreateInfo, static_cast<size_t>(writeHandleCreateInfoLength),
                 &writeHandle)) {
-            return false;
+            return WireResult::FatalError;
         }
         ASSERT(writeHandle != nullptr);
         buffer->writeHandle.reset(writeHandle);
@@ -143,7 +137,7 @@
                 // This is a valid case and isn't fatal. Remember the buffer is an error so as
                 // to skip subsequent mapping operations.
                 buffer->mapWriteState = BufferMapWriteState::MapError;
-                return true;
+                return WireResult::Success;
             }
             ASSERT(mapping != nullptr);
             writeHandle->SetTarget(mapping);
@@ -158,53 +152,56 @@
         if (!mMemoryTransferService->DeserializeReadHandle(
                 readHandleCreateInfo, static_cast<size_t>(readHandleCreateInfoLength),
                 &readHandle)) {
-            return false;
+            return WireResult::FatalError;
         }
         ASSERT(readHandle != nullptr);
 
         buffer->readHandle.reset(readHandle);
     }
 
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::DoBufferUpdateMappedData(Known<WGPUBuffer> buffer,
-                                      uint64_t writeDataUpdateInfoLength,
-                                      const uint8_t* writeDataUpdateInfo,
-                                      uint64_t offset,
-                                      uint64_t size) {
+WireResult Server::DoBufferUpdateMappedData(Known<WGPUBuffer> buffer,
+                                            uint64_t writeDataUpdateInfoLength,
+                                            const uint8_t* writeDataUpdateInfo,
+                                            uint64_t offset,
+                                            uint64_t size) {
     if (writeDataUpdateInfoLength > std::numeric_limits<size_t>::max() ||
         offset > std::numeric_limits<size_t>::max() || size > std::numeric_limits<size_t>::max()) {
-        return false;
+        return WireResult::FatalError;
     }
 
     switch (buffer->mapWriteState) {
         case BufferMapWriteState::Unmapped:
-            return false;
+            return WireResult::FatalError;
         case BufferMapWriteState::MapError:
             // The buffer is mapped but there was an error allocating mapped data.
             // Do not perform the memcpy.
-            return true;
+            return WireResult::Success;
         case BufferMapWriteState::Mapped:
             break;
     }
     if (!buffer->writeHandle) {
         // This check is performed after the check for the MapError state. It is permissible
         // to Unmap and attempt to update mapped data of an error buffer.
-        return false;
+        return WireResult::FatalError;
     }
 
     // Deserialize the flush info and flush updated data from the handle into the target
     // of the handle. The target is set via WriteHandle::SetTarget.
-    return buffer->writeHandle->DeserializeDataUpdate(
-        writeDataUpdateInfo, static_cast<size_t>(writeDataUpdateInfoLength),
-        static_cast<size_t>(offset), static_cast<size_t>(size));
+    if (!buffer->writeHandle->DeserializeDataUpdate(
+            writeDataUpdateInfo, static_cast<size_t>(writeDataUpdateInfoLength),
+            static_cast<size_t>(offset), static_cast<size_t>(size))) {
+        return WireResult::FatalError;
+    }
+    return WireResult::Success;
 }
 
 void Server::OnBufferMapAsyncCallback(MapUserdata* data, WGPUBufferMapAsyncStatus status) {
     // Skip sending the callback if the buffer has already been destroyed.
     Known<WGPUBuffer> buffer;
-    if (!BufferObjects().Get(data->buffer.id, &buffer) ||
+    if (BufferObjects().Get(data->buffer.id, &buffer) != WireResult::Success ||
         buffer->generation != data->buffer.generation) {
         return;
     }
diff --git a/src/dawn/wire/server/ServerDevice.cpp b/src/dawn/wire/server/ServerDevice.cpp
index 4ca0597..0c1dd09 100644
--- a/src/dawn/wire/server/ServerDevice.cpp
+++ b/src/dawn/wire/server/ServerDevice.cpp
@@ -61,14 +61,14 @@
     SerializeCommand(cmd);
 }
 
-bool Server::DoDevicePopErrorScope(Known<WGPUDevice> device, uint64_t requestSerial) {
+WireResult Server::DoDevicePopErrorScope(Known<WGPUDevice> device, uint64_t requestSerial) {
     auto userdata = MakeUserdata<ErrorScopeUserdata>();
     userdata->requestSerial = requestSerial;
     userdata->device = device.AsHandle();
 
     mProcs.devicePopErrorScope(device->handle, ForwardToServer<&Server::OnDevicePopErrorScope>,
                                userdata.release());
-    return true;
+    return WireResult::Success;
 }
 
 void Server::OnDevicePopErrorScope(ErrorScopeUserdata* userdata,
@@ -83,15 +83,14 @@
     SerializeCommand(cmd);
 }
 
-bool Server::DoDeviceCreateComputePipelineAsync(Known<WGPUDevice> device,
-                                                uint64_t requestSerial,
-                                                ObjectHandle pipelineObjectHandle,
-                                                const WGPUComputePipelineDescriptor* descriptor) {
+WireResult Server::DoDeviceCreateComputePipelineAsync(
+    Known<WGPUDevice> device,
+    uint64_t requestSerial,
+    ObjectHandle pipelineObjectHandle,
+    const WGPUComputePipelineDescriptor* descriptor) {
     Known<WGPUComputePipeline> pipeline;
-    if (!ComputePipelineObjects().Allocate(&pipeline, pipelineObjectHandle,
-                                           AllocationState::Reserved)) {
-        return false;
-    }
+    WIRE_TRY(ComputePipelineObjects().Allocate(&pipeline, pipelineObjectHandle,
+                                               AllocationState::Reserved));
 
     auto userdata = MakeUserdata<CreatePipelineAsyncUserData>();
     userdata->device = device.AsHandle();
@@ -101,7 +100,7 @@
     mProcs.deviceCreateComputePipelineAsync(
         device->handle, descriptor, ForwardToServer<&Server::OnCreateComputePipelineAsyncCallback>,
         userdata.release());
-    return true;
+    return WireResult::Success;
 }
 
 void Server::OnCreateComputePipelineAsyncCallback(CreatePipelineAsyncUserData* data,
@@ -120,15 +119,14 @@
     SerializeCommand(cmd);
 }
 
-bool Server::DoDeviceCreateRenderPipelineAsync(Known<WGPUDevice> device,
-                                               uint64_t requestSerial,
-                                               ObjectHandle pipelineObjectHandle,
-                                               const WGPURenderPipelineDescriptor* descriptor) {
+WireResult Server::DoDeviceCreateRenderPipelineAsync(
+    Known<WGPUDevice> device,
+    uint64_t requestSerial,
+    ObjectHandle pipelineObjectHandle,
+    const WGPURenderPipelineDescriptor* descriptor) {
     Known<WGPURenderPipeline> pipeline;
-    if (!RenderPipelineObjects().Allocate(&pipeline, pipelineObjectHandle,
-                                          AllocationState::Reserved)) {
-        return false;
-    }
+    WIRE_TRY(RenderPipelineObjects().Allocate(&pipeline, pipelineObjectHandle,
+                                              AllocationState::Reserved));
 
     auto userdata = MakeUserdata<CreatePipelineAsyncUserData>();
     userdata->device = device.AsHandle();
@@ -138,7 +136,7 @@
     mProcs.deviceCreateRenderPipelineAsync(
         device->handle, descriptor, ForwardToServer<&Server::OnCreateRenderPipelineAsyncCallback>,
         userdata.release());
-    return true;
+    return WireResult::Success;
 }
 
 void Server::OnCreateRenderPipelineAsyncCallback(CreatePipelineAsyncUserData* data,
diff --git a/src/dawn/wire/server/ServerInstance.cpp b/src/dawn/wire/server/ServerInstance.cpp
index 4074b8c..c4982fb 100644
--- a/src/dawn/wire/server/ServerInstance.cpp
+++ b/src/dawn/wire/server/ServerInstance.cpp
@@ -20,14 +20,12 @@
 
 namespace dawn::wire::server {
 
-bool Server::DoInstanceRequestAdapter(Known<WGPUInstance> instance,
-                                      uint64_t requestSerial,
-                                      ObjectHandle adapterHandle,
-                                      const WGPURequestAdapterOptions* options) {
+WireResult Server::DoInstanceRequestAdapter(Known<WGPUInstance> instance,
+                                            uint64_t requestSerial,
+                                            ObjectHandle adapterHandle,
+                                            const WGPURequestAdapterOptions* options) {
     Known<WGPUAdapter> adapter;
-    if (!AdapterObjects().Allocate(&adapter, adapterHandle, AllocationState::Reserved)) {
-        return false;
-    }
+    WIRE_TRY(AdapterObjects().Allocate(&adapter, adapterHandle, AllocationState::Reserved));
 
     auto userdata = MakeUserdata<RequestAdapterUserdata>();
     userdata->instance = instance.AsHandle();
@@ -37,7 +35,7 @@
     mProcs.instanceRequestAdapter(instance->handle, options,
                                   ForwardToServer<&Server::OnRequestAdapterCallback>,
                                   userdata.release());
-    return true;
+    return WireResult::Success;
 }
 
 void Server::OnRequestAdapterCallback(RequestAdapterUserdata* data,
diff --git a/src/dawn/wire/server/ServerQueue.cpp b/src/dawn/wire/server/ServerQueue.cpp
index b464133..d18ffc7 100644
--- a/src/dawn/wire/server/ServerQueue.cpp
+++ b/src/dawn/wire/server/ServerQueue.cpp
@@ -28,45 +28,45 @@
     SerializeCommand(cmd);
 }
 
-bool Server::DoQueueOnSubmittedWorkDone(Known<WGPUQueue> queue,
-                                        uint64_t signalValue,
-                                        uint64_t requestSerial) {
+WireResult Server::DoQueueOnSubmittedWorkDone(Known<WGPUQueue> queue,
+                                              uint64_t signalValue,
+                                              uint64_t requestSerial) {
     auto userdata = MakeUserdata<QueueWorkDoneUserdata>();
     userdata->queue = queue.AsHandle();
     userdata->requestSerial = requestSerial;
 
     mProcs.queueOnSubmittedWorkDone(queue->handle, signalValue,
                                     ForwardToServer<&Server::OnQueueWorkDone>, userdata.release());
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::DoQueueWriteBuffer(Known<WGPUQueue> queue,
-                                Known<WGPUBuffer> buffer,
-                                uint64_t bufferOffset,
-                                const uint8_t* data,
-                                uint64_t size) {
+WireResult Server::DoQueueWriteBuffer(Known<WGPUQueue> queue,
+                                      Known<WGPUBuffer> buffer,
+                                      uint64_t bufferOffset,
+                                      const uint8_t* data,
+                                      uint64_t size) {
     if (size > std::numeric_limits<size_t>::max()) {
-        return false;
+        return WireResult::FatalError;
     }
 
     mProcs.queueWriteBuffer(queue->handle, buffer->handle, bufferOffset, data,
                             static_cast<size_t>(size));
-    return true;
+    return WireResult::Success;
 }
 
-bool Server::DoQueueWriteTexture(Known<WGPUQueue> queue,
-                                 const WGPUImageCopyTexture* destination,
-                                 const uint8_t* data,
-                                 uint64_t dataSize,
-                                 const WGPUTextureDataLayout* dataLayout,
-                                 const WGPUExtent3D* writeSize) {
+WireResult Server::DoQueueWriteTexture(Known<WGPUQueue> queue,
+                                       const WGPUImageCopyTexture* destination,
+                                       const uint8_t* data,
+                                       uint64_t dataSize,
+                                       const WGPUTextureDataLayout* dataLayout,
+                                       const WGPUExtent3D* writeSize) {
     if (dataSize > std::numeric_limits<size_t>::max()) {
-        return false;
+        return WireResult::FatalError;
     }
 
     mProcs.queueWriteTexture(queue->handle, destination, data, static_cast<size_t>(dataSize),
                              dataLayout, writeSize);
-    return true;
+    return WireResult::Success;
 }
 
 }  // namespace dawn::wire::server
diff --git a/src/dawn/wire/server/ServerShaderModule.cpp b/src/dawn/wire/server/ServerShaderModule.cpp
index 78a198c..8328501 100644
--- a/src/dawn/wire/server/ServerShaderModule.cpp
+++ b/src/dawn/wire/server/ServerShaderModule.cpp
@@ -18,8 +18,8 @@
 
 namespace dawn::wire::server {
 
-bool Server::DoShaderModuleGetCompilationInfo(Known<WGPUShaderModule> shaderModule,
-                                              uint64_t requestSerial) {
+WireResult Server::DoShaderModuleGetCompilationInfo(Known<WGPUShaderModule> shaderModule,
+                                                    uint64_t requestSerial) {
     auto userdata = MakeUserdata<ShaderModuleGetCompilationInfoUserdata>();
     userdata->shaderModule = shaderModule.AsHandle();
     userdata->requestSerial = requestSerial;
@@ -27,7 +27,7 @@
     mProcs.shaderModuleGetCompilationInfo(
         shaderModule->handle, ForwardToServer<&Server::OnShaderModuleGetCompilationInfo>,
         userdata.release());
-    return true;
+    return WireResult::Success;
 }
 
 void Server::OnShaderModuleGetCompilationInfo(ShaderModuleGetCompilationInfoUserdata* data,