diff --git a/generator/templates/dawn/native/ValidationUtils.cpp b/generator/templates/dawn/native/ValidationUtils.cpp
index a5efb01..9c170b7 100644
--- a/generator/templates/dawn/native/ValidationUtils.cpp
+++ b/generator/templates/dawn/native/ValidationUtils.cpp
@@ -29,7 +29,7 @@
                         return {};
                 {% endfor %}
                 default:
-                    return DAWN_FORMAT_VALIDATION_ERROR("Value %i is invalid for {{as_cType(type.name)}}.", static_cast<uint32_t>(value));
+                    return DAWN_VALIDATION_ERROR("Value %i is invalid for {{as_cType(type.name)}}.", static_cast<uint32_t>(value));
             }
         }
 
@@ -40,7 +40,7 @@
             if ((value & static_cast<{{namespace}}::{{as_cppType(type.name)}}>(~{{type.full_mask}})) == 0) {
                 return {};
             }
-            return DAWN_FORMAT_VALIDATION_ERROR("Value %i is invalid for {{as_cType(type.name)}}.", static_cast<uint32_t>(value));
+            return DAWN_VALIDATION_ERROR("Value %i is invalid for {{as_cType(type.name)}}.", static_cast<uint32_t>(value));
         }
 
     {% endfor %}
diff --git a/src/dawn/native/BackendConnection.cpp b/src/dawn/native/BackendConnection.cpp
index 0c54731..8dcd19f 100644
--- a/src/dawn/native/BackendConnection.cpp
+++ b/src/dawn/native/BackendConnection.cpp
@@ -29,7 +29,7 @@
 
 ResultOrError<std::vector<Ref<AdapterBase>>> BackendConnection::DiscoverAdapters(
     const AdapterDiscoveryOptionsBase* options) {
-    return DAWN_FORMAT_VALIDATION_ERROR("DiscoverAdapters not implemented for this backend.");
+    return DAWN_VALIDATION_ERROR("DiscoverAdapters not implemented for this backend.");
 }
 
 }  // namespace dawn::native
diff --git a/src/dawn/native/BindGroupLayout.cpp b/src/dawn/native/BindGroupLayout.cpp
index b57cd69..ae4f071 100644
--- a/src/dawn/native/BindGroupLayout.cpp
+++ b/src/dawn/native/BindGroupLayout.cpp
@@ -48,8 +48,8 @@
     switch (dimension) {
         case wgpu::TextureViewDimension::Cube:
         case wgpu::TextureViewDimension::CubeArray:
-            return DAWN_FORMAT_VALIDATION_ERROR(
-                "%s texture views cannot be used as storage textures.", dimension);
+            return DAWN_VALIDATION_ERROR("%s texture views cannot be used as storage textures.",
+                                         dimension);
 
         case wgpu::TextureViewDimension::e1D:
         case wgpu::TextureViewDimension::e2D:
diff --git a/src/dawn/native/Buffer.cpp b/src/dawn/native/Buffer.cpp
index b9b2e3d..3c0f4e1 100644
--- a/src/dawn/native/Buffer.cpp
+++ b/src/dawn/native/Buffer.cpp
@@ -292,10 +292,10 @@
 
     switch (mState) {
         case BufferState::Destroyed:
-            return DAWN_FORMAT_VALIDATION_ERROR("%s used in submit while destroyed.", this);
+            return DAWN_VALIDATION_ERROR("%s used in submit while destroyed.", this);
         case BufferState::Mapped:
         case BufferState::MappedAtCreation:
-            return DAWN_FORMAT_VALIDATION_ERROR("%s used in submit while mapped.", this);
+            return DAWN_VALIDATION_ERROR("%s used in submit while mapped.", this);
         case BufferState::Unmapped:
             return {};
     }
@@ -463,9 +463,9 @@
     switch (mState) {
         case BufferState::Mapped:
         case BufferState::MappedAtCreation:
-            return DAWN_FORMAT_VALIDATION_ERROR("%s is already mapped.", this);
+            return DAWN_VALIDATION_ERROR("%s is already mapped.", this);
         case BufferState::Destroyed:
-            return DAWN_FORMAT_VALIDATION_ERROR("%s is destroyed.", this);
+            return DAWN_VALIDATION_ERROR("%s is destroyed.", this);
         case BufferState::Unmapped:
             break;
     }
@@ -540,9 +540,9 @@
             // even if it did not have a mappable usage.
             return {};
         case BufferState::Unmapped:
-            return DAWN_FORMAT_VALIDATION_ERROR("%s is unmapped.", this);
+            return DAWN_VALIDATION_ERROR("%s is unmapped.", this);
         case BufferState::Destroyed:
-            return DAWN_FORMAT_VALIDATION_ERROR("%s is destroyed.", this);
+            return DAWN_VALIDATION_ERROR("%s is destroyed.", this);
     }
     UNREACHABLE();
 }
