spirv-writer: Add SampledCubeArray cap when needed

Fixed: tint:371
Change-Id: I13f568725370f446f154af26c326edfd4abec3c8
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34003
Auto-Submit: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 2681e9a..f87eb8f 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -2479,7 +2479,7 @@
 bool Builder::GenerateTextureType(ast::type::TextureType* texture,
                                   const Operand& result) {
   uint32_t array_literal = 0u;
-  auto dim = texture->dim();
+  const auto dim = texture->dim();
   if (dim == ast::type::TextureDimension::k1dArray ||
       dim == ast::type::TextureDimension::k2dArray ||
       dim == ast::type::TextureDimension::kCubeArray) {
@@ -2520,6 +2520,12 @@
     sampled_literal = 1u;
   }
 
+  if (dim == ast::type::TextureDimension::kCubeArray) {
+    if (texture->IsSampled() || texture->IsDepth()) {
+      push_capability(SpvCapabilitySampledCubeArray);
+    }
+  }
+
   uint32_t type_id = 0u;
   if (texture->IsDepth()) {
     ast::type::F32Type f32;
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index d7403ba..f72120d 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -665,6 +665,7 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 Cube 1 0 0 1 Unknown
 )");
+  EXPECT_EQ(DumpInstructions(b.capabilities()), "");
 }
 
 TEST_F(BuilderTest_Type, DepthTexture_Generate_CubeArray) {
@@ -678,6 +679,9 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 Cube 1 1 0 1 Unknown
 )");
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability SampledCubeArray
+)");
 }
 
 TEST_F(BuilderTest_Type, MultisampledTexture_Generate_2d_i32) {
@@ -825,6 +829,7 @@
             R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 Cube 0 0 0 1 Unknown
 )");
+  EXPECT_EQ(DumpInstructions(b.capabilities()), "");
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_CubeArray) {
@@ -838,6 +843,9 @@
             R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 Cube 0 1 0 1 Unknown
 )");
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability SampledCubeArray
+)");
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_GenerateReadonly_1d_R16Float) {