[node] Support subgroupMatrixConfigs query in dawn.node

Bug: 348702031
Change-Id: I79b4d9af4bafa3a9b23a613523690ee469bde565
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/225857
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/dawn/node/binding/GPUAdapter.cpp b/src/dawn/node/binding/GPUAdapter.cpp
index 3c2c719..9f8b728e 100644
--- a/src/dawn/node/binding/GPUAdapter.cpp
+++ b/src/dawn/node/binding/GPUAdapter.cpp
@@ -128,6 +128,12 @@
 
 interop::Interface<interop::GPUAdapterInfo> GPUAdapter::getInfo(Napi::Env env) {
     wgpu::AdapterInfo info = {};
+
+    wgpu::AdapterPropertiesSubgroupMatrixConfigs subgroupMatrixConfigs;
+    if (adapter_.HasFeature(FeatureName::ChromiumExperimentalSubgroupMatrix)) {
+        info.nextInChain = &subgroupMatrixConfigs;
+    }
+
     adapter_.GetInfo(&info);
 
     return interop::GPUAdapterInfo::Create<GPUAdapterInfo>(env, info);
diff --git a/src/dawn/node/binding/GPUAdapterInfo.cpp b/src/dawn/node/binding/GPUAdapterInfo.cpp
index aec90f5..cfd1c73 100644
--- a/src/dawn/node/binding/GPUAdapterInfo.cpp
+++ b/src/dawn/node/binding/GPUAdapterInfo.cpp
@@ -36,13 +36,67 @@
 // wgpu::bindings::GPUAdapterInfo
 ////////////////////////////////////////////////////////////////////////////////
 
+namespace {
+
+interop::GPUSubgroupMatrixComponentType SubgroupMatrixComponentType(
+    wgpu::SubgroupMatrixComponentType c) {
+    switch (c) {
+        case SubgroupMatrixComponentType::F32:
+            return interop::GPUSubgroupMatrixComponentType::kF32;
+        case SubgroupMatrixComponentType::F16:
+            return interop::GPUSubgroupMatrixComponentType::kF16;
+        case SubgroupMatrixComponentType::U32:
+            return interop::GPUSubgroupMatrixComponentType::kU32;
+        case SubgroupMatrixComponentType::I32:
+            return interop::GPUSubgroupMatrixComponentType::kI32;
+    }
+}
+
+struct GPUSubgroupMatrixConfig : public interop::GPUSubgroupMatrixConfig {
+    interop::GPUSubgroupMatrixComponentType componentType;
+    interop::GPUSubgroupMatrixComponentType resultComponentType;
+    uint32_t M;
+    uint32_t N;
+    uint32_t K;
+
+    explicit GPUSubgroupMatrixConfig(const wgpu::SubgroupMatrixConfig& config)
+        : componentType(SubgroupMatrixComponentType(config.componentType)),
+          resultComponentType(SubgroupMatrixComponentType(config.resultComponentType)),
+          M(config.M),
+          N(config.N),
+          K(config.K) {}
+
+    interop::GPUSubgroupMatrixComponentType getComponentType(Napi::Env) override {
+        return componentType;
+    }
+    interop::GPUSubgroupMatrixComponentType getResultComponentType(Napi::Env) override {
+        return resultComponentType;
+    }
+    uint32_t getM(Napi::Env) override { return M; }
+    uint32_t getN(Napi::Env) override { return N; }
+    uint32_t getK(Napi::Env) override { return K; }
+};
+}  // namespace
+
 GPUAdapterInfo::GPUAdapterInfo(const wgpu::AdapterInfo& info)
     : vendor_(info.vendor),
       architecture_(info.architecture),
       device_(info.device),
       description_(info.description),
       subgroup_min_size_(info.subgroupMinSize),
-      subgroup_max_size_(info.subgroupMaxSize) {}
+      subgroup_max_size_(info.subgroupMaxSize) {
+    auto* next = info.nextInChain;
+    while (next) {
+        if (next->sType == SType::AdapterPropertiesSubgroupMatrixConfigs) {
+            auto* configs = static_cast<wgpu::AdapterPropertiesSubgroupMatrixConfigs*>(next);
+            subgroup_matrix_configs_.reserve(configs->configCount);
+            for (uint32_t i = 0; i < configs->configCount; i++) {
+                subgroup_matrix_configs_.push_back(configs->configs[i]);
+            }
+        }
+        next = next->nextInChain;
+    }
+}
 
 std::string GPUAdapterInfo::getVendor(Napi::Env) {
     return vendor_;
@@ -68,4 +122,14 @@
     return subgroup_max_size_;
 }
 
+GPUAdapterInfo::SubgroupMatrixConfigs GPUAdapterInfo::getSubgroupMatrixConfigs(Napi::Env env) {
+    SubgroupMatrixConfigs out;
+    out.reserve(subgroup_matrix_configs_.size());
+    for (auto& config : subgroup_matrix_configs_) {
+        out.emplace_back(
+            interop::GPUSubgroupMatrixConfig::Create<GPUSubgroupMatrixConfig>(env, config));
+    }
+    return out;
+}
+
 }  // namespace wgpu::binding
diff --git a/src/dawn/node/binding/GPUAdapterInfo.h b/src/dawn/node/binding/GPUAdapterInfo.h
index 7daa9f4..d46f330 100644
--- a/src/dawn/node/binding/GPUAdapterInfo.h
+++ b/src/dawn/node/binding/GPUAdapterInfo.h
@@ -31,6 +31,7 @@
 #include <webgpu/webgpu_cpp.h>
 
 #include <string>
+#include <vector>
 
 #include "dawn/native/DawnNative.h"
 #include "src/dawn/node/interop/NodeAPI.h"
@@ -51,6 +52,10 @@
     uint32_t getSubgroupMinSize(Napi::Env) override;
     uint32_t getSubgroupMaxSize(Napi::Env) override;
 
+    using SubgroupMatrixConfigs =
+        interop::FrozenArray<interop::Interface<interop::GPUSubgroupMatrixConfig>>;
+    SubgroupMatrixConfigs getSubgroupMatrixConfigs(Napi::Env) override;
+
   private:
     std::string vendor_;
     std::string architecture_;
@@ -58,6 +63,7 @@
     std::string description_;
     uint32_t subgroup_min_size_;
     uint32_t subgroup_max_size_;
+    std::vector<wgpu::SubgroupMatrixConfig> subgroup_matrix_configs_;
 };
 
 }  // namespace wgpu::binding
diff --git a/src/dawn/node/interop/DawnExtensions.idl b/src/dawn/node/interop/DawnExtensions.idl
index 0f0077a..6586ac4 100644
--- a/src/dawn/node/interop/DawnExtensions.idl
+++ b/src/dawn/node/interop/DawnExtensions.idl
@@ -39,6 +39,27 @@
     readonly attribute DOMString featureLevel;
 };
 
+enum GPUSubgroupMatrixComponentType {
+  "f32",
+  "f16",
+  "u32",
+  "i32",
+  "u8",
+  "i8",
+};
+
+interface GPUSubgroupMatrixConfig {
+  readonly attribute GPUSubgroupMatrixComponentType componentType;
+  readonly attribute GPUSubgroupMatrixComponentType resultComponentType;
+  readonly attribute unsigned long M;
+  readonly attribute unsigned long N;
+  readonly attribute unsigned long K;
+};
+
+interface GPUAdapterInfo {
+    [SameObject] readonly attribute FrozenArray<GPUSubgroupMatrixConfig> subgroupMatrixConfigs;
+};
+
 interface GPUCommandEncoder {
     undefined writeTimestamp(GPUQuerySet querySet, GPUSize32 queryIndex);
 };