Capture: support texture swizzle.

Bug: 473827155
Change-Id: I6a6a69645662b9ac605e0b2e6cea5dd81ada3cb2
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/284999
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Gregg Tavares <gman@chromium.org>
diff --git a/src/dawn/native/webgpu/TextureWGPU.cpp b/src/dawn/native/webgpu/TextureWGPU.cpp
index acf0d84..6610e5d 100644
--- a/src/dawn/native/webgpu/TextureWGPU.cpp
+++ b/src/dawn/native/webgpu/TextureWGPU.cpp
@@ -310,6 +310,12 @@
         .arrayLayerCount = GetLayerCount(),
         .aspect = ToDawn(GetAspects()),
         .usage = GetUsage(),
+        .swizzle = {{
+            .r = GetSwizzle().r,
+            .g = GetSwizzle().g,
+            .b = GetSwizzle().b,
+            .a = GetSwizzle().a,
+        }},
     }};
     Serialize(captureContext, tex);
     return {};
diff --git a/src/dawn/replay/Replay.cpp b/src/dawn/replay/Replay.cpp
index 095d728..f5252c5 100644
--- a/src/dawn/replay/Replay.cpp
+++ b/src/dawn/replay/Replay.cpp
@@ -92,6 +92,17 @@
 
 namespace {
 
+bool IsSwizzleIdentity(const wgpu::TextureComponentSwizzle& swizzle) {
+    return (swizzle.r == wgpu::ComponentSwizzle::R ||
+            swizzle.r == wgpu::ComponentSwizzle::Undefined) &&
+           (swizzle.g == wgpu::ComponentSwizzle::G ||
+            swizzle.g == wgpu::ComponentSwizzle::Undefined) &&
+           (swizzle.b == wgpu::ComponentSwizzle::B ||
+            swizzle.b == wgpu::ComponentSwizzle::Undefined) &&
+           (swizzle.a == wgpu::ComponentSwizzle::A ||
+            swizzle.a == wgpu::ComponentSwizzle::Undefined);
+}
+
 wgpu::Origin3D ToWGPU(const schema::Origin3D& origin) {
     return wgpu::Origin3D{
         .x = origin.x,
@@ -842,6 +853,16 @@
         .aspect = view.aspect,
         .usage = view.usage,
     };
+
+    wgpu::TextureComponentSwizzleDescriptor swizzleDesc = {};
+    swizzleDesc.swizzle.r = view.swizzle.r;
+    swizzleDesc.swizzle.g = view.swizzle.g;
+    swizzleDesc.swizzle.b = view.swizzle.b;
+    swizzleDesc.swizzle.a = view.swizzle.a;
+    if (!IsSwizzleIdentity(swizzleDesc.swizzle)) {
+        desc.nextInChain = &swizzleDesc;
+    }
+
     wgpu::Texture texture = replay.GetObjectById<wgpu::Texture>(view.textureId);
     wgpu::TextureView textureView = texture.CreateView(&desc);
     return {textureView};
diff --git a/src/dawn/serialization/Schema.h b/src/dawn/serialization/Schema.h
index 13f21ea..15ae9d8 100644
--- a/src/dawn/serialization/Schema.h
+++ b/src/dawn/serialization/Schema.h
@@ -148,6 +148,14 @@
 
 DAWN_REPLAY_SERIALIZABLE(struct, Color, COLOR_MEMBER){};
 
+#define TEXTURE_COMPONENT_SWIZZLE_MEMBER(X) \
+    X(wgpu::ComponentSwizzle, r)            \
+    X(wgpu::ComponentSwizzle, g)            \
+    X(wgpu::ComponentSwizzle, b)            \
+    X(wgpu::ComponentSwizzle, a)
+
+DAWN_REPLAY_SERIALIZABLE(struct, TextureComponentSwizzle, TEXTURE_COMPONENT_SWIZZLE_MEMBER){};
+
 #define PIPELINE_CONSTANT_MEMBER(X) \
     X(std::string, name)            \
     X(double, value)
@@ -337,7 +345,8 @@
     X(uint32_t, baseArrayLayer)              \
     X(uint32_t, arrayLayerCount)             \
     X(wgpu::TextureAspect, aspect)           \
-    X(wgpu::TextureUsage, usage)
+    X(wgpu::TextureUsage, usage)             \
+    X(TextureComponentSwizzle, swizzle)
 
 DAWN_REPLAY_SERIALIZABLE(struct, TextureView, TEXTURE_VIEW_CREATION_MEMBER){};