[hlsl-writer] Add support for subgroupBallot

Generate a call to `WaveActiveBallot` with a `true` predicate.

Bug: tint:2000
Change-Id: I05e8a9fe8a923853bdab60e308ba48dfa32e63ae
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/143836
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: James Price <jrprice@google.com>
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
index 78ac0e1..88fd9c6 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.cc
@@ -340,6 +340,7 @@
                 core::Extension::kChromiumExperimentalDp4A,
                 core::Extension::kChromiumExperimentalFullPtrParameters,
                 core::Extension::kChromiumExperimentalPushConstant,
+                core::Extension::kChromiumExperimentalSubgroups,
                 core::Extension::kF16,
                 core::Extension::kChromiumInternalDualSourceBlending,
             })) {
@@ -1198,6 +1199,9 @@
     if (builtin->IsDP4a()) {
         return EmitDP4aCall(out, expr, builtin);
     }
+    if (builtin->IsSubgroup()) {
+        return EmitSubgroupCall(out, expr, builtin);
+    }
 
     auto name = generate_builtin_name(builtin);
     if (name.empty()) {
@@ -2485,6 +2489,18 @@
     return true;
 }
 
+bool ASTPrinter::EmitSubgroupCall(StringStream& out,
+                                  [[maybe_unused]] const ast::CallExpression* expr,
+                                  const sem::Builtin* builtin) {
+    if (builtin->Type() == core::Function::kSubgroupBallot) {
+        out << "WaveActiveBallot(true)";
+    } else {
+        TINT_UNREACHABLE() << "unexpected subgroup builtin type " << core::str(builtin->Type());
+        return false;
+    }
+    return true;
+}
+
 bool ASTPrinter::EmitTextureCall(StringStream& out,
                                  const sem::Call* call,
                                  const sem::Builtin* builtin) {
diff --git a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
index 8ca7e4f..188223c 100644
--- a/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
+++ b/src/tint/lang/hlsl/writer/ast_printer/ast_printer.h
@@ -282,6 +282,14 @@
     bool EmitDP4aCall(StringStream& out,
                       const ast::CallExpression* expr,
                       const sem::Builtin* builtin);
+    /// Handles generating a call to subgroup builtins.
+    /// @param out the output of the expression stream
+    /// @param expr the call expression
+    /// @param builtin the semantic information for the builtin
+    /// @returns true if the call expression is emitted
+    bool EmitSubgroupCall(StringStream& out,
+                          const ast::CallExpression* expr,
+                          const sem::Builtin* builtin);
     /// Handles a case statement
     /// @param s the switch statement
     /// @param case_idx the index of the switch case in the switch statement
diff --git a/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl
index fe24933..3064f17 100644
--- a/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl
@@ -1,21 +1,12 @@
-SKIP: FAILED
+RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-
-enable chromium_experimental_subgroups;
-
-fn subgroupBallot_7e6d0e() {
-  var res : vec4<u32> = subgroupBallot();
-  prevent_dce = res;
+void subgroupBallot_7e6d0e() {
+  uint4 res = WaveActiveBallot(true);
+  prevent_dce.Store4(0u, asuint(res));
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-@compute @workgroup_size(1)
-fn compute_main() {
+[numthreads(1, 1, 1)]
+void compute_main() {
   subgroupBallot_7e6d0e();
+  return;
 }
-
-Failed to generate: builtins/gen/literal/subgroupBallot/7e6d0e.wgsl:24:8 error: HLSL backend does not support extension 'chromium_experimental_subgroups'
-enable chromium_experimental_subgroups;
-       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
diff --git a/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl
index fe24933..bfcf146 100644
--- a/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/literal/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl
@@ -1,21 +1,14 @@
 SKIP: FAILED
 
+RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-enable chromium_experimental_subgroups;
-
-fn subgroupBallot_7e6d0e() {
-  var res : vec4<u32> = subgroupBallot();
-  prevent_dce = res;
+void subgroupBallot_7e6d0e() {
+  uint4 res = WaveActiveBallot(true);
+  prevent_dce.Store4(0u, asuint(res));
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-@compute @workgroup_size(1)
-fn compute_main() {
+[numthreads(1, 1, 1)]
+void compute_main() {
   subgroupBallot_7e6d0e();
+  return;
 }
-
-Failed to generate: builtins/gen/literal/subgroupBallot/7e6d0e.wgsl:24:8 error: HLSL backend does not support extension 'chromium_experimental_subgroups'
-enable chromium_experimental_subgroups;
-       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
diff --git a/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl b/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl
index dc7c411..3064f17 100644
--- a/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.dxc.hlsl
@@ -1,21 +1,12 @@
-SKIP: FAILED
+RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-
-enable chromium_experimental_subgroups;
-
-fn subgroupBallot_7e6d0e() {
-  var res : vec4<u32> = subgroupBallot();
-  prevent_dce = res;
+void subgroupBallot_7e6d0e() {
+  uint4 res = WaveActiveBallot(true);
+  prevent_dce.Store4(0u, asuint(res));
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-@compute @workgroup_size(1)
-fn compute_main() {
+[numthreads(1, 1, 1)]
+void compute_main() {
   subgroupBallot_7e6d0e();
+  return;
 }
-
-Failed to generate: builtins/gen/var/subgroupBallot/7e6d0e.wgsl:24:8 error: HLSL backend does not support extension 'chromium_experimental_subgroups'
-enable chromium_experimental_subgroups;
-       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
diff --git a/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl b/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl
index dc7c411..bfcf146 100644
--- a/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl
+++ b/test/tint/builtins/gen/var/subgroupBallot/7e6d0e.wgsl.expected.fxc.hlsl
@@ -1,21 +1,14 @@
 SKIP: FAILED
 
+RWByteAddressBuffer prevent_dce : register(u0, space2);
 
-enable chromium_experimental_subgroups;
-
-fn subgroupBallot_7e6d0e() {
-  var res : vec4<u32> = subgroupBallot();
-  prevent_dce = res;
+void subgroupBallot_7e6d0e() {
+  uint4 res = WaveActiveBallot(true);
+  prevent_dce.Store4(0u, asuint(res));
 }
 
-@group(2) @binding(0) var<storage, read_write> prevent_dce : vec4<u32>;
-
-@compute @workgroup_size(1)
-fn compute_main() {
+[numthreads(1, 1, 1)]
+void compute_main() {
   subgroupBallot_7e6d0e();
+  return;
 }
-
-Failed to generate: builtins/gen/var/subgroupBallot/7e6d0e.wgsl:24:8 error: HLSL backend does not support extension 'chromium_experimental_subgroups'
-enable chromium_experimental_subgroups;
-       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-