spirv-reader: HLSL-IO: Convert input, output vars to private

Bug: tint:508
Change-Id: I5cd7c1b476112eb489f9e6acc94f7a1cf6e43b6d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/48863
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: David Neto <dneto@google.com>
Auto-Submit: David Neto <dneto@google.com>
Reviewed-by: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/reader/spirv/parser_impl.cc b/src/reader/spirv/parser_impl.cc
index 559136d..dd0e0fa 100644
--- a/src/reader/spirv/parser_impl.cc
+++ b/src/reader/spirv/parser_impl.cc
@@ -1072,6 +1072,16 @@
     ast_storage_class = ast::StorageClass::kStorage;
     remap_buffer_block_type_.insert(type_id);
   }
+
+  if (hlsl_style_pipeline_io_) {
+    // When using HLSL-style pipeline IO, intput and output variables
+    // are mapped to private variables.
+    if (ast_storage_class == ast::StorageClass::kInput ||
+        ast_storage_class == ast::StorageClass::kOutput) {
+      ast_storage_class = ast::StorageClass::kPrivate;
+    }
+  }
+
   return builder_.create<sem::Pointer>(ast_elem_ty, ast_storage_class);
 }
 
diff --git a/src/reader/spirv/parser_impl_module_var_test.cc b/src/reader/spirv/parser_impl_module_var_test.cc
index 714d8dc..9279b2b 100644
--- a/src/reader/spirv/parser_impl_module_var_test.cc
+++ b/src/reader/spirv/parser_impl_module_var_test.cc
@@ -3821,6 +3821,54 @@
   EXPECT_THAT(info_1300[0].outputs, ElementsAre(15));
 }
 
+TEST_F(SpvModuleScopeVarParserTest, InputVarsConvertedToPrivate) {
+  const auto assembly = CommonTypes() + R"(
+     %ptr_in_uint = OpTypePointer Input %uint
+     %1 = OpVariable %ptr_in_uint Input
+  )";
+  auto p = parser(test::Assemble(assembly));
+
+  // TODO(crbug.com/tint/508): Remove this when everything is converted
+  // to HLSL style pipeline IO.
+  p->SetHLSLStylePipelineIO();
+
+  ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
+  EXPECT_TRUE(p->error().empty());
+  const auto got = p->program().to_str();
+  const std::string expected =
+      R"(Variable{
+    x_1
+    private
+    __u32
+  }
+)";
+  EXPECT_THAT(got, HasSubstr(expected)) << got;
+}
+
+TEST_F(SpvModuleScopeVarParserTest, OutputVarsConvertedToPrivate) {
+  const auto assembly = CommonTypes() + R"(
+     %ptr_out_uint = OpTypePointer Output %uint
+     %1 = OpVariable %ptr_out_uint Output
+  )";
+  auto p = parser(test::Assemble(assembly));
+
+  // TODO(crbug.com/tint/508): Remove this when everything is converted
+  // to HLSL style pipeline IO.
+  p->SetHLSLStylePipelineIO();
+
+  ASSERT_TRUE(p->BuildAndParseInternalModuleExceptFunctions());
+  EXPECT_TRUE(p->error().empty());
+  const auto got = p->program().to_str();
+  const std::string expected =
+      R"(Variable{
+    x_1
+    private
+    __u32
+  }
+)";
+  EXPECT_THAT(got, HasSubstr(expected)) << got;
+}
+
 // TODO(dneto): Test passing pointer to SampleMask as function parameter,
 // both input case and output case.