diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /dom/webgpu/SupportedLimits.cpp | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/webgpu/SupportedLimits.cpp')
-rw-r--r-- | dom/webgpu/SupportedLimits.cpp | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/dom/webgpu/SupportedLimits.cpp b/dom/webgpu/SupportedLimits.cpp new file mode 100644 index 0000000000..4a99affb05 --- /dev/null +++ b/dom/webgpu/SupportedLimits.cpp @@ -0,0 +1,201 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "SupportedLimits.h" +#include "Adapter.h" +#include "mozilla/dom/WebGPUBinding.h" + +namespace mozilla::webgpu { + +GPU_IMPL_CYCLE_COLLECTION(SupportedLimits, mParent) +GPU_IMPL_JS_WRAP(SupportedLimits) + +SupportedLimits::SupportedLimits(Adapter* const aParent, + const ffi::WGPULimits& aLimits) + : ChildOf(aParent), mFfi(std::make_unique<ffi::WGPULimits>(aLimits)) {} + +SupportedLimits::~SupportedLimits() = default; + +uint64_t GetLimit(const ffi::WGPULimits& limits, const Limit limit) { + switch (limit) { + case Limit::MaxTextureDimension1D: + return limits.max_texture_dimension_1d; + case Limit::MaxTextureDimension2D: + return limits.max_texture_dimension_2d; + case Limit::MaxTextureDimension3D: + return limits.max_texture_dimension_3d; + case Limit::MaxTextureArrayLayers: + return limits.max_texture_array_layers; + case Limit::MaxBindGroups: + return limits.max_bind_groups; + case Limit::MaxBindGroupsPlusVertexBuffers: + // Not in ffi::WGPULimits, so synthesize: + return GetLimit(limits, Limit::MaxBindGroups) + + GetLimit(limits, Limit::MaxVertexBuffers); + case Limit::MaxBindingsPerBindGroup: + return limits.max_bindings_per_bind_group; + case Limit::MaxDynamicUniformBuffersPerPipelineLayout: + return limits.max_dynamic_uniform_buffers_per_pipeline_layout; + case Limit::MaxDynamicStorageBuffersPerPipelineLayout: + return limits.max_dynamic_storage_buffers_per_pipeline_layout; + case Limit::MaxSampledTexturesPerShaderStage: + return limits.max_sampled_textures_per_shader_stage; + case Limit::MaxSamplersPerShaderStage: + return limits.max_samplers_per_shader_stage; + case Limit::MaxStorageBuffersPerShaderStage: + return limits.max_storage_buffers_per_shader_stage; + case Limit::MaxStorageTexturesPerShaderStage: + return limits.max_storage_textures_per_shader_stage; + case Limit::MaxUniformBuffersPerShaderStage: + return limits.max_uniform_buffers_per_shader_stage; + case Limit::MaxUniformBufferBindingSize: + return limits.max_uniform_buffer_binding_size; + case Limit::MaxStorageBufferBindingSize: + return limits.max_storage_buffer_binding_size; + case Limit::MinUniformBufferOffsetAlignment: + return limits.min_uniform_buffer_offset_alignment; + case Limit::MinStorageBufferOffsetAlignment: + return limits.min_storage_buffer_offset_alignment; + case Limit::MaxVertexBuffers: + return limits.max_vertex_buffers; + case Limit::MaxBufferSize: + return limits.max_buffer_size; + case Limit::MaxVertexAttributes: + return limits.max_vertex_attributes; + case Limit::MaxVertexBufferArrayStride: + return limits.max_vertex_buffer_array_stride; + case Limit::MaxInterStageShaderComponents: + return limits.max_inter_stage_shader_components; + case Limit::MaxInterStageShaderVariables: + return 16; // From the spec. (not in ffi::WGPULimits) + case Limit::MaxColorAttachments: + return 8; // From the spec. (not in ffi::WGPULimits) + case Limit::MaxColorAttachmentBytesPerSample: + return 32; // From the spec. (not in ffi::WGPULimits) + case Limit::MaxComputeWorkgroupStorageSize: + return limits.max_compute_workgroup_storage_size; + case Limit::MaxComputeInvocationsPerWorkgroup: + return limits.max_compute_invocations_per_workgroup; + case Limit::MaxComputeWorkgroupSizeX: + return limits.max_compute_workgroup_size_x; + case Limit::MaxComputeWorkgroupSizeY: + return limits.max_compute_workgroup_size_y; + case Limit::MaxComputeWorkgroupSizeZ: + return limits.max_compute_workgroup_size_z; + case Limit::MaxComputeWorkgroupsPerDimension: + return limits.max_compute_workgroups_per_dimension; + } + MOZ_CRASH("Bad Limit"); +} + +void SetLimit(ffi::WGPULimits* const limits, const Limit limit, + const double val) { + const auto autoVal = LazyAssertedCast(static_cast<uint64_t>(val)); + switch (limit) { + case Limit::MaxTextureDimension1D: + limits->max_texture_dimension_1d = autoVal; + return; + case Limit::MaxTextureDimension2D: + limits->max_texture_dimension_2d = autoVal; + return; + case Limit::MaxTextureDimension3D: + limits->max_texture_dimension_3d = autoVal; + return; + case Limit::MaxTextureArrayLayers: + limits->max_texture_array_layers = autoVal; + return; + case Limit::MaxBindGroups: + limits->max_bind_groups = autoVal; + return; + case Limit::MaxBindGroupsPlusVertexBuffers: + // Not in ffi::WGPULimits, and we're allowed to give back better + // limits than requested. + return; + case Limit::MaxBindingsPerBindGroup: + limits->max_bindings_per_bind_group = autoVal; + return; + case Limit::MaxDynamicUniformBuffersPerPipelineLayout: + limits->max_dynamic_uniform_buffers_per_pipeline_layout = autoVal; + return; + case Limit::MaxDynamicStorageBuffersPerPipelineLayout: + limits->max_dynamic_storage_buffers_per_pipeline_layout = autoVal; + return; + case Limit::MaxSampledTexturesPerShaderStage: + limits->max_sampled_textures_per_shader_stage = autoVal; + return; + case Limit::MaxSamplersPerShaderStage: + limits->max_samplers_per_shader_stage = autoVal; + return; + case Limit::MaxStorageBuffersPerShaderStage: + limits->max_storage_buffers_per_shader_stage = autoVal; + return; + case Limit::MaxStorageTexturesPerShaderStage: + limits->max_storage_textures_per_shader_stage = autoVal; + return; + case Limit::MaxUniformBuffersPerShaderStage: + limits->max_uniform_buffers_per_shader_stage = autoVal; + return; + case Limit::MaxUniformBufferBindingSize: + limits->max_uniform_buffer_binding_size = autoVal; + return; + case Limit::MaxStorageBufferBindingSize: + limits->max_storage_buffer_binding_size = autoVal; + return; + case Limit::MinUniformBufferOffsetAlignment: + limits->min_uniform_buffer_offset_alignment = autoVal; + return; + case Limit::MinStorageBufferOffsetAlignment: + limits->min_storage_buffer_offset_alignment = autoVal; + return; + case Limit::MaxVertexBuffers: + limits->max_vertex_buffers = autoVal; + return; + case Limit::MaxBufferSize: + limits->max_buffer_size = autoVal; + return; + case Limit::MaxVertexAttributes: + limits->max_vertex_attributes = autoVal; + return; + case Limit::MaxVertexBufferArrayStride: + limits->max_vertex_buffer_array_stride = autoVal; + return; + case Limit::MaxInterStageShaderComponents: + limits->max_inter_stage_shader_components = autoVal; + return; + case Limit::MaxInterStageShaderVariables: + // Not in ffi::WGPULimits, and we're allowed to give back better + // limits than requested. + return; + case Limit::MaxColorAttachments: + // Not in ffi::WGPULimits, and we're allowed to give back better + // limits than requested. + return; + case Limit::MaxColorAttachmentBytesPerSample: + // Not in ffi::WGPULimits, and we're allowed to give back better + // limits than requested. + return; + case Limit::MaxComputeWorkgroupStorageSize: + limits->max_compute_workgroup_storage_size = autoVal; + return; + case Limit::MaxComputeInvocationsPerWorkgroup: + limits->max_compute_invocations_per_workgroup = autoVal; + return; + case Limit::MaxComputeWorkgroupSizeX: + limits->max_compute_workgroup_size_x = autoVal; + return; + case Limit::MaxComputeWorkgroupSizeY: + limits->max_compute_workgroup_size_y = autoVal; + return; + case Limit::MaxComputeWorkgroupSizeZ: + limits->max_compute_workgroup_size_z = autoVal; + return; + case Limit::MaxComputeWorkgroupsPerDimension: + limits->max_compute_workgroups_per_dimension = autoVal; + return; + } + MOZ_CRASH("Bad Limit"); +} + +} // namespace mozilla::webgpu |