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