[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);
};