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){};