[hlsl] Emit `subgroupBallot` in HLSL IR

This CL adds support for the `subgroupBallot` intrinsic to the HLSL IR
backend.

Bug: 42251045
Change-Id: I27421f72dae65e3a62475e1dd4360fd0b9b75339
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/199174
Reviewed-by: James Price <jrprice@google.com>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
diff --git a/src/tint/lang/hlsl/writer/builtin_test.cc b/src/tint/lang/hlsl/writer/builtin_test.cc
index abc1a5a..ffbec7f 100644
--- a/src/tint/lang/hlsl/writer/builtin_test.cc
+++ b/src/tint/lang/hlsl/writer/builtin_test.cc
@@ -1962,5 +1962,24 @@
 )");
 }
 
+TEST_F(HlslWriterTest, BuiltinSubgroupBallot) {
+    auto* func = b.Function("foo", ty.void_(), core::ir::Function::PipelineStage::kCompute);
+    func->SetWorkgroupSize(1, 1, 1);
+
+    b.Append(func->Block(), [&] {
+        b.Let("x", b.Call(ty.vec4<u32>(), core::BuiltinFn::kSubgroupBallot, true));
+        b.Return(func);
+    });
+
+    ASSERT_TRUE(Generate()) << err_ << output_.hlsl;
+    EXPECT_EQ(output_.hlsl, R"(
+[numthreads(1, 1, 1)]
+void foo() {
+  uint4 x = WaveActiveBallot(true);
+}
+
+)");
+}
+
 }  // 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 d960fb5..b87a021 100644
--- a/src/tint/lang/hlsl/writer/printer/printer.cc
+++ b/src/tint/lang/hlsl/writer/printer/printer.cc
@@ -990,6 +990,9 @@
             case core::BuiltinFn::kReverseBits:  // uint
                 out << "reversebits";
                 break;
+            case core::BuiltinFn::kSubgroupBallot:
+                out << "WaveActiveBallot";
+                break;
             case core::BuiltinFn::kSubgroupBroadcast:
                 out << "WaveReadLaneAt";
                 break;