diff --git a/generator/dawn_json_generator.py b/generator/dawn_json_generator.py
index fa8a1ee..7ecf906 100644
--- a/generator/dawn_json_generator.py
+++ b/generator/dawn_json_generator.py
@@ -923,12 +923,12 @@
                            'src/' + native_dir + '/ChainUtils_autogen.cpp',
                            frontend_params))
             renders.append(
-                FileRender('dawn_native/webgpu_absl_format.h',
-                           'src/dawn_native/webgpu_absl_format_autogen.h',
+                FileRender('dawn_native/api_absl_format.h',
+                           'src/' + native_dir + '/' + api + '_absl_format_autogen.h',
                            frontend_params))
             renders.append(
-                FileRender('dawn_native/webgpu_absl_format.cpp',
-                           'src/dawn_native/webgpu_absl_format_autogen.cpp',
+                FileRender('dawn_native/api_absl_format.cpp',
+                           'src/' + native_dir + '/' + api + '_absl_format_autogen.cpp',
                            frontend_params))
             renders.append(
                 FileRender('dawn_native/ObjectType.h',
diff --git a/generator/templates/dawn_native/api_absl_format.cpp b/generator/templates/dawn_native/api_absl_format.cpp
new file mode 100644
index 0000000..8145990
--- /dev/null
+++ b/generator/templates/dawn_native/api_absl_format.cpp
@@ -0,0 +1,131 @@
+//* Copyright 2021 The Dawn Authors
+//*
+//* Licensed under the Apache License, Version 2.0 (the "License");
+//* you may not use this file except in compliance with the License.
+//* You may obtain a copy of the License at
+//*
+//*     http://www.apache.org/licenses/LICENSE-2.0
+//*
+//* Unless required by applicable law or agreed to in writing, software
+//* distributed under the License is distributed on an "AS IS" BASIS,
+//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//* See the License for the specific language governing permissions and
+//* limitations under the License.
+
+{% set impl_dir = metadata.impl_dir + "/" if metadata.impl_dir else "" %}
+{% set native_namespace = Name(metadata.native_namespace).snake_case() %}
+{% set native_dir = impl_dir + native_namespace %}
+{% set api = metadata.api.lower() %}
+#include "{{native_dir}}/{{api}}_absl_format_autogen.h"
+
+#include "{{native_dir}}/ObjectType_autogen.h"
+
+namespace {{native_namespace}} {
+
+    //
+    // Descriptors
+    //
+
+    {% for type in by_category["structure"] %}
+        {% for member in type.members %}
+            {% if member.name.canonical_case() == "label" %}
+                absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+                AbslFormatConvert(const {{as_cppType(type.name)}}* value,
+                                    const absl::FormatConversionSpec& spec,
+                                    absl::FormatSink* s) {
+                    if (value == nullptr) {
+                        s->Append("[null]");
+                        return {true};
+                    }
+                    s->Append("[{{as_cppType(type.name)}}");
+                    if (value->label != nullptr) {
+                        s->Append(absl::StrFormat(" \"%s\"", value->label));
+                    }
+                    s->Append("]");
+                    return {true};
+                }
+            {% endif %}
+        {% endfor %}
+    {% endfor %}
+
+}  // namespace {{native_namespace}}
+
+{% set namespace = metadata.namespace %}
+namespace {{namespace}} {
+
+    //
+    // Enums
+    //
+
+    {% for type in by_category["enum"] %}
+        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+        AbslFormatConvert({{as_cppType(type.name)}} value,
+                            const absl::FormatConversionSpec& spec,
+                            absl::FormatSink* s) {
+            s->Append("{{as_cppType(type.name)}}::");
+            switch (value) {
+            {% for value in type.values %}
+                case {{as_cppType(type.name)}}::{{as_cppEnum(value.name)}}:
+                s->Append("{{as_cppEnum(value.name)}}");
+                break;
+            {% endfor %}
+                default:
+                s->Append(absl::StrFormat("%x", static_cast<typename std::underlying_type<{{as_cppType(type.name)}}>::type>(value)));
+            }
+            return {true};
+        }
+    {% endfor %}
+
+    //
+    // Bitmasks
+    //
+
+    {% for type in by_category["bitmask"] %}
+        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+        AbslFormatConvert({{as_cppType(type.name)}} value,
+                            const absl::FormatConversionSpec& spec,
+                            absl::FormatSink* s) {
+            s->Append("{{as_cppType(type.name)}}::");
+            if (!static_cast<bool>(value)) {
+                {% for value in type.values if value.value == 0 %}
+                    // 0 is often explicitly declared as None.
+                    s->Append("{{as_cppEnum(value.name)}}");
+                {% else %}
+                    s->Append(absl::StrFormat("{{as_cppType(type.name)}}::%x", 0));
+                {% endfor %}
+                return {true};
+            }
+
+            bool moreThanOneBit = !HasZeroOrOneBits(value);
+            if (moreThanOneBit) {
+                s->Append("(");
+            }
+
+            bool first = true;
+            {% for value in type.values if value.value != 0 %}
+                if (value & {{as_cppType(type.name)}}::{{as_cppEnum(value.name)}}) {
+                    if (!first) {
+                        s->Append("|");
+                    }
+                    first = false;
+                    s->Append("{{as_cppEnum(value.name)}}");
+                    value &= ~{{as_cppType(type.name)}}::{{as_cppEnum(value.name)}};
+                }
+            {% endfor %}
+
+            if (static_cast<bool>(value)) {
+                if (!first) {
+                    s->Append("|");
+                }
+                s->Append(absl::StrFormat("{{as_cppType(type.name)}}::%x", static_cast<typename std::underlying_type<{{as_cppType(type.name)}}>::type>(value)));
+            }
+
+            if (moreThanOneBit) {
+                s->Append(")");
+            }
+
+            return {true};
+        }
+    {% endfor %}
+
+}  // namespace {{namespace}}
diff --git a/generator/templates/dawn_native/api_absl_format.h b/generator/templates/dawn_native/api_absl_format.h
new file mode 100644
index 0000000..efca15b
--- /dev/null
+++ b/generator/templates/dawn_native/api_absl_format.h
@@ -0,0 +1,73 @@
+//* Copyright 2021 The Dawn Authors
+//*
+//* Licensed under the Apache License, Version 2.0 (the "License");
+//* you may not use this file except in compliance with the License.
+//* You may obtain a copy of the License at
+//*
+//*     http://www.apache.org/licenses/LICENSE-2.0
+//*
+//* Unless required by applicable law or agreed to in writing, software
+//* distributed under the License is distributed on an "AS IS" BASIS,
+//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//* See the License for the specific language governing permissions and
+//* limitations under the License.
+
+{% set API = metadata.api.upper() %}
+#ifndef {{API}}_ABSL_FORMAT_H_
+#define {{API}}_ABSL_FORMAT_H_
+
+{% set impl_dir = metadata.impl_dir + "/" if metadata.impl_dir else "" %}
+{% set native_namespace = Name(metadata.native_namespace).snake_case() %}
+{% set native_dir = impl_dir + native_namespace %}
+{% set prefix = metadata.proc_table_prefix.lower() %}
+#include "{{native_dir}}/{{prefix}}_platform.h"
+
+#include "absl/strings/str_format.h"
+
+namespace {{native_namespace}} {
+
+    //
+    // Descriptors
+    //
+
+    // Only includes structures that have a 'label' member.
+    {% for type in by_category["structure"] %}
+        {% for member in type.members %}
+            {% if member.name.canonical_case() == "label" %}
+                absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+                AbslFormatConvert(const {{as_cppType(type.name)}}* value,
+                                  const absl::FormatConversionSpec& spec,
+                                  absl::FormatSink* s);
+            {% endif %}
+        {% endfor %}
+    {% endfor %}
+} // namespace {{native_namespace}}
+
+{% set namespace = metadata.namespace %}
+namespace {{namespace}} {
+
+    //
+    // Enums
+    //
+
+    {% for type in by_category["enum"] %}
+        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+        AbslFormatConvert({{as_cppType(type.name)}} value,
+                          const absl::FormatConversionSpec& spec,
+                          absl::FormatSink* s);
+    {% endfor %}
+
+    //
+    // Bitmasks
+    //
+
+    {% for type in by_category["bitmask"] %}
+        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+        AbslFormatConvert({{as_cppType(type.name)}} value,
+                          const absl::FormatConversionSpec& spec,
+                          absl::FormatSink* s);
+    {% endfor %}
+
+}  // namespace {{namespace}}
+
+#endif // {{API}}_ABSL_FORMAT_H_
diff --git a/generator/templates/dawn_native/webgpu_absl_format.cpp b/generator/templates/dawn_native/webgpu_absl_format.cpp
deleted file mode 100644
index ec9f382..0000000
--- a/generator/templates/dawn_native/webgpu_absl_format.cpp
+++ /dev/null
@@ -1,239 +0,0 @@
-//* Copyright 2021 The Dawn Authors
-//*
-//* Licensed under the Apache License, Version 2.0 (the "License");
-//* you may not use this file except in compliance with the License.
-//* You may obtain a copy of the License at
-//*
-//*     http://www.apache.org/licenses/LICENSE-2.0
-//*
-//* Unless required by applicable law or agreed to in writing, software
-//* distributed under the License is distributed on an "AS IS" BASIS,
-//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//* See the License for the specific language governing permissions and
-//* limitations under the License.
-
-#include "dawn_native/webgpu_absl_format_autogen.h"
-
-#include "dawn_native/Device.h"
-#include "dawn_native/ObjectBase.h"
-#include "dawn_native/ObjectType_autogen.h"
-#include "dawn_native/Texture.h"
-
-namespace dawn_native {
-
-    //
-    // Structs (Manually written)
-    //
-
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const Color* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s) {
-        if (value == nullptr) {
-            s->Append("[null]");
-            return {true};
-        }
-        s->Append(absl::StrFormat("[Color r:%f, g:%f, b:%f, a:%f]",
-            value->r, value->g, value->b, value->a));
-        return {true};
-    }
-
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const Extent3D* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s) {
-        if (value == nullptr) {
-            s->Append("[null]");
-            return {true};
-        }
-        s->Append(absl::StrFormat("[Extent3D width:%u, height:%u, depthOrArrayLayers:%u]",
-            value->width, value->height, value->depthOrArrayLayers));
-        return {true};
-    }
-
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const Origin3D* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s) {
-        if (value == nullptr) {
-            s->Append("[null]");
-            return {true};
-        }
-        s->Append(absl::StrFormat("[Origin3D x:%u, y:%u, z:%u]",
-            value->x, value->y, value->z));
-        return {true};
-    }
-
-    //
-    // Objects
-    //
-
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const DeviceBase* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s) {
-        if (value == nullptr) {
-            s->Append("[null]");
-            return {true};
-        }
-        s->Append("[Device");
-        const std::string& label = value->GetLabel();
-        if (!label.empty()) {
-            s->Append(absl::StrFormat(" \"%s\"", label));
-        }
-        s->Append("]");
-        return {true};
-    }
-
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const ApiObjectBase* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s) {
-        if (value == nullptr) {
-            s->Append("[null]");
-            return {true};
-        }
-        s->Append("[");
-        if (value->IsError()) {
-            s->Append("Invalid ");
-        }
-        s->Append(ObjectTypeAsString(value->GetType()));
-        const std::string& label = value->GetLabel();
-        if (!label.empty()) {
-            s->Append(absl::StrFormat(" \"%s\"", label));
-        }
-        s->Append("]");
-        return {true};
-    }
-
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const TextureViewBase* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s) {
-        if (value == nullptr) {
-            s->Append("[null]");
-            return {true};
-        }
-        s->Append("[");
-        if (value->IsError()) {
-            s->Append("Invalid ");
-        }
-        s->Append(ObjectTypeAsString(value->GetType()));
-        const std::string& label = value->GetLabel();
-        if (!label.empty()) {
-            s->Append(absl::StrFormat(" \"%s\"", label));
-        }
-        const std::string& textureLabel = value->GetTexture()->GetLabel();
-        if (!textureLabel.empty()) {
-            s->Append(absl::StrFormat(" of Texture \"%s\"", textureLabel));
-        }
-        s->Append("]");
-        return {true};
-    }
-
-    //
-    // Descriptors
-    //
-
-    {% for type in by_category["structure"] %}
-        {% for member in type.members %}
-            {% if member.name.canonical_case() == "label" %}
-                absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-                AbslFormatConvert(const {{as_cppType(type.name)}}* value,
-                                    const absl::FormatConversionSpec& spec,
-                                    absl::FormatSink* s) {
-                    if (value == nullptr) {
-                        s->Append("[null]");
-                        return {true};
-                    }
-                    s->Append("[{{as_cppType(type.name)}}");
-                    if (value->label != nullptr) {
-                        s->Append(absl::StrFormat(" \"%s\"", value->label));
-                    }
-                    s->Append("]");
-                    return {true};
-                }
-            {% endif %}
-        {% endfor %}
-    {% endfor %}
-
-}  // namespace dawn_native
-
-namespace wgpu {
-
-    //
-    // Enums
-    //
-
-    {% for type in by_category["enum"] %}
-        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-        AbslFormatConvert({{as_cppType(type.name)}} value,
-                            const absl::FormatConversionSpec& spec,
-                            absl::FormatSink* s) {
-            s->Append("{{as_cppType(type.name)}}::");
-            switch (value) {
-            {% for value in type.values %}
-                case {{as_cppType(type.name)}}::{{as_cppEnum(value.name)}}:
-                s->Append("{{as_cppEnum(value.name)}}");
-                break;
-            {% endfor %}
-                default:
-                s->Append(absl::StrFormat("%x", static_cast<typename std::underlying_type<{{as_cppType(type.name)}}>::type>(value)));
-            }
-            return {true};
-        }
-    {% endfor %}
-
-    //
-    // Bitmasks
-    //
-
-    {% for type in by_category["bitmask"] %}
-        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-        AbslFormatConvert({{as_cppType(type.name)}} value,
-                            const absl::FormatConversionSpec& spec,
-                            absl::FormatSink* s) {
-            s->Append("{{as_cppType(type.name)}}::");
-            if (!static_cast<bool>(value)) {
-                {% for value in type.values if value.value == 0 %}
-                    // 0 is often explicitly declared as None.
-                    s->Append("{{as_cppEnum(value.name)}}");
-                {% else %}
-                    s->Append(absl::StrFormat("{{as_cppType(type.name)}}::%x", 0));
-                {% endfor %}
-                return {true};
-            }
-
-            bool moreThanOneBit = !HasZeroOrOneBits(value);
-            if (moreThanOneBit) {
-                s->Append("(");
-            }
-
-            bool first = true;
-            {% for value in type.values if value.value != 0 %}
-                if (value & {{as_cppType(type.name)}}::{{as_cppEnum(value.name)}}) {
-                    if (!first) {
-                        s->Append("|");
-                    }
-                    first = false;
-                    s->Append("{{as_cppEnum(value.name)}}");
-                    value &= ~{{as_cppType(type.name)}}::{{as_cppEnum(value.name)}};
-                }
-            {% endfor %}
-
-            if (static_cast<bool>(value)) {
-                if (!first) {
-                    s->Append("|");
-                }
-                s->Append(absl::StrFormat("{{as_cppType(type.name)}}::%x", static_cast<typename std::underlying_type<{{as_cppType(type.name)}}>::type>(value)));
-            }
-
-            if (moreThanOneBit) {
-                s->Append(")");
-            }
-
-            return {true};
-        }
-    {% endfor %}
-
-}  // namespace wgpu
diff --git a/generator/templates/dawn_native/webgpu_absl_format.h b/generator/templates/dawn_native/webgpu_absl_format.h
deleted file mode 100644
index a327841..0000000
--- a/generator/templates/dawn_native/webgpu_absl_format.h
+++ /dev/null
@@ -1,118 +0,0 @@
-//* Copyright 2021 The Dawn Authors
-//*
-//* Licensed under the Apache License, Version 2.0 (the "License");
-//* you may not use this file except in compliance with the License.
-//* You may obtain a copy of the License at
-//*
-//*     http://www.apache.org/licenses/LICENSE-2.0
-//*
-//* Unless required by applicable law or agreed to in writing, software
-//* distributed under the License is distributed on an "AS IS" BASIS,
-//* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//* See the License for the specific language governing permissions and
-//* limitations under the License.
-
-#ifndef WEBGPU_ABSL_FORMAT_H_
-#define WEBGPU_ABSL_FORMAT_H_
-
-#include "dawn_native/dawn_platform.h"
-
-#include "absl/strings/str_format.h"
-
-namespace dawn_native {
-
-    // TODO(dawn:563):
-    //  - Split the file between autogenerated parts and manually written parts.
-    //  - Forward declare common Dawn enums and have AbslFormatConvert for them.
-    //  - Support AbslFormatConvert for Dawn's typed integers.
-
-    //
-    // Structs (Manually written)
-    //
-
-    struct Color;
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const Color* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s);
-
-    struct Extent3D;
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const Extent3D* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s);
-
-    struct Origin3D;
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const Origin3D* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s);
-
-    //
-    // Objects
-    //
-
-    class DeviceBase;
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const DeviceBase* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s);
-
-    class ApiObjectBase;
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const ApiObjectBase* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s);
-
-    // Special case for TextureViews, since frequently the texture will be the
-    // thing that's labeled.
-    class TextureViewBase;
-    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-    AbslFormatConvert(const TextureViewBase* value,
-                      const absl::FormatConversionSpec& spec,
-                      absl::FormatSink* s);
-
-    //
-    // Descriptors
-    //
-
-    // Only includes structures that have a 'label' member.
-    {% for type in by_category["structure"] %}
-        {% for member in type.members %}
-            {% if member.name.canonical_case() == "label" %}
-                absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-                AbslFormatConvert(const {{as_cppType(type.name)}}* value,
-                                  const absl::FormatConversionSpec& spec,
-                                  absl::FormatSink* s);
-            {% endif %}
-        {% endfor %}
-    {% endfor %}
-}
-
-namespace wgpu {
-
-    //
-    // Enums
-    //
-
-    {% for type in by_category["enum"] %}
-        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-        AbslFormatConvert({{as_cppType(type.name)}} value,
-                          const absl::FormatConversionSpec& spec,
-                          absl::FormatSink* s);
-    {% endfor %}
-
-    //
-    // Bitmasks
-    //
-
-    {% for type in by_category["bitmask"] %}
-        absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
-        AbslFormatConvert({{as_cppType(type.name)}} value,
-                          const absl::FormatConversionSpec& spec,
-                          absl::FormatSink* s);
-    {% endfor %}
-
-}  // namespace dawn_native
-
-#endif // WEBGPU_ABSL_FORMAT_H_
diff --git a/src/dawn_native/BUILD.gn b/src/dawn_native/BUILD.gn
index 82913a8..1f2e920 100644
--- a/src/dawn_native/BUILD.gn
+++ b/src/dawn_native/BUILD.gn
@@ -331,6 +331,8 @@
     "VertexFormat.cpp",
     "VertexFormat.h",
     "dawn_platform.h",
+    "webgpu_absl_format.cpp",
+    "webgpu_absl_format.h",
     "utils/WGPUHelpers.cpp",
     "utils/WGPUHelpers.h",
   ]
diff --git a/src/dawn_native/CMakeLists.txt b/src/dawn_native/CMakeLists.txt
index b6b4f47..4196e1c 100644
--- a/src/dawn_native/CMakeLists.txt
+++ b/src/dawn_native/CMakeLists.txt
@@ -176,6 +176,8 @@
     "VertexFormat.cpp"
     "VertexFormat.h"
     "dawn_platform.h"
+    "webgpu_absl_format.cpp"
+    "webgpu_absl_format.h"
     "utils/WGPUHelpers.cpp"
     "utils/WGPUHelpers.h"
 )
diff --git a/src/dawn_native/Error.h b/src/dawn_native/Error.h
index 89296a2..c67fcdd 100644
--- a/src/dawn_native/Error.h
+++ b/src/dawn_native/Error.h
@@ -18,7 +18,7 @@
 #include "absl/strings/str_format.h"
 #include "common/Result.h"
 #include "dawn_native/ErrorData.h"
-#include "dawn_native/webgpu_absl_format_autogen.h"
+#include "dawn_native/webgpu_absl_format.h"
 
 #include <string>
 
diff --git a/src/dawn_native/webgpu_absl_format.cpp b/src/dawn_native/webgpu_absl_format.cpp
new file mode 100644
index 0000000..465fd2c
--- /dev/null
+++ b/src/dawn_native/webgpu_absl_format.cpp
@@ -0,0 +1,133 @@
+// Copyright 2021 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "dawn_native/webgpu_absl_format.h"
+
+#include "dawn_native/Device.h"
+#include "dawn_native/ObjectBase.h"
+#include "dawn_native/Texture.h"
+
+namespace dawn_native {
+
+    //
+    // Structs
+    //
+
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const Color* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s) {
+        if (value == nullptr) {
+            s->Append("[null]");
+            return {true};
+        }
+        s->Append(absl::StrFormat("[Color r:%f, g:%f, b:%f, a:%f]",
+            value->r, value->g, value->b, value->a));
+        return {true};
+    }
+
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const Extent3D* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s) {
+        if (value == nullptr) {
+            s->Append("[null]");
+            return {true};
+        }
+        s->Append(absl::StrFormat("[Extent3D width:%u, height:%u, depthOrArrayLayers:%u]",
+            value->width, value->height, value->depthOrArrayLayers));
+        return {true};
+    }
+
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const Origin3D* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s) {
+        if (value == nullptr) {
+            s->Append("[null]");
+            return {true};
+        }
+        s->Append(absl::StrFormat("[Origin3D x:%u, y:%u, z:%u]",
+            value->x, value->y, value->z));
+        return {true};
+    }
+
+    //
+    // Objects
+    //
+
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const DeviceBase* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s) {
+        if (value == nullptr) {
+            s->Append("[null]");
+            return {true};
+        }
+        s->Append("[Device");
+        const std::string& label = value->GetLabel();
+        if (!label.empty()) {
+            s->Append(absl::StrFormat(" \"%s\"", label));
+        }
+        s->Append("]");
+        return {true};
+    }
+
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const ApiObjectBase* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s) {
+        if (value == nullptr) {
+            s->Append("[null]");
+            return {true};
+        }
+        s->Append("[");
+        if (value->IsError()) {
+            s->Append("Invalid ");
+        }
+        s->Append(ObjectTypeAsString(value->GetType()));
+        const std::string& label = value->GetLabel();
+        if (!label.empty()) {
+            s->Append(absl::StrFormat(" \"%s\"", label));
+        }
+        s->Append("]");
+        return {true};
+    }
+
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const TextureViewBase* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s) {
+        if (value == nullptr) {
+            s->Append("[null]");
+            return {true};
+        }
+        s->Append("[");
+        if (value->IsError()) {
+            s->Append("Invalid ");
+        }
+        s->Append(ObjectTypeAsString(value->GetType()));
+        const std::string& label = value->GetLabel();
+        if (!label.empty()) {
+            s->Append(absl::StrFormat(" \"%s\"", label));
+        }
+        const std::string& textureLabel = value->GetTexture()->GetLabel();
+        if (!textureLabel.empty()) {
+            s->Append(absl::StrFormat(" of Texture \"%s\"", textureLabel));
+        }
+        s->Append("]");
+        return {true};
+    }
+
+}  // namespace dawn_native
diff --git a/src/dawn_native/webgpu_absl_format.h b/src/dawn_native/webgpu_absl_format.h
new file mode 100644
index 0000000..340e106
--- /dev/null
+++ b/src/dawn_native/webgpu_absl_format.h
@@ -0,0 +1,72 @@
+// Copyright 2021 The Dawn Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef DAWNNATIVE_WEBGPUABSLFORMAT_H_
+#define DAWNNATIVE_WEBGPUABSLFORMAT_H_
+
+#include "absl/strings/str_format.h"
+#include "dawn_native/dawn_platform.h"
+#include "dawn_native/webgpu_absl_format_autogen.h"
+
+namespace dawn_native {
+
+    //
+    // Structs
+    //
+
+    struct Color;
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const Color* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s);
+
+    struct Extent3D;
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const Extent3D* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s);
+
+    struct Origin3D;
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const Origin3D* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s);
+
+    //
+    // Objects
+    //
+
+    class DeviceBase;
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const DeviceBase* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s);
+
+    class ApiObjectBase;
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const ApiObjectBase* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s);
+
+    // Special case for TextureViews, since frequently the texture will be the
+    // thing that's labeled.
+    class TextureViewBase;
+    absl::FormatConvertResult<absl::FormatConversionCharSet::kString>
+    AbslFormatConvert(const TextureViewBase* value,
+                      const absl::FormatConversionSpec& spec,
+                      absl::FormatSink* s);
+
+}  // namespace dawn_native
+
+#endif  // DAWNNATIVE_WEBGPUABSLFORMAT_H_