diff --git a/src/dawn/native/CommandBufferStateTracker.cpp b/src/dawn/native/CommandBufferStateTracker.cpp
index 3a213fe..ebf00ad 100644
--- a/src/dawn/native/CommandBufferStateTracker.cpp
+++ b/src/dawn/native/CommandBufferStateTracker.cpp
@@ -297,7 +297,7 @@
         // because to have invalid aspects one of the above conditions must have failed earlier.
         // If this is reached, make sure lazy aspects and the error checks above are consistent.
         UNREACHABLE();
-        return DAWN_FORMAT_VALIDATION_ERROR("Index buffer is invalid.");
+        return DAWN_VALIDATION_ERROR("Index buffer is invalid.");
     }
 
     // TODO(dawn:563): Indicate which slots were not set.
@@ -355,7 +355,7 @@
         // because to have invalid aspects one of the above conditions must have failed earlier.
         // If this is reached, make sure lazy aspects and the error checks above are consistent.
         UNREACHABLE();
-        return DAWN_FORMAT_VALIDATION_ERROR("Bind groups are invalid.");
+        return DAWN_VALIDATION_ERROR("Bind groups are invalid.");
     }
 
     UNREACHABLE();
diff --git a/src/dawn/native/CommandEncoder.cpp b/src/dawn/native/CommandEncoder.cpp
index 9bb8c0d..1ac551a 100644
--- a/src/dawn/native/CommandEncoder.cpp
+++ b/src/dawn/native/CommandEncoder.cpp
@@ -88,7 +88,7 @@
         switch (src.texture->GetFormat().format) {
             case wgpu::TextureFormat::Depth24Plus:
             case wgpu::TextureFormat::Depth24PlusStencil8:
-                return DAWN_FORMAT_VALIDATION_ERROR(
+                return DAWN_VALIDATION_ERROR(
                     "The depth aspect of %s format %s cannot be selected in a texture to "
                     "buffer copy.",
                     src.texture, src.texture->GetFormat().format);
@@ -734,7 +734,7 @@
     : ApiObjectBase(device, tag),
       mEncodingContext(device, this),
       mUsageValidationMode(UsageValidationMode::Default) {
-    mEncodingContext.HandleError(DAWN_FORMAT_VALIDATION_ERROR("%s is invalid.", this));
+    mEncodingContext.HandleError(DAWN_VALIDATION_ERROR("%s is invalid.", this));
 }
 
 ObjectType CommandEncoder::GetType() const {
@@ -1300,7 +1300,7 @@
 
 void CommandEncoder::APIInjectValidationError(const char* message) {
     if (mEncodingContext.CheckCurrentEncoder(this)) {
-        mEncodingContext.HandleError(DAWN_VALIDATION_ERROR(message));
+        mEncodingContext.HandleError(DAWN_MAKE_ERROR(InternalErrorType::Validation, message));
     }
 }
 
diff --git a/src/dawn/native/CommandValidation.cpp b/src/dawn/native/CommandValidation.cpp
index d0bdb0c..a3929f3 100644
--- a/src/dawn/native/CommandValidation.cpp
+++ b/src/dawn/native/CommandValidation.cpp
@@ -55,7 +55,7 @@
             bool readOnly = IsSubset(usage, kReadOnlyTextureUsages);
             bool singleUse = wgpu::HasZeroOrOneBits(usage);
             if (!readOnly && !singleUse && !error.IsError()) {
-                error = DAWN_FORMAT_VALIDATION_ERROR(
+                error = DAWN_VALIDATION_ERROR(
                     "%s usage (%s) includes writable usage and another usage in the same "
                     "synchronization scope.",
                     scope.textures[i], usage);
@@ -420,7 +420,7 @@
         switch (src.texture->GetDimension()) {
             case wgpu::TextureDimension::e1D:
                 ASSERT(src.mipLevel == 0 && src.origin.z == 0 && dst.origin.z == 0);
-                return DAWN_FORMAT_VALIDATION_ERROR("Copy is from %s to itself.", src.texture);
+                return DAWN_VALIDATION_ERROR("Copy is from %s to itself.", src.texture);
 
             case wgpu::TextureDimension::e2D:
                 DAWN_INVALID_IF(
diff --git a/src/dawn/native/ComputePipeline.cpp b/src/dawn/native/ComputePipeline.cpp
index b0b574d..eca8467 100644
--- a/src/dawn/native/ComputePipeline.cpp
+++ b/src/dawn/native/ComputePipeline.cpp
@@ -23,7 +23,7 @@
 MaybeError ValidateComputePipelineDescriptor(DeviceBase* device,
                                              const ComputePipelineDescriptor* descriptor) {
     if (descriptor->nextInChain != nullptr) {
-        return DAWN_FORMAT_VALIDATION_ERROR("nextInChain must be nullptr.");
+        return DAWN_VALIDATION_ERROR("nextInChain must be nullptr.");
     }
 
     if (descriptor->layout != nullptr) {
diff --git a/src/dawn/native/CopyTextureForBrowserHelper.cpp b/src/dawn/native/CopyTextureForBrowserHelper.cpp
index f8cece1..d7890ed 100644
--- a/src/dawn/native/CopyTextureForBrowserHelper.cpp
+++ b/src/dawn/native/CopyTextureForBrowserHelper.cpp
@@ -242,8 +242,7 @@
         case wgpu::TextureFormat::RGBA16Float:
             break;
         default:
-            return DAWN_FORMAT_VALIDATION_ERROR("Source texture format (%s) is not supported.",
-                                                srcFormat);
+            return DAWN_VALIDATION_ERROR("Source texture format (%s) is not supported.", srcFormat);
     }
 
     switch (dstFormat) {
@@ -262,8 +261,8 @@
         case wgpu::TextureFormat::RGBA32Float:
             break;
         default:
-            return DAWN_FORMAT_VALIDATION_ERROR("Destination texture format (%s) is not supported.",
-                                                dstFormat);
+            return DAWN_VALIDATION_ERROR("Destination texture format (%s) is not supported.",
+                                         dstFormat);
     }
 
     return {};
diff --git a/src/dawn/native/EncodingContext.cpp b/src/dawn/native/EncodingContext.cpp
index d222927..9b7f367 100644
--- a/src/dawn/native/EncodingContext.cpp
+++ b/src/dawn/native/EncodingContext.cpp
@@ -44,7 +44,7 @@
     // If we weren't already finished, then we want to handle an error here so that any calls
     // to Finish after Destroy will return a meaningful error.
     if (!IsFinished()) {
-        HandleError(DAWN_FORMAT_VALIDATION_ERROR("Destroyed encoder cannot be finished."));
+        HandleError(DAWN_VALIDATION_ERROR("Destroyed encoder cannot be finished."));
     }
     mDestroyed = true;
     mCurrentEncoder = nullptr;
@@ -151,8 +151,8 @@
     if (mCurrentEncoder != mTopLevelEncoder && mCurrentEncoder == passEncoder) {
         // The current pass encoder is being deleted. Implicitly end the pass with an error.
         mCurrentEncoder = mTopLevelEncoder;
-        HandleError(DAWN_FORMAT_VALIDATION_ERROR(
-            "Command buffer recording ended before %s was ended.", passEncoder));
+        HandleError(DAWN_VALIDATION_ERROR("Command buffer recording ended before %s was ended.",
+                                          passEncoder));
     }
 }
 
diff --git a/src/dawn/native/EncodingContext.h b/src/dawn/native/EncodingContext.h
index 020132e..3614a09 100644
--- a/src/dawn/native/EncodingContext.h
+++ b/src/dawn/native/EncodingContext.h
@@ -80,18 +80,17 @@
 
     inline bool CheckCurrentEncoder(const ApiObjectBase* encoder) {
         if (mDestroyed) {
-            HandleError(
-                DAWN_FORMAT_VALIDATION_ERROR("Recording in a destroyed %s.", mCurrentEncoder));
+            HandleError(DAWN_VALIDATION_ERROR("Recording in a destroyed %s.", mCurrentEncoder));
             return false;
         }
         if (DAWN_UNLIKELY(encoder != mCurrentEncoder)) {
             if (mCurrentEncoder != mTopLevelEncoder) {
                 // The top level encoder was used when a pass encoder was current.
-                HandleError(DAWN_FORMAT_VALIDATION_ERROR(
-                    "Command cannot be recorded while %s is active.", mCurrentEncoder));
+                HandleError(DAWN_VALIDATION_ERROR("Command cannot be recorded while %s is active.",
+                                                  mCurrentEncoder));
             } else {
-                HandleError(DAWN_FORMAT_VALIDATION_ERROR(
-                    "Recording in an error or already ended %s.", encoder));
+                HandleError(
+                    DAWN_VALIDATION_ERROR("Recording in an error or already ended %s.", encoder));
             }
             return false;
         }
diff --git a/src/dawn/native/Error.h b/src/dawn/native/Error.h
index 0b71644..1f12864 100644
--- a/src/dawn/native/Error.h
+++ b/src/dawn/native/Error.h
@@ -43,7 +43,7 @@
 //   return DAWN_MAKE_ERROR(errorType, "My error message");
 //
 // but shorthand version for specific error types are preferred:
-//   return DAWN_VALIDATION_ERROR("My error message");
+//   return DAWN_VALIDATION_ERROR("My error message with details %s", details);
 //
 // There are different types of errors that should be used for different purpose:
 //
@@ -71,11 +71,7 @@
 #define DAWN_MAKE_ERROR(TYPE, MESSAGE) \
     ::dawn::native::ErrorData::Create(TYPE, MESSAGE, __FILE__, __func__, __LINE__)
 
-#define DAWN_VALIDATION_ERROR(MESSAGE) DAWN_MAKE_ERROR(InternalErrorType::Validation, MESSAGE)
-
-// TODO(dawn:563): Rename to DAWN_VALIDATION_ERROR once all message format strings have been
-// converted to constexpr.
-#define DAWN_FORMAT_VALIDATION_ERROR(...) \
+#define DAWN_VALIDATION_ERROR(...) \
     DAWN_MAKE_ERROR(InternalErrorType::Validation, absl::StrFormat(__VA_ARGS__))
 
 #define DAWN_INVALID_IF(EXPR, ...)                                                           \
diff --git a/src/dawn/native/ExternalTexture.cpp b/src/dawn/native/ExternalTexture.cpp
index a23faa7..42a511b 100644
--- a/src/dawn/native/ExternalTexture.cpp
+++ b/src/dawn/native/ExternalTexture.cpp
@@ -91,7 +91,7 @@
                 DAWN_TRY(ValidateExternalTexturePlane(descriptor->plane0));
                 break;
             default:
-                return DAWN_FORMAT_VALIDATION_ERROR(
+                return DAWN_VALIDATION_ERROR(
                     "The external texture plane (%s) format (%s) is not a supported format "
                     "(%s, %s, %s).",
                     descriptor->plane0, plane0Format, wgpu::TextureFormat::RGBA8Unorm,
diff --git a/src/dawn/native/Instance.cpp b/src/dawn/native/Instance.cpp
index 78afd8e..4e734ca 100644
--- a/src/dawn/native/Instance.cpp
+++ b/src/dawn/native/Instance.cpp
@@ -385,7 +385,7 @@
     DAWN_TRY(ValidateBackendType(backendType));
 
     if (!GetEnabledBackends()[backendType]) {
-        return DAWN_FORMAT_VALIDATION_ERROR("%s not supported.", backendType);
+        return DAWN_VALIDATION_ERROR("%s not supported.", backendType);
     }
 
     EnsureBackendConnection(backendType);
diff --git a/src/dawn/native/Pipeline.cpp b/src/dawn/native/Pipeline.cpp
index 513bd2a..50a4b9c 100644
--- a/src/dawn/native/Pipeline.cpp
+++ b/src/dawn/native/Pipeline.cpp
@@ -42,12 +42,12 @@
     const EntryPointMetadata& metadata = module->GetEntryPoint(entryPoint);
 
     if (!metadata.infringedLimitErrors.empty()) {
-        std::ostringstream out;
-        out << "Entry point \"" << entryPoint << "\" infringes limits:\n";
+        std::ostringstream limitList;
         for (const std::string& limit : metadata.infringedLimitErrors) {
-            out << " - " << limit << "\n";
+            limitList << " - " << limit << "\n";
         }
-        return DAWN_VALIDATION_ERROR(out.str());
+        return DAWN_VALIDATION_ERROR("Entry point \"%s\" infringes limits:\n%s", entryPoint,
+                                     limitList.str());
     }
 
     DAWN_INVALID_IF(metadata.stage != stage,
@@ -81,7 +81,7 @@
             stageInitializedConstantIdentifiers.insert(constants[i].key);
         } else {
             // There are duplicate initializations
-            return DAWN_FORMAT_VALIDATION_ERROR(
+            return DAWN_VALIDATION_ERROR(
                 "Pipeline overridable constants \"%s\" is set more than once in %s",
                 constants[i].key, module);
         }
@@ -104,7 +104,7 @@
             uninitializedConstantsArray.append(identifier);
         }
 
-        return DAWN_FORMAT_VALIDATION_ERROR(
+        return DAWN_VALIDATION_ERROR(
             "There are uninitialized pipeline overridable constants in shader module %s, their "
             "identifiers:[%s]",
             module, uninitializedConstantsArray);
diff --git a/src/dawn/native/ProgrammableEncoder.cpp b/src/dawn/native/ProgrammableEncoder.cpp
index 29a0f03..ce3140b 100644
--- a/src/dawn/native/ProgrammableEncoder.cpp
+++ b/src/dawn/native/ProgrammableEncoder.cpp
@@ -170,7 +170,7 @@
                 static_cast<uint32_t>(i), dynamicOffsets[i], bufferBinding.buffer,
                 bufferBinding.buffer->GetSize(), bufferBinding.offset, bufferBinding.size);
 
-            return DAWN_FORMAT_VALIDATION_ERROR(
+            return DAWN_VALIDATION_ERROR(
                 "Dynamic Offset[%u] (%u) is out of bounds of "
                 "%s with a size of %u and a bound range of (offset: %u, size: %u).",
                 static_cast<uint32_t>(i), dynamicOffsets[i], bufferBinding.buffer,
diff --git a/src/dawn/native/Sampler.cpp b/src/dawn/native/Sampler.cpp
index 7e436fc..5d87157 100644
--- a/src/dawn/native/Sampler.cpp
+++ b/src/dawn/native/Sampler.cpp
@@ -46,8 +46,8 @@
                         descriptor->magFilter, descriptor->minFilter, descriptor->mipmapFilter,
                         wgpu::FilterMode::Linear, descriptor->maxAnisotropy);
     } else if (descriptor->maxAnisotropy == 0u) {
-        return DAWN_FORMAT_VALIDATION_ERROR("Max anisotropy (%f) is less than 1.",
-                                            descriptor->maxAnisotropy);
+        return DAWN_VALIDATION_ERROR("Max anisotropy (%f) is less than 1.",
+                                     descriptor->maxAnisotropy);
     }
 
     DAWN_TRY(ValidateFilterMode(descriptor->minFilter));
diff --git a/src/dawn/native/ShaderModule.cpp b/src/dawn/native/ShaderModule.cpp
index c9871e8..6769f7e 100644
--- a/src/dawn/native/ShaderModule.cpp
+++ b/src/dawn/native/ShaderModule.cpp
@@ -299,13 +299,12 @@
         outMessages->AddMessages(program.Diagnostics());
     }
     if (!program.IsValid()) {
-        return DAWN_FORMAT_VALIDATION_ERROR("Tint WGSL reader failure: %s\n",
-                                            program.Diagnostics().str());
+        return DAWN_VALIDATION_ERROR("Tint WGSL reader failure: %s\n", program.Diagnostics().str());
     }
 
     return std::move(program);
 #else
-    return DAWN_FORMAT_VALIDATION_ERROR("TINT_BUILD_WGSL_READER is not defined.");
+    return DAWN_VALIDATION_ERROR("TINT_BUILD_WGSL_READER is not defined.");
 #endif
 }
 
@@ -317,13 +316,13 @@
         outMessages->AddMessages(program.Diagnostics());
     }
     if (!program.IsValid()) {
-        return DAWN_FORMAT_VALIDATION_ERROR("Tint SPIR-V reader failure:\nParser: %s\n",
-                                            program.Diagnostics().str());
+        return DAWN_VALIDATION_ERROR("Tint SPIR-V reader failure:\nParser: %s\n",
+                                     program.Diagnostics().str());
     }
 
     return std::move(program);
 #else
-    return DAWN_FORMAT_VALIDATION_ERROR("TINT_BUILD_SPV_READER is not defined.");
+    return DAWN_VALIDATION_ERROR("TINT_BUILD_SPV_READER is not defined.");
 
 #endif
 }
diff --git a/src/dawn/native/Surface.cpp b/src/dawn/native/Surface.cpp
index 6822dbb..39b0cbb 100644
--- a/src/dawn/native/Surface.cpp
+++ b/src/dawn/native/Surface.cpp
@@ -162,7 +162,7 @@
     }
 #endif  // defined(DAWN_USE_X11)
 
-    return DAWN_FORMAT_VALIDATION_ERROR("Unsupported sType (%s)", descriptor->nextInChain->sType);
+    return DAWN_VALIDATION_ERROR("Unsupported sType (%s)", descriptor->nextInChain->sType);
 }
 
 // static
diff --git a/src/dawn/native/SwapChain.cpp b/src/dawn/native/SwapChain.cpp
index 1908929..60cd62b 100644
--- a/src/dawn/native/SwapChain.cpp
+++ b/src/dawn/native/SwapChain.cpp
@@ -35,16 +35,16 @@
                       wgpu::TextureUsage allowedUsage,
                       uint32_t width,
                       uint32_t height) override {
-        GetDevice()->ConsumedError(DAWN_FORMAT_VALIDATION_ERROR("%s is an error swapchain.", this));
+        GetDevice()->ConsumedError(DAWN_VALIDATION_ERROR("%s is an error swapchain.", this));
     }
 
     TextureViewBase* APIGetCurrentTextureView() override {
-        GetDevice()->ConsumedError(DAWN_FORMAT_VALIDATION_ERROR("%s is an error swapchain.", this));
+        GetDevice()->ConsumedError(DAWN_VALIDATION_ERROR("%s is an error swapchain.", this));
         return TextureViewBase::MakeError(GetDevice());
     }
 
     void APIPresent() override {
-        GetDevice()->ConsumedError(DAWN_FORMAT_VALIDATION_ERROR("%s is an error swapchain.", this));
+        GetDevice()->ConsumedError(DAWN_VALIDATION_ERROR("%s is an error swapchain.", this));
     }
 };
 
@@ -301,7 +301,7 @@
                                     uint32_t width,
                                     uint32_t height) {
     GetDevice()->ConsumedError(
-        DAWN_FORMAT_VALIDATION_ERROR("Configure is invalid for surface-based swapchains."));
+        DAWN_VALIDATION_ERROR("Configure is invalid for surface-based swapchains."));
 }
 
 TextureViewBase* NewSwapChainBase::APIGetCurrentTextureView() {
diff --git a/src/dawn/native/Texture.cpp b/src/dawn/native/Texture.cpp
index d170bff..7efbbf8 100644
--- a/src/dawn/native/Texture.cpp
+++ b/src/dawn/native/Texture.cpp
@@ -54,7 +54,7 @@
         if (viewFormat.format == aspectFormat) {
             return {};
         } else {
-            return DAWN_FORMAT_VALIDATION_ERROR(
+            return DAWN_VALIDATION_ERROR(
                 "The view format (%s) is not compatible with %s of %s (%s).", viewFormat.format,
                 aspect, format.format, aspectFormat);
         }
@@ -78,7 +78,7 @@
         // The view format isn't compatible with the format at all. Return an error
         // that indicates this, in addition to reporting that it's missing from the
         // list.
-        return DAWN_FORMAT_VALIDATION_ERROR(
+        return DAWN_VALIDATION_ERROR(
             "The texture view format (%s) is not compatible with the "
             "texture format (%s)."
             "The formats must be compatible, and the view format "
@@ -86,7 +86,7 @@
             viewFormat.format, format.format);
     } else {
         // The view format is compatible, but not in the list.
-        return DAWN_FORMAT_VALIDATION_ERROR(
+        return DAWN_VALIDATION_ERROR(
             "%s was not created with the texture view format (%s) "
             "in the list of compatible view formats.",
             texture, viewFormat.format);
diff --git a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
index ce83dbe..9e1b9e9 100644
--- a/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
+++ b/src/dawn/native/d3d12/ShaderModuleD3D12.cpp
@@ -282,8 +282,8 @@
         ComPtr<IDxcBlobEncoding> errors;
         DAWN_TRY(CheckHRESULT(result->GetErrorBuffer(&errors), "DXC get error buffer"));
 
-        return DAWN_FORMAT_VALIDATION_ERROR("DXC compile failed with: %s",
-                                            static_cast<char*>(errors->GetBufferPointer()));
+        return DAWN_VALIDATION_ERROR("DXC compile failed with: %s",
+                                     static_cast<char*>(errors->GetBufferPointer()));
     }
 
     ComPtr<IDxcBlob> compiledShader;
@@ -447,15 +447,14 @@
             *remappedEntryPointName = r.entryPointName;
         }
     } else {
-        return DAWN_FORMAT_VALIDATION_ERROR("Transform output missing renamer data.");
+        return DAWN_VALIDATION_ERROR("Transform output missing renamer data.");
     }
 
     if (r.stage == SingleShaderStage::Vertex) {
         if (auto* data = transformOutputs.Get<tint::transform::FirstIndexOffset::Data>()) {
             *usesVertexOrInstanceIndex = data->has_vertex_or_instance_index;
         } else {
-            return DAWN_FORMAT_VALIDATION_ERROR(
-                "Transform output missing first index offset data.");
+            return DAWN_VALIDATION_ERROR("Transform output missing first index offset data.");
         }
     }
 
diff --git a/src/dawn/native/d3d12/TextureD3D12.cpp b/src/dawn/native/d3d12/TextureD3D12.cpp
index 41bc0a0..1d0e6d4 100644
--- a/src/dawn/native/d3d12/TextureD3D12.cpp
+++ b/src/dawn/native/d3d12/TextureD3D12.cpp
@@ -490,7 +490,7 @@
             break;
     }
 
-    return DAWN_FORMAT_VALIDATION_ERROR("DXGI format does not support cross-API sharing.");
+    return DAWN_VALIDATION_ERROR("DXGI format does not support cross-API sharing.");
 }
 
 // static
diff --git a/src/dawn/native/metal/ShaderModuleMTL.mm b/src/dawn/native/metal/ShaderModuleMTL.mm
index 5a72f30..5d4196b 100644
--- a/src/dawn/native/metal/ShaderModuleMTL.mm
+++ b/src/dawn/native/metal/ShaderModuleMTL.mm
@@ -227,7 +227,7 @@
                     remappedEntryPointName = r.entryPointName;
                 }
             } else {
-                return DAWN_FORMAT_VALIDATION_ERROR("Transform output missing renamer data.");
+                return DAWN_VALIDATION_ERROR("Transform output missing renamer data.");
             }
 
             tint::writer::msl::Options options;
@@ -335,8 +335,8 @@
                                                                       error:&error]);
                 if (error != nullptr) {
                     if (error.code != MTLLibraryErrorCompileWarning) {
-                        return DAWN_FORMAT_VALIDATION_ERROR(
-                            "Function compile error: %s", [error.localizedDescription UTF8String]);
+                        return DAWN_VALIDATION_ERROR("Function compile error: %s",
+                                                     [error.localizedDescription UTF8String]);
                     }
                 }
                 ASSERT(out->function != nil);
diff --git a/src/dawn/native/metal/TextureMTL.mm b/src/dawn/native/metal/TextureMTL.mm
index a508b65..98d4f31 100644
--- a/src/dawn/native/metal/TextureMTL.mm
+++ b/src/dawn/native/metal/TextureMTL.mm
@@ -197,7 +197,7 @@
         case kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange:
             return wgpu::TextureFormat::R8BG8Biplanar420Unorm;
         default:
-            return DAWN_FORMAT_VALIDATION_ERROR("Unsupported IOSurface format (%x).", format);
+            return DAWN_VALIDATION_ERROR("Unsupported IOSurface format (%x).", format);
     }
 }
 
diff --git a/src/dawn/native/opengl/DeviceGL.cpp b/src/dawn/native/opengl/DeviceGL.cpp
index 35ff4ef..4246d5f 100644
--- a/src/dawn/native/opengl/DeviceGL.cpp
+++ b/src/dawn/native/opengl/DeviceGL.cpp
@@ -299,7 +299,7 @@
     Surface* surface,
     NewSwapChainBase* previousSwapChain,
     const SwapChainDescriptor* descriptor) {
-    return DAWN_FORMAT_VALIDATION_ERROR("New swapchains not implemented.");
+    return DAWN_VALIDATION_ERROR("New swapchains not implemented.");
 }
 ResultOrError<Ref<TextureBase>> Device::CreateTextureImpl(const TextureDescriptor* descriptor) {
     return AcquireRef(new Texture(this, descriptor));
@@ -364,7 +364,7 @@
     if (textureDescriptor->size.width != static_cast<uint32_t>(width) ||
         textureDescriptor->size.height != static_cast<uint32_t>(height) ||
         textureDescriptor->size.depthOrArrayLayers != 1) {
-        ConsumedError(DAWN_FORMAT_VALIDATION_ERROR(
+        ConsumedError(DAWN_VALIDATION_ERROR(
             "EGLImage size (width: %u, height: %u, depth: 1) doesn't match descriptor size %s.",
             width, height, &textureDescriptor->size));
         gl.DeleteTextures(1, &tex);
diff --git a/src/dawn/native/opengl/PipelineGL.cpp b/src/dawn/native/opengl/PipelineGL.cpp
index 701102c..2226be9 100644
--- a/src/dawn/native/opengl/PipelineGL.cpp
+++ b/src/dawn/native/opengl/PipelineGL.cpp
@@ -82,7 +82,7 @@
         if (infoLogLength > 1) {
             std::vector<char> buffer(infoLogLength);
             gl.GetProgramInfoLog(mProgram, infoLogLength, nullptr, &buffer[0]);
-            return DAWN_FORMAT_VALIDATION_ERROR("Program link failed:\n%s", buffer.data());
+            return DAWN_VALIDATION_ERROR("Program link failed:\n%s", buffer.data());
         }
     }
 
diff --git a/src/dawn/native/opengl/ShaderModuleGL.cpp b/src/dawn/native/opengl/ShaderModuleGL.cpp
index 6c427ee..172d401 100644
--- a/src/dawn/native/opengl/ShaderModuleGL.cpp
+++ b/src/dawn/native/opengl/ShaderModuleGL.cpp
@@ -264,8 +264,8 @@
             std::vector<char> buffer(infoLogLength);
             gl.GetShaderInfoLog(shader, infoLogLength, nullptr, &buffer[0]);
             gl.DeleteShader(shader);
-            return DAWN_FORMAT_VALIDATION_ERROR("%s\nProgram compilation failed:\n%s", source,
-                                                buffer.data());
+            return DAWN_VALIDATION_ERROR("%s\nProgram compilation failed:\n%s", source,
+                                         buffer.data());
         }
     }
 
diff --git a/src/dawn/native/vulkan/SwapChainVk.cpp b/src/dawn/native/vulkan/SwapChainVk.cpp
index 0a17baf..c452488 100644
--- a/src/dawn/native/vulkan/SwapChainVk.cpp
+++ b/src/dawn/native/vulkan/SwapChainVk.cpp
@@ -225,8 +225,7 @@
             break;
     }
 
-    return DAWN_FORMAT_VALIDATION_ERROR("Unsupported surface type (%s) for Vulkan.",
-                                        surface->GetType());
+    return DAWN_VALIDATION_ERROR("Unsupported surface type (%s) for Vulkan.", surface->GetType());
 }
 
 VkPresentModeKHR ToVulkanPresentMode(wgpu::PresentMode mode) {
diff --git a/src/dawn/native/vulkan/external_memory/MemoryServiceDmaBuf.cpp b/src/dawn/native/vulkan/external_memory/MemoryServiceDmaBuf.cpp
index 0729d47..2f6445a 100644
--- a/src/dawn/native/vulkan/external_memory/MemoryServiceDmaBuf.cpp
+++ b/src/dawn/native/vulkan/external_memory/MemoryServiceDmaBuf.cpp
@@ -69,7 +69,7 @@
     if (GetFormatModifierProps(fn, physicalDevice, format, modifier, &props)) {
         return static_cast<uint32_t>(props.drmFormatModifierPlaneCount);
     }
-    return DAWN_FORMAT_VALIDATION_ERROR("DRM format modifier not supported.");
+    return DAWN_VALIDATION_ERROR("DRM format modifier not supported.");
 }
 
 bool IsMultiPlanarVkFormat(VkFormat format) {
diff --git a/src/dawn/tests/unittests/ErrorTests.cpp b/src/dawn/tests/unittests/ErrorTests.cpp
index 53c06cf..524a94d 100644
--- a/src/dawn/tests/unittests/ErrorTests.cpp
+++ b/src/dawn/tests/unittests/ErrorTests.cpp
@@ -22,7 +22,7 @@
 namespace {
 
 int placeholderSuccess = 0xbeef;
-const char* placeholderErrorMessage = "I am an error message :3";
+constexpr const char* placeholderErrorMessage = "I am an error message :3";
 
 // Check returning a success MaybeError with {};
 TEST(ErrorTests, Error_Success) {
