From 34206ec07bfcc6a5942402caea0385ddffb25d9b Mon Sep 17 00:00:00 2001 From: Ben Clayton Date: Mon, 11 Oct 2021 15:42:12 +0000 Subject: [PATCH] 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 Reviewed-by: Austin Eng Reviewed-by: Antonio Maiorano Commit-Queue: Ben Clayton --- src/dawn_node/binding/GPUAdapter.cpp | 38 ++++++++++++- src/dawn_node/binding/GPUDevice.cpp | 6 +- src/dawn_node/binding/GPUSupportedLimits.cpp | 58 ++++++++++---------- src/dawn_node/binding/GPUSupportedLimits.h | 5 ++ 4 files changed, 76 insertions(+), 31 deletions(-) diff --git a/src/dawn_node/binding/GPUAdapter.cpp b/src/dawn_node/binding/GPUAdapter.cpp index 82fc7b1970..82378d8515 100644 --- a/src/dawn_node/binding/GPUAdapter.cpp +++ b/src/dawn_node/binding/GPUAdapter.cpp @@ -92,7 +92,43 @@ namespace wgpu { namespace binding { } interop::Interface GPUAdapter::getLimits(Napi::Env env) { - return interop::GPUSupportedLimits::Create(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(env, wgpuLimits); } bool GPUAdapter::getIsFallbackAdapter(Napi::Env) { diff --git a/src/dawn_node/binding/GPUDevice.cpp b/src/dawn_node/binding/GPUDevice.cpp index 73b5e18f4e..0870307598 100644 --- a/src/dawn_node/binding/GPUDevice.cpp +++ b/src/dawn_node/binding/GPUDevice.cpp @@ -126,7 +126,11 @@ namespace wgpu { namespace binding { } interop::Interface GPUDevice::getLimits(Napi::Env env) { - return interop::GPUSupportedLimits::Create(env); + wgpu::SupportedLimits limits{}; + if (!device_.GetLimits(&limits)) { + Napi::Error::New(env, "failed to get device limits").ThrowAsJavaScriptException(); + } + return interop::GPUSupportedLimits::Create(env, limits); } interop::Interface GPUDevice::getQueue(Napi::Env env) { diff --git a/src/dawn_node/binding/GPUSupportedLimits.cpp b/src/dawn_node/binding/GPUSupportedLimits.cpp index 8587031879..4a8399bc73 100644 --- a/src/dawn_node/binding/GPUSupportedLimits.cpp +++ b/src/dawn_node/binding/GPUSupportedLimits.cpp @@ -20,112 +20,112 @@ namespace wgpu { namespace binding { // 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 b50753d822..faed813949 100644 --- a/src/dawn_node/binding/GPUSupportedLimits.h +++ b/src/dawn_node/binding/GPUSupportedLimits.h @@ -25,6 +25,8 @@ namespace wgpu { namespace binding { // 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 @@ namespace wgpu { namespace binding { 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