[spirv-writer] Generate sampler type

Change-Id: I587cf7430711d8009becf76f7630091f32ed3490
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/27840
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 8e68e83..193584c 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -1927,6 +1927,8 @@
     if (!GenerateTextureType(type->AsTexture(), result)) {
       return 0;
     }
+  } else if (type->IsSampler()) {
+    push_type(spv::Op::OpTypeSampler, {result});
   } else {
     error_ = "unable to convert type: " + type->type_name();
     return 0;
diff --git a/src/writer/spirv/builder_type_test.cc b/src/writer/spirv/builder_type_test.cc
index 769843f..48a5652 100644
--- a/src/writer/spirv/builder_type_test.cc
+++ b/src/writer/spirv/builder_type_test.cc
@@ -28,6 +28,7 @@
 #include "src/ast/type/matrix_type.h"
 #include "src/ast/type/pointer_type.h"
 #include "src/ast/type/sampled_texture_type.h"
+#include "src/ast/type/sampler_type.h"
 #include "src/ast/type/storage_texture_type.h"
 #include "src/ast/type/struct_type.h"
 #include "src/ast/type/texture_type.h"
@@ -1162,6 +1163,30 @@
                                          ast::type::ImageFormat::kR8Snorm,
                                          ast::type::ImageFormat::kR8Unorm));
 
+TEST_F(BuilderTest_Type, Sampler) {
+  ast::type::SamplerType sampler(ast::type::SamplerKind::kSampler);
+
+  ast::Module mod;
+  Builder b(&mod);
+  EXPECT_EQ(b.GenerateTypeIfNeeded(&sampler), 1u);
+  EXPECT_EQ(b.GenerateTypeIfNeeded(&sampler), 1u);
+  ASSERT_FALSE(b.has_error()) << b.error();
+
+  EXPECT_EQ(DumpInstructions(b.types()), "%1 = OpTypeSampler\n");
+}
+
+TEST_F(BuilderTest_Type, ComparisonSampler) {
+  ast::type::SamplerType sampler(ast::type::SamplerKind::kComparisonSampler);
+
+  ast::Module mod;
+  Builder b(&mod);
+  EXPECT_EQ(b.GenerateTypeIfNeeded(&sampler), 1u);
+  EXPECT_EQ(b.GenerateTypeIfNeeded(&sampler), 1u);
+  ASSERT_FALSE(b.has_error()) << b.error();
+
+  EXPECT_EQ(DumpInstructions(b.types()), "%1 = OpTypeSampler\n");
+}
+
 }  // namespace
 }  // namespace spirv
 }  // namespace writer