[spirv-writer] Declare extension when using vulkan memory model

This fixes one validation error

Change-Id: I13ee67483ea211d394b51ed9ea29b6698af0acc5
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/20622
Reviewed-by: dan sinclair <dsinclair@google.com>
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 743a8e2..7efd156 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -128,8 +128,12 @@
 
 bool Builder::Build() {
   push_preamble(spv::Op::OpCapability, {Operand::Int(SpvCapabilityShader)});
+
+  // TODO(dneto): Stop using the Vulkan memory model. crbug.com/tint/63
   push_preamble(spv::Op::OpCapability,
                 {Operand::Int(SpvCapabilityVulkanMemoryModel)});
+  push_preamble(spv::Op::OpExtension,
+                {Operand::String("SPV_KHR_vulkan_memory_model")});
 
   for (const auto& imp : mod_->imports()) {
     GenerateImport(imp.get());
diff --git a/src/writer/spirv/builder_test.cc b/src/writer/spirv/builder_test.cc
index c74fc55..f6f88a5 100644
--- a/src/writer/spirv/builder_test.cc
+++ b/src/writer/spirv/builder_test.cc
@@ -36,10 +36,11 @@
 
   Builder b(&m);
   ASSERT_TRUE(b.Build());
-  ASSERT_EQ(b.preamble().size(), 4u);
+  ASSERT_EQ(b.preamble().size(), 5u);
 
   EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
 OpCapability VulkanMemoryModel
+OpExtension "SPV_KHR_vulkan_memory_model"
 %1 = OpExtInstImport "GLSL.std.450"
 OpMemoryModel Logical Vulkan
 )");
@@ -51,6 +52,7 @@
   ASSERT_TRUE(b.Build());
   EXPECT_EQ(DumpBuilder(b), R"(OpCapability Shader
 OpCapability VulkanMemoryModel
+OpExtension "SPV_KHR_vulkan_memory_model"
 OpMemoryModel Logical Vulkan
 )");
 }