dawn_node: Use wgpu::SupportedLimits
Query the Adapter / Device for limits instead of hardcoding them.
Bug: dawn:1143
Change-Id: Ib6d47bdb81df8e5e6eb767d35d346bbf34c5877a
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/65722
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/dawn_node/binding/GPUAdapter.cpp b/src/dawn_node/binding/GPUAdapter.cpp
index 82fc7b1..82378d8 100644
--- a/src/dawn_node/binding/GPUAdapter.cpp
+++ b/src/dawn_node/binding/GPUAdapter.cpp
@@ -92,7 +92,43 @@
}
interop::Interface<interop::GPUSupportedLimits> GPUAdapter::getLimits(Napi::Env env) {
- return interop::GPUSupportedLimits::Create<GPUSupportedLimits>(env);
+ WGPUSupportedLimits limits{};
+ if (!adapter_.GetLimits(&limits)) {
+ Napi::Error::New(env, "failed to get adapter limits").ThrowAsJavaScriptException();
+ }
+
+ wgpu::SupportedLimits wgpuLimits{};
+
+#define COPY_LIMIT(LIMIT) wgpuLimits.limits.LIMIT = limits.limits.LIMIT
+ COPY_LIMIT(maxTextureDimension1D);
+ COPY_LIMIT(maxTextureDimension2D);
+ COPY_LIMIT(maxTextureDimension3D);
+ COPY_LIMIT(maxTextureArrayLayers);
+ COPY_LIMIT(maxBindGroups);
+ COPY_LIMIT(maxDynamicUniformBuffersPerPipelineLayout);
+ COPY_LIMIT(maxDynamicStorageBuffersPerPipelineLayout);
+ COPY_LIMIT(maxSampledTexturesPerShaderStage);
+ COPY_LIMIT(maxSamplersPerShaderStage);
+ COPY_LIMIT(maxStorageBuffersPerShaderStage);
+ COPY_LIMIT(maxStorageTexturesPerShaderStage);
+ COPY_LIMIT(maxUniformBuffersPerShaderStage);
+ COPY_LIMIT(maxUniformBufferBindingSize);
+ COPY_LIMIT(maxStorageBufferBindingSize);
+ COPY_LIMIT(minUniformBufferOffsetAlignment);
+ COPY_LIMIT(minStorageBufferOffsetAlignment);
+ COPY_LIMIT(maxVertexBuffers);
+ COPY_LIMIT(maxVertexAttributes);
+ COPY_LIMIT(maxVertexBufferArrayStride);
+ COPY_LIMIT(maxInterStageShaderComponents);
+ COPY_LIMIT(maxComputeWorkgroupStorageSize);
+ COPY_LIMIT(maxComputeInvocationsPerWorkgroup);
+ COPY_LIMIT(maxComputeWorkgroupSizeX);
+ COPY_LIMIT(maxComputeWorkgroupSizeY);
+ COPY_LIMIT(maxComputeWorkgroupSizeZ);
+ COPY_LIMIT(maxComputeWorkgroupsPerDimension);
+#undef COPY_LIMIT
+
+ return interop::GPUSupportedLimits::Create<GPUSupportedLimits>(env, wgpuLimits);
}
bool GPUAdapter::getIsFallbackAdapter(Napi::Env) {
diff --git a/src/dawn_node/binding/GPUDevice.cpp b/src/dawn_node/binding/GPUDevice.cpp
index 73b5e18..0870307 100644
--- a/src/dawn_node/binding/GPUDevice.cpp
+++ b/src/dawn_node/binding/GPUDevice.cpp
@@ -126,7 +126,11 @@
}
interop::Interface<interop::GPUSupportedLimits> GPUDevice::getLimits(Napi::Env env) {
- return interop::GPUSupportedLimits::Create<GPUSupportedLimits>(env);
+ wgpu::SupportedLimits limits{};
+ if (!device_.GetLimits(&limits)) {
+ Napi::Error::New(env, "failed to get device limits").ThrowAsJavaScriptException();
+ }
+ return interop::GPUSupportedLimits::Create<GPUSupportedLimits>(env, limits);
}
interop::Interface<interop::GPUQueue> GPUDevice::getQueue(Napi::Env env) {
diff --git a/src/dawn_node/binding/GPUSupportedLimits.cpp b/src/dawn_node/binding/GPUSupportedLimits.cpp
index 8587031..4a8399b 100644
--- a/src/dawn_node/binding/GPUSupportedLimits.cpp
+++ b/src/dawn_node/binding/GPUSupportedLimits.cpp
@@ -20,112 +20,112 @@
// wgpu::bindings::GPUSupportedLimits
////////////////////////////////////////////////////////////////////////////////
- // Values taken from.
- // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/webgpu/gpu_supported_limits.h
- // TODO(crbug.com/dawn/1131): Actually use limits reported by the device / adapter.
+ GPUSupportedLimits::GPUSupportedLimits(wgpu::SupportedLimits limits)
+ : limits_(std::move(limits)) {
+ }
uint32_t GPUSupportedLimits::getMaxTextureDimension1D(Napi::Env) {
- return 8192;
+ return limits_.limits.maxTextureDimension1D;
}
uint32_t GPUSupportedLimits::getMaxTextureDimension2D(Napi::Env) {
- return 8192;
+ return limits_.limits.maxTextureDimension2D;
}
uint32_t GPUSupportedLimits::getMaxTextureDimension3D(Napi::Env) {
- return 2048;
+ return limits_.limits.maxTextureDimension3D;
}
uint32_t GPUSupportedLimits::getMaxTextureArrayLayers(Napi::Env) {
- return 2048;
+ return limits_.limits.maxTextureArrayLayers;
}
uint32_t GPUSupportedLimits::getMaxBindGroups(Napi::Env) {
- return 4;
+ return limits_.limits.maxBindGroups;
}
uint32_t GPUSupportedLimits::getMaxDynamicUniformBuffersPerPipelineLayout(Napi::Env) {
- return 8;
+ return limits_.limits.maxDynamicUniformBuffersPerPipelineLayout;
}
uint32_t GPUSupportedLimits::getMaxDynamicStorageBuffersPerPipelineLayout(Napi::Env) {
- return 4;
+ return limits_.limits.maxDynamicStorageBuffersPerPipelineLayout;
}
uint32_t GPUSupportedLimits::getMaxSampledTexturesPerShaderStage(Napi::Env) {
- return 16;
+ return limits_.limits.maxSampledTexturesPerShaderStage;
}
uint32_t GPUSupportedLimits::getMaxSamplersPerShaderStage(Napi::Env) {
- return 16;
+ return limits_.limits.maxSamplersPerShaderStage;
}
uint32_t GPUSupportedLimits::getMaxStorageBuffersPerShaderStage(Napi::Env) {
- return 4;
+ return limits_.limits.maxStorageBuffersPerShaderStage;
}
uint32_t GPUSupportedLimits::getMaxStorageTexturesPerShaderStage(Napi::Env) {
- return 4;
+ return limits_.limits.maxStorageTexturesPerShaderStage;
}
uint32_t GPUSupportedLimits::getMaxUniformBuffersPerShaderStage(Napi::Env) {
- return 12;
+ return limits_.limits.maxUniformBuffersPerShaderStage;
}
uint64_t GPUSupportedLimits::getMaxUniformBufferBindingSize(Napi::Env) {
- return 16384;
+ return limits_.limits.maxUniformBufferBindingSize;
}
uint64_t GPUSupportedLimits::getMaxStorageBufferBindingSize(Napi::Env) {
- return 134217728;
+ return limits_.limits.maxStorageBufferBindingSize;
}
uint32_t GPUSupportedLimits::getMinUniformBufferOffsetAlignment(Napi::Env) {
- return 256;
+ return limits_.limits.minUniformBufferOffsetAlignment;
}
uint32_t GPUSupportedLimits::getMinStorageBufferOffsetAlignment(Napi::Env) {
- return 256;
+ return limits_.limits.minStorageBufferOffsetAlignment;
}
uint32_t GPUSupportedLimits::getMaxVertexBuffers(Napi::Env) {
- return 8;
+ return limits_.limits.maxVertexBuffers;
}
uint32_t GPUSupportedLimits::getMaxVertexAttributes(Napi::Env) {
- return 16;
+ return limits_.limits.maxVertexAttributes;
}
uint32_t GPUSupportedLimits::getMaxVertexBufferArrayStride(Napi::Env) {
- return 2048;
+ return limits_.limits.maxVertexBufferArrayStride;
}
uint32_t GPUSupportedLimits::getMaxInterStageShaderComponents(Napi::Env) {
- return 60;
+ return limits_.limits.maxInterStageShaderComponents;
}
uint32_t GPUSupportedLimits::getMaxComputeWorkgroupStorageSize(Napi::Env) {
- return 16352;
+ return limits_.limits.maxComputeWorkgroupStorageSize;
}
uint32_t GPUSupportedLimits::getMaxComputeInvocationsPerWorkgroup(Napi::Env) {
- return 256;
+ return limits_.limits.maxComputeInvocationsPerWorkgroup;
}
uint32_t GPUSupportedLimits::getMaxComputeWorkgroupSizeX(Napi::Env) {
- return 256;
+ return limits_.limits.maxComputeWorkgroupSizeX;
}
uint32_t GPUSupportedLimits::getMaxComputeWorkgroupSizeY(Napi::Env) {
- return 256;
+ return limits_.limits.maxComputeWorkgroupSizeY;
}
uint32_t GPUSupportedLimits::getMaxComputeWorkgroupSizeZ(Napi::Env) {
- return 64;
+ return limits_.limits.maxComputeWorkgroupSizeZ;
}
uint32_t GPUSupportedLimits::getMaxComputeWorkgroupsPerDimension(Napi::Env) {
- return 65535;
+ return limits_.limits.maxComputeWorkgroupsPerDimension;
}
}} // namespace wgpu::binding
diff --git a/src/dawn_node/binding/GPUSupportedLimits.h b/src/dawn_node/binding/GPUSupportedLimits.h
index b50753d..faed813 100644
--- a/src/dawn_node/binding/GPUSupportedLimits.h
+++ b/src/dawn_node/binding/GPUSupportedLimits.h
@@ -25,6 +25,8 @@
// GPUSupportedLimits is an implementation of interop::GPUSupportedLimits.
class GPUSupportedLimits final : public interop::GPUSupportedLimits {
public:
+ GPUSupportedLimits(wgpu::SupportedLimits);
+
// interop::GPUSupportedLimits interface compliance
uint32_t getMaxTextureDimension1D(Napi::Env) override;
uint32_t getMaxTextureDimension2D(Napi::Env) override;
@@ -52,6 +54,9 @@
uint32_t getMaxComputeWorkgroupSizeY(Napi::Env) override;
uint32_t getMaxComputeWorkgroupSizeZ(Napi::Env) override;
uint32_t getMaxComputeWorkgroupsPerDimension(Napi::Env) override;
+
+ private:
+ wgpu::SupportedLimits limits_;
};
}} // namespace wgpu::binding