[hlsl]: Add DirectVariableAccess to HLSL IR backend.

This CL adds the DirectVariableAccess transform into the HLSL IR
backend. This is needed for the DecomposeMemoryAccess transform in order
to cleanup the callsites using pointers.

Bug: 349867642
Change-Id: I33a77eef325db5c1acd15a14b1a111896a5b55fd
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/196594
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/hlsl/writer/access_test.cc b/src/tint/lang/hlsl/writer/access_test.cc
index 63a5822..2b1d895 100644
--- a/src/tint/lang/hlsl/writer/access_test.cc
+++ b/src/tint/lang/hlsl/writer/access_test.cc
@@ -323,5 +323,53 @@
 )");
 }
 
+TEST_F(HlslWriterTest, AccessDirectVariable) {
+    auto* var1 = b.Var<uniform, vec4<f32>, core::Access::kRead>("v1");
+    var1->SetBindingPoint(0, 0);
+    b.ir.root_block->Append(var1);
+
+    auto* var2 = b.Var<uniform, vec4<f32>, core::Access::kRead>("v2");
+    var2->SetBindingPoint(0, 1);
+    b.ir.root_block->Append(var2);
+
+    auto* p = b.FunctionParam("x", ty.ptr<uniform, vec4<f32>, core::Access::kRead>());
+    auto* bar = b.Function("bar", ty.void_());
+    bar->SetParams({p});
+    b.Append(bar->Block(), [&] {
+        b.Let("a", b.LoadVectorElement(p, 1_u));
+        b.Return(bar);
+    });
+
+    auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kFragment);
+    b.Append(func->Block(), [&] {
+        b.Call(bar, var1);
+        b.Call(bar, var2);
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_.hlsl;
+    EXPECT_EQ(output_.hlsl, R"(
+cbuffer cbuffer_v1 : register(b0) {
+  uint4 v1[1];
+};
+cbuffer cbuffer_v2 : register(b1) {
+  uint4 v2[1];
+};
+void bar() {
+  float a = v1[1u];
+}
+
+void bar_1() {
+  float a = v2[1u];
+}
+
+void foo() {
+  bar();
+  bar_1();
+}
+
+)");
+}
+
 }  // namespace
 }  // namespace tint::hlsl::writer
diff --git a/src/tint/lang/hlsl/writer/printer/printer.cc b/src/tint/lang/hlsl/writer/printer/printer.cc
index f4adafc..116a7a1 100644
--- a/src/tint/lang/hlsl/writer/printer/printer.cc
+++ b/src/tint/lang/hlsl/writer/printer/printer.cc
@@ -171,7 +171,6 @@
         StringStream ss;
         ss << preamble_buffer_.String() << "\n" << main_buffer_.String();
         result_.hlsl = ss.str();
-
         return std::move(result_);
     }
 
diff --git a/src/tint/lang/hlsl/writer/raise/raise.cc b/src/tint/lang/hlsl/writer/raise/raise.cc
index d745f8d..e5f7b80 100644
--- a/src/tint/lang/hlsl/writer/raise/raise.cc
+++ b/src/tint/lang/hlsl/writer/raise/raise.cc
@@ -36,6 +36,7 @@
 #include "src/tint/lang/core/ir/transform/builtin_polyfill.h"
 #include "src/tint/lang/core/ir/transform/conversion_polyfill.h"
 #include "src/tint/lang/core/ir/transform/demote_to_helper.h"
+#include "src/tint/lang/core/ir/transform/direct_variable_access.h"
 #include "src/tint/lang/core/ir/transform/multiplanar_external_texture.h"
 #include "src/tint/lang/core/ir/transform/remove_terminator_args.h"
 #include "src/tint/lang/core/ir/transform/rename_conflicts.h"
@@ -59,7 +60,7 @@
     do {                                 \
         auto result = name(__VA_ARGS__); \
         if (result != Success) {         \
-            return result;               \
+            return result.Failure();     \
         }                                \
     } while (false)
 
@@ -76,7 +77,7 @@
                          array_length_from_uniform_options.ubo_binding.binding},
             array_length_from_uniform_options.bindpoint_to_size_index);
         if (result != Success) {
-            return Failure();
+            return result.Failure();
         }
     }
 
@@ -132,6 +133,8 @@
 
     RUN_TRANSFORM(core::ir::transform::AddEmptyEntryPoint, module);
 
+    RUN_TRANSFORM(core::ir::transform::DirectVariableAccess, module,
+                  core::ir::transform::DirectVariableAccessOptions{});
     RUN_TRANSFORM(raise::DecomposeMemoryAccess, module);
 
     if (options.compiler == Options::Compiler::kFXC) {