writer/spirv: Emit Image1D and Sampled1D capabilities when needed

Fixes: tint:363
Change-Id: Ia0f09e3173f54abaf15aa8f772b097835d451bcb
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33920
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 7b74ecb..b2c0a7e 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -2487,6 +2487,12 @@
   if (dim == ast::type::TextureDimension::k1dArray ||
       dim == ast::type::TextureDimension::k1d) {
     dim_literal = SpvDim1D;
+    if (texture->IsSampled()) {
+      push_capability(SpvCapabilitySampled1D);
+    } else {
+      assert(texture->IsStorage());
+      push_capability(SpvCapabilityImage1D);
+    }
   }
   if (dim == ast::type::TextureDimension::k3d) {
     dim_literal = SpvDim3D;
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index 99e94eb..d7403ba 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -725,6 +725,10 @@
             R"(%2 = OpTypeInt 32 1
 %1 = OpTypeImage %2 1D 0 0 0 1 Unknown
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Sampled1D
+)");
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_u32) {
@@ -737,6 +741,10 @@
             R"(%2 = OpTypeInt 32 0
 %1 = OpTypeImage %2 1D 0 0 0 1 Unknown
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Sampled1D
+)");
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1d_f32) {
@@ -749,6 +757,10 @@
             R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 1D 0 0 0 1 Unknown
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Sampled1D
+)");
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_1dArray) {
@@ -761,6 +773,10 @@
             R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 1D 0 1 0 1 Unknown
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Sampled1D
+)");
 }
 
 TEST_F(BuilderTest_Type, SampledTexture_Generate_2d) {
@@ -835,6 +851,11 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 1D 0 0 0 2 R16f
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Image1D
+OpCapability StorageImageExtendedFormats
+)");
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_GenerateReadonly_1d_R8SNorm) {
@@ -848,6 +869,11 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 1D 0 0 0 2 R8Snorm
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Image1D
+OpCapability StorageImageExtendedFormats
+)");
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_GenerateReadonly_1d_R8UNorm) {
@@ -861,6 +887,11 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 1D 0 0 0 2 R8
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Image1D
+OpCapability StorageImageExtendedFormats
+)");
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_GenerateReadonly_1d_R8Uint) {
@@ -900,6 +931,11 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeFloat 32
 %1 = OpTypeImage %2 1D 0 1 0 2 R16f
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Image1D
+OpCapability StorageImageExtendedFormats
+)");
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_GenerateReadonly_2d) {
@@ -952,6 +988,11 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeVoid
 %1 = OpTypeImage %2 1D 0 0 0 2 R16f
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Image1D
+OpCapability StorageImageExtendedFormats
+)");
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_GenerateWriteonly_1dArray) {
@@ -965,6 +1006,11 @@
   EXPECT_EQ(DumpInstructions(b.types()), R"(%2 = OpTypeVoid
 %1 = OpTypeImage %2 1D 0 1 0 2 R16f
 )");
+
+  EXPECT_EQ(DumpInstructions(b.capabilities()),
+            R"(OpCapability Image1D
+OpCapability StorageImageExtendedFormats
+)");
 }
 
 TEST_F(BuilderTest_Type, StorageTexture_GenerateWriteonly_2d) {