Add layout(direct3d) flag.
The Ganesh Direct3D backend will use this to tell the SPIR-V
reader that it needs separate textures and samplers.
Functionally this behaves the same as the `webgpu` qualifier,
but using a dedicated qualifier gives us the option to add
other uses for `webgpu` without affecting the behavior of the
Direct3D backend.
Change-Id: I20d7a83c3622abfe60a317045b4ed2d1d2f357ac
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/749839
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/resources/sksl/errors/LayoutInFunctions.sksl b/resources/sksl/errors/LayoutInFunctions.sksl
index 76af39e..0e75922 100644
--- a/resources/sksl/errors/LayoutInFunctions.sksl
+++ b/resources/sksl/errors/LayoutInFunctions.sksl
@@ -13,6 +13,7 @@
vulkan,
metal,
webgpu,
+ direct3d,
rgba8,
rgba32f,
r32f)
@@ -34,6 +35,7 @@
vulkan,
metal,
webgpu,
+ direct3d,
rgba8,
rgba32f,
r32f) float x) {}
@@ -55,6 +57,7 @@
layout qualifier 'vulkan' is not permitted here
layout qualifier 'metal' is not permitted here
layout qualifier 'webgpu' is not permitted here
+layout qualifier 'direct3d' is not permitted here
layout qualifier 'rgba8' is not permitted here
layout qualifier 'rgba32f' is not permitted here
layout qualifier 'r32f' is not permitted here
@@ -74,6 +77,7 @@
layout qualifier 'vulkan' is not permitted here
layout qualifier 'metal' is not permitted here
layout qualifier 'webgpu' is not permitted here
+layout qualifier 'direct3d' is not permitted here
layout qualifier 'rgba8' is not permitted here
layout qualifier 'rgba32f' is not permitted here
layout qualifier 'r32f' is not permitted here
diff --git a/resources/sksl/errors/LayoutRepeatedQualifiers.sksl b/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
index f255980..8ce2c86 100644
--- a/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
+++ b/resources/sksl/errors/LayoutRepeatedQualifiers.sksl
@@ -13,6 +13,7 @@
vulkan,
metal,
webgpu,
+ direct3d,
rgba8,
rgba32f,
r32f,
@@ -31,6 +32,7 @@
vulkan,
metal,
webgpu,
+ direct3d,
rgba8,
rgba32f,
r32f
@@ -51,6 +53,7 @@
layout qualifier 'vulkan' appears more than once
layout qualifier 'metal' appears more than once
layout qualifier 'webgpu' appears more than once
+layout qualifier 'direct3d' appears more than once
layout qualifier 'rgba8' appears more than once
layout qualifier 'rgba32f' appears more than once
layout qualifier 'r32f' appears more than once
diff --git a/resources/sksl/errors/MultipleBackendFlags.sksl b/resources/sksl/errors/MultipleBackendFlags.sksl
index 4b9359d..7ed22b4 100644
--- a/resources/sksl/errors/MultipleBackendFlags.sksl
+++ b/resources/sksl/errors/MultipleBackendFlags.sksl
@@ -1,5 +1,5 @@
-layout(metal, vulkan, webgpu, binding = 0) uniform ubo { float f; }; // multiple backends
-layout(texture=0, sampler=0) sampler2D s; // invalid (requires backend)
+layout(metal, vulkan, webgpu, direct3d, binding = 0) uniform ubo { float f; }; // multiple backends
+layout(texture=0, sampler=0) sampler2D s; // missing backend
/*%%*
only one backend qualifier can be used
diff --git a/resources/sksl/spirv/MixedSamplerTypes.sksl b/resources/sksl/spirv/MixedSamplerTypes.sksl
index 295508d..4ad0246 100644
--- a/resources/sksl/spirv/MixedSamplerTypes.sksl
+++ b/resources/sksl/spirv/MixedSamplerTypes.sksl
@@ -1,7 +1,9 @@
-layout(webgpu, set=1, texture=2, sampler=3) sampler2D wgpuSampler;
-layout(vulkan, set=1, binding=4) sampler2D vkSampler;
+layout(webgpu, set=1, texture=2, sampler=3) sampler2D wgpuSampler;
+layout(direct3d, set=1, texture=4, sampler=5) sampler2D d3dSampler;
+layout(vulkan, set=1, binding=6) sampler2D vkSampler;
void main() {
sk_FragColor = sample(wgpuSampler, float2(0));
+ sk_FragColor = sample(d3dSampler, float2(0));
sk_FragColor = sample(vkSampler, float2(0));
}
diff --git a/resources/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.sksl b/resources/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.sksl
index bf9a456..2690860 100644
--- a/resources/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.sksl
+++ b/resources/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.sksl
@@ -5,5 +5,5 @@
}
/*%%*
-SPIR-V dawn compatibility mode requires an explicit texture and sampler index
+selected backend requires separate texture and sampler indices
*%%*/
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 393bac3..0bb7a67 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -1076,6 +1076,7 @@
{"vulkan", SkSL::LayoutFlag::kVulkan},
{"metal", SkSL::LayoutFlag::kMetal},
{"webgpu", SkSL::LayoutFlag::kWebGPU},
+ {"direct3d", SkSL::LayoutFlag::kDirect3D},
{"rgba8", SkSL::LayoutFlag::kRGBA8},
{"rgba32f", SkSL::LayoutFlag::kRGBA32F},
{"r32f", SkSL::LayoutFlag::kR32F},
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
index aee9c6e..c8b90db 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.cpp
@@ -3870,7 +3870,8 @@
const VarDeclaration& varDecl) {
const Variable* var = varDecl.var();
const LayoutFlags backendFlags = var->layout().fFlags & LayoutFlag::kAllBackends;
- const LayoutFlags kPermittedBackendFlags = LayoutFlag::kVulkan | LayoutFlag::kWebGPU;
+ const LayoutFlags kPermittedBackendFlags =
+ LayoutFlag::kVulkan | LayoutFlag::kWebGPU | LayoutFlag::kDirect3D;
if (backendFlags & ~kPermittedBackendFlags) {
fContext.fErrors->error(var->fPosition, "incompatible backend flag in SPIR-V codegen");
return false;
@@ -3896,8 +3897,8 @@
if (fUseTextureSamplerPairs && var->type().isSampler()) {
if (var->layout().fTexture == -1 || var->layout().fSampler == -1) {
- fContext.fErrors->error(var->fPosition, "WebGPU samplers require explicit texture and "
- "sampler indices");
+ fContext.fErrors->error(var->fPosition, "selected backend requires separate texture "
+ "and sampler indices");
return false;
}
SkASSERT(storageClass == SpvStorageClassUniformConstant);
@@ -4488,8 +4489,8 @@
// Do an initial pass over the program elements to establish some baseline info.
const FunctionDeclaration* main = nullptr;
int localSizeX = 1, localSizeY = 1, localSizeZ = 1;
- Position vulkanSamplerPos;
- Position webGPUSamplerPos;
+ Position combinedSamplerPos;
+ Position separateSamplerPos;
for (const ProgramElement* e : program.elements()) {
switch (e->kind()) {
case ProgramElement::Kind::kFunction: {
@@ -4510,10 +4511,10 @@
const Variable& var = *decl.varDeclaration().var();
if (var.type().isSampler()) {
if (var.layout().fFlags & LayoutFlag::kVulkan) {
- vulkanSamplerPos = decl.position();
+ combinedSamplerPos = decl.position();
}
- if (var.layout().fFlags & LayoutFlag::kWebGPU) {
- webGPUSamplerPos = decl.position();
+ if (var.layout().fFlags & (LayoutFlag::kWebGPU | LayoutFlag::kDirect3D)) {
+ separateSamplerPos = decl.position();
}
}
break;
@@ -4546,13 +4547,13 @@
return;
}
// Make sure our program's sampler usage is consistent.
- if (vulkanSamplerPos.valid() && webGPUSamplerPos.valid()) {
+ if (combinedSamplerPos.valid() && separateSamplerPos.valid()) {
fContext.fErrors->error(Position(), "programs cannot contain a mixture of sampler types");
- fContext.fErrors->error(vulkanSamplerPos, "Vulkan sampler found here:");
- fContext.fErrors->error(webGPUSamplerPos, "WebGPU sampler found here:");
+ fContext.fErrors->error(combinedSamplerPos, "combined sampler found here:");
+ fContext.fErrors->error(separateSamplerPos, "separate sampler found here:");
return;
}
- fUseTextureSamplerPairs = webGPUSamplerPos.valid();
+ fUseTextureSamplerPairs = separateSamplerPos.valid();
// Emit interface blocks.
std::set<SpvId> interfaceVars;
diff --git a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
index a68bfb8..69301b1 100644
--- a/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
+++ b/src/sksl/codegen/SkSLSPIRVCodeGenerator.h
@@ -561,8 +561,7 @@
StringStream fDecorationBuffer;
// Mapping from combined sampler declarations to synthesized texture/sampler variables.
- // This is used when the sampler is declared as `layout(webgpu)`.
- // TODO(skia:14023): Remove when WebGPU backend is fully transitioned to WGSL codegen.
+ // This is used when the sampler is declared as `layout(webgpu)` or `layout(direct3d)`.
bool fUseTextureSamplerPairs = false;
struct SynthesizedTextureSamplerPair {
// The names of the synthesized variables. The Variable objects themselves store string
diff --git a/src/sksl/ir/SkSLLayout.cpp b/src/sksl/ir/SkSLLayout.cpp
index a74bff6..a1b9c1d 100644
--- a/src/sksl/ir/SkSLLayout.cpp
+++ b/src/sksl/ir/SkSLLayout.cpp
@@ -28,6 +28,9 @@
if (fFlags & LayoutFlag::kWebGPU) {
result += separator() + "webgpu";
}
+ if (fFlags & LayoutFlag::kDirect3D) {
+ result += separator() + "direct3d";
+ }
if (fFlags & LayoutFlag::kRGBA8) {
result += separator() + "rgba8";
}
@@ -119,6 +122,7 @@
{ LayoutFlag::kVulkan, "vulkan"},
{ LayoutFlag::kMetal, "metal"},
{ LayoutFlag::kWebGPU, "webgpu"},
+ { LayoutFlag::kDirect3D, "direct3d"},
{ LayoutFlag::kRGBA8, "rgba8"},
{ LayoutFlag::kRGBA32F, "rgba32f"},
{ LayoutFlag::kR32F, "r32f"},
@@ -147,8 +151,9 @@
context.fErrors->error(pos, "'binding' modifier cannot coexist with 'texture'/'sampler'");
success = false;
}
- // The `texture` and `sampler` flags are only allowed when explicitly targeting Metal or WebGPU.
- if (!(layoutFlags & (LayoutFlag::kMetal | LayoutFlag::kWebGPU))) {
+ // The `texture` and `sampler` flags are only allowed when explicitly targeting Metal, WebGPU or
+ // Direct3D.
+ if (!(layoutFlags & (LayoutFlag::kMetal | LayoutFlag::kWebGPU | LayoutFlag::kDirect3D))) {
permittedLayoutFlags &= ~LayoutFlag::kTexture;
permittedLayoutFlags &= ~LayoutFlag::kSampler;
}
diff --git a/src/sksl/ir/SkSLLayout.h b/src/sksl/ir/SkSLLayout.h
index aac738d..3263f9e 100644
--- a/src/sksl/ir/SkSLLayout.h
+++ b/src/sksl/ir/SkSLLayout.h
@@ -41,21 +41,22 @@
kVulkan = 1 << 13,
kMetal = 1 << 14,
kWebGPU = 1 << 15,
+ kDirect3D = 1 << 16,
- kAllBackends = kVulkan | kMetal | kWebGPU,
+ kAllBackends = kVulkan | kMetal | kWebGPU | kDirect3D,
// These flags indicate the pixel format; only one at most can be set.
// (https://www.khronos.org/opengl/wiki/Layout_Qualifier_(GLSL)#Image_formats)
- kRGBA8 = 1 << 16,
- kRGBA32F = 1 << 17,
- kR32F = 1 << 18,
+ kRGBA8 = 1 << 17,
+ kRGBA32F = 1 << 18,
+ kR32F = 1 << 19,
kAllPixelFormats = kRGBA8 | kRGBA32F | kR32F,
// The local invocation size of a compute program.
- kLocalSizeX = 1 << 19,
- kLocalSizeY = 1 << 20,
- kLocalSizeZ = 1 << 21,
+ kLocalSizeX = 1 << 20,
+ kLocalSizeY = 1 << 21,
+ kLocalSizeZ = 1 << 22,
};
} // namespace SkSL
diff --git a/src/sksl/ir/SkSLVarDeclarations.cpp b/src/sksl/ir/SkSLVarDeclarations.cpp
index d546512..0b62a6f 100644
--- a/src/sksl/ir/SkSLVarDeclarations.cpp
+++ b/src/sksl/ir/SkSLVarDeclarations.cpp
@@ -303,9 +303,7 @@
!permitBindingAndSet)) {
permittedLayoutFlags &= ~LayoutFlag::kBinding;
permittedLayoutFlags &= ~LayoutFlag::kSet;
- permittedLayoutFlags &= ~LayoutFlag::kVulkan;
- permittedLayoutFlags &= ~LayoutFlag::kMetal;
- permittedLayoutFlags &= ~LayoutFlag::kWebGPU;
+ permittedLayoutFlags &= ~LayoutFlag::kAllBackends;
}
if (ProgramConfig::IsRuntimeEffect(context.fConfig->fKind)) {
// Disallow all layout flags except 'color' in runtime effects
diff --git a/tests/sksl/errors/LayoutInFunctions.glsl b/tests/sksl/errors/LayoutInFunctions.glsl
index e14231a..9072722 100644
--- a/tests/sksl/errors/LayoutInFunctions.glsl
+++ b/tests/sksl/errors/LayoutInFunctions.glsl
@@ -48,6 +48,9 @@
error: 1: layout qualifier 'webgpu' is not permitted here
layout (
^^^^^^^^...
+error: 1: layout qualifier 'direct3d' is not permitted here
+layout (
+^^^^^^^^...
error: 1: layout qualifier 'rgba8' is not permitted here
layout (
^^^^^^^^...
@@ -57,61 +60,64 @@
error: 1: layout qualifier 'r32f' is not permitted here
layout (
^^^^^^^^...
-error: 22: only one backend qualifier can be used
+error: 23: only one backend qualifier can be used
layout (
^^^^^^^^...
-error: 22: only one pixel format qualifier can be used
+error: 23: only one pixel format qualifier can be used
layout (
^^^^^^^^...
-error: 22: layout qualifier 'origin_upper_left' is not permitted here
+error: 23: layout qualifier 'origin_upper_left' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'push_constant' is not permitted here
+error: 23: layout qualifier 'push_constant' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'blend_support_all_equations' is not permitted here
+error: 23: layout qualifier 'blend_support_all_equations' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'color' is not permitted here
+error: 23: layout qualifier 'color' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'location' is not permitted here
+error: 23: layout qualifier 'location' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'offset' is not permitted here
+error: 23: layout qualifier 'offset' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'binding' is not permitted here
+error: 23: layout qualifier 'binding' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'index' is not permitted here
+error: 23: layout qualifier 'index' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'set' is not permitted here
+error: 23: layout qualifier 'set' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'builtin' is not permitted here
+error: 23: layout qualifier 'builtin' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'input_attachment_index' is not permitted here
+error: 23: layout qualifier 'input_attachment_index' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'vulkan' is not permitted here
+error: 23: layout qualifier 'vulkan' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'metal' is not permitted here
+error: 23: layout qualifier 'metal' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'webgpu' is not permitted here
+error: 23: layout qualifier 'webgpu' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'rgba8' is not permitted here
+error: 23: layout qualifier 'direct3d' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'rgba32f' is not permitted here
+error: 23: layout qualifier 'rgba8' is not permitted here
layout (
^^^^^^^^...
-error: 22: layout qualifier 'r32f' is not permitted here
+error: 23: layout qualifier 'rgba32f' is not permitted here
layout (
^^^^^^^^...
-38 errors
+error: 23: layout qualifier 'r32f' is not permitted here
+layout (
+^^^^^^^^...
+40 errors
diff --git a/tests/sksl/errors/LayoutRepeatedQualifiers.glsl b/tests/sksl/errors/LayoutRepeatedQualifiers.glsl
index 847f1ad..05f6936 100644
--- a/tests/sksl/errors/LayoutRepeatedQualifiers.glsl
+++ b/tests/sksl/errors/LayoutRepeatedQualifiers.glsl
@@ -1,54 +1,57 @@
### Compilation failed:
-error: 20: layout qualifier 'origin_upper_left' appears more than once
+error: 21: layout qualifier 'origin_upper_left' appears more than once
origin_upper_left,
^^^^^^^^^^^^^^^^^
-error: 21: layout qualifier 'push_constant' appears more than once
+error: 22: layout qualifier 'push_constant' appears more than once
push_constant,
^^^^^^^^^^^^^
-error: 22: layout qualifier 'blend_support_all_equations' appears more than once
+error: 23: layout qualifier 'blend_support_all_equations' appears more than once
blend_support_all_equations,
^^^^^^^^^^^^^^^^^^^^^^^^^^^
-error: 23: layout qualifier 'color' appears more than once
+error: 24: layout qualifier 'color' appears more than once
color,
^^^^^
-error: 24: layout qualifier 'location' appears more than once
+error: 25: layout qualifier 'location' appears more than once
location = 2,
^^^^^^^^
-error: 25: layout qualifier 'offset' appears more than once
+error: 26: layout qualifier 'offset' appears more than once
offset = 2,
^^^^^^
-error: 26: layout qualifier 'binding' appears more than once
+error: 27: layout qualifier 'binding' appears more than once
binding = 2,
^^^^^^^
-error: 27: layout qualifier 'index' appears more than once
+error: 28: layout qualifier 'index' appears more than once
index = 2,
^^^^^
-error: 28: layout qualifier 'set' appears more than once
+error: 29: layout qualifier 'set' appears more than once
set = 2,
^^^
-error: 29: layout qualifier 'builtin' appears more than once
+error: 30: layout qualifier 'builtin' appears more than once
builtin = 2,
^^^^^^^
-error: 30: layout qualifier 'input_attachment_index' appears more than once
+error: 31: layout qualifier 'input_attachment_index' appears more than once
input_attachment_index = 2,
^^^^^^^^^^^^^^^^^^^^^^
-error: 31: layout qualifier 'vulkan' appears more than once
+error: 32: layout qualifier 'vulkan' appears more than once
vulkan,
^^^^^^
-error: 32: layout qualifier 'metal' appears more than once
+error: 33: layout qualifier 'metal' appears more than once
metal,
^^^^^
-error: 33: layout qualifier 'webgpu' appears more than once
+error: 34: layout qualifier 'webgpu' appears more than once
webgpu,
^^^^^^
-error: 34: layout qualifier 'rgba8' appears more than once
+error: 35: layout qualifier 'direct3d' appears more than once
+ direct3d,
+ ^^^^^^^^
+error: 36: layout qualifier 'rgba8' appears more than once
rgba8,
^^^^^
-error: 35: layout qualifier 'rgba32f' appears more than once
+error: 37: layout qualifier 'rgba32f' appears more than once
rgba32f,
^^^^^^^
-error: 36: layout qualifier 'r32f' appears more than once
+error: 38: layout qualifier 'r32f' appears more than once
r32f
^^^^
error: 1: 'layout(color)' is only permitted in runtime effects
@@ -72,4 +75,4 @@
error: 1: layout qualifier 'set' is not permitted here
layout (
^^^^^^^^...
-24 errors
+25 errors
diff --git a/tests/sksl/errors/MultipleBackendFlags.glsl b/tests/sksl/errors/MultipleBackendFlags.glsl
index c3e7967..a2da880 100644
--- a/tests/sksl/errors/MultipleBackendFlags.glsl
+++ b/tests/sksl/errors/MultipleBackendFlags.glsl
@@ -1,12 +1,12 @@
### Compilation failed:
error: 1: only one backend qualifier can be used
-layout(metal, vulkan, webgpu, binding = 0) uniform ubo { float f; }; // multiple backends
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+layout(metal, vulkan, webgpu, direct3d, binding = 0) uniform ubo { float f; }; // multiple backends
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: 2: layout qualifier 'texture' is not permitted here
-layout(texture=0, sampler=0) sampler2D s; // invalid (requires backend)
+layout(texture=0, sampler=0) sampler2D s; // missing backend
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: 2: layout qualifier 'sampler' is not permitted here
-layout(texture=0, sampler=0) sampler2D s; // invalid (requires backend)
+layout(texture=0, sampler=0) sampler2D s; // missing backend
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3 errors
diff --git a/tests/sksl/spirv/MixedSamplerTypes.asm.frag b/tests/sksl/spirv/MixedSamplerTypes.asm.frag
index 96cfcbc..68bc7fe 100644
--- a/tests/sksl/spirv/MixedSamplerTypes.asm.frag
+++ b/tests/sksl/spirv/MixedSamplerTypes.asm.frag
@@ -1,10 +1,10 @@
### Compilation failed:
error: programs cannot contain a mixture of sampler types
-error: 2: Vulkan sampler found here:
-layout(vulkan, set=1, binding=4) sampler2D vkSampler;
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-error: 1: WebGPU sampler found here:
-layout(webgpu, set=1, texture=2, sampler=3) sampler2D wgpuSampler;
+error: 3: combined sampler found here:
+layout(vulkan, set=1, binding=6) sampler2D vkSampler;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+error: 2: separate sampler found here:
+layout(direct3d, set=1, texture=4, sampler=5) sampler2D d3dSampler;
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3 errors
diff --git a/tests/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.asm.frag b/tests/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.asm.frag
index 5d48f08..1316a72 100644
--- a/tests/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.asm.frag
+++ b/tests/sksl/spirv/WrongCombinedSamplerLayoutForWebGPUSampler.asm.frag
@@ -1,6 +1,6 @@
### Compilation failed:
-error: 1: WebGPU samplers require explicit texture and sampler indices
+error: 1: selected backend requires separate texture and sampler indices
layout(webgpu, set=0, binding=0) sampler2D aSampler;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 error