blob: cc08333f24fc835332df32ae284a28d22fa14b08 [file] [log] [blame]
/*
* Copyright (C) 2021 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include <cstdint>
#include <wtf/Ref.h>
#include <wtf/RefCounted.h>
namespace PAL::WebGPU {
class SupportedLimits final : public RefCounted<SupportedLimits> {
public:
static Ref<SupportedLimits> create(
uint32_t maxTextureDimension1D,
uint32_t maxTextureDimension2D,
uint32_t maxTextureDimension3D,
uint32_t maxTextureArrayLayers,
uint32_t maxBindGroups,
uint32_t maxDynamicUniformBuffersPerPipelineLayout,
uint32_t maxDynamicStorageBuffersPerPipelineLayout,
uint32_t maxSampledTexturesPerShaderStage,
uint32_t maxSamplersPerShaderStage,
uint32_t maxStorageBuffersPerShaderStage,
uint32_t maxStorageTexturesPerShaderStage,
uint32_t maxUniformBuffersPerShaderStage,
uint64_t maxUniformBufferBindingSize,
uint64_t maxStorageBufferBindingSize,
uint32_t minUniformBufferOffsetAlignment,
uint32_t minStorageBufferOffsetAlignment,
uint32_t maxVertexBuffers,
uint32_t maxVertexAttributes,
uint32_t maxVertexBufferArrayStride,
uint32_t maxInterStageShaderComponents,
uint32_t maxComputeWorkgroupStorageSize,
uint32_t maxComputeInvocationsPerWorkgroup,
uint32_t maxComputeWorkgroupSizeX,
uint32_t maxComputeWorkgroupSizeY,
uint32_t maxComputeWorkgroupSizeZ,
uint32_t maxComputeWorkgroupsPerDimension)
{
return adoptRef(*new SupportedLimits(
maxTextureDimension1D,
maxTextureDimension2D,
maxTextureDimension3D,
maxTextureArrayLayers,
maxBindGroups,
maxDynamicUniformBuffersPerPipelineLayout,
maxDynamicStorageBuffersPerPipelineLayout,
maxSampledTexturesPerShaderStage,
maxSamplersPerShaderStage,
maxStorageBuffersPerShaderStage,
maxStorageTexturesPerShaderStage,
maxUniformBuffersPerShaderStage,
maxUniformBufferBindingSize,
maxStorageBufferBindingSize,
minUniformBufferOffsetAlignment,
minStorageBufferOffsetAlignment,
maxVertexBuffers,
maxVertexAttributes,
maxVertexBufferArrayStride,
maxInterStageShaderComponents,
maxComputeWorkgroupStorageSize,
maxComputeInvocationsPerWorkgroup,
maxComputeWorkgroupSizeX,
maxComputeWorkgroupSizeY,
maxComputeWorkgroupSizeZ,
maxComputeWorkgroupsPerDimension));
}
static Ref<SupportedLimits> clone(const SupportedLimits& limits)
{
return adoptRef(*new SupportedLimits(
limits.maxTextureDimension1D(),
limits.maxTextureDimension2D(),
limits.maxTextureDimension3D(),
limits.maxTextureArrayLayers(),
limits.maxBindGroups(),
limits.maxDynamicUniformBuffersPerPipelineLayout(),
limits.maxDynamicStorageBuffersPerPipelineLayout(),
limits.maxSampledTexturesPerShaderStage(),
limits.maxSamplersPerShaderStage(),
limits.maxStorageBuffersPerShaderStage(),
limits.maxStorageTexturesPerShaderStage(),
limits.maxUniformBuffersPerShaderStage(),
limits.maxUniformBufferBindingSize(),
limits.maxStorageBufferBindingSize(),
limits.minUniformBufferOffsetAlignment(),
limits.minStorageBufferOffsetAlignment(),
limits.maxVertexBuffers(),
limits.maxVertexAttributes(),
limits.maxVertexBufferArrayStride(),
limits.maxInterStageShaderComponents(),
limits.maxComputeWorkgroupStorageSize(),
limits.maxComputeInvocationsPerWorkgroup(),
limits.maxComputeWorkgroupSizeX(),
limits.maxComputeWorkgroupSizeY(),
limits.maxComputeWorkgroupSizeZ(),
limits.maxComputeWorkgroupsPerDimension()));
}
uint32_t maxTextureDimension1D() const { return m_maxTextureDimension1D; }
uint32_t maxTextureDimension2D() const { return m_maxTextureDimension2D; }
uint32_t maxTextureDimension3D() const { return m_maxTextureDimension3D; }
uint32_t maxTextureArrayLayers() const { return m_maxTextureArrayLayers; }
uint32_t maxBindGroups() const { return m_maxBindGroups; }
uint32_t maxDynamicUniformBuffersPerPipelineLayout() const { return m_maxDynamicUniformBuffersPerPipelineLayout; }
uint32_t maxDynamicStorageBuffersPerPipelineLayout() const { return m_maxDynamicStorageBuffersPerPipelineLayout; }
uint32_t maxSampledTexturesPerShaderStage() const { return m_maxSampledTexturesPerShaderStage; }
uint32_t maxSamplersPerShaderStage() const { return m_maxSamplersPerShaderStage; }
uint32_t maxStorageBuffersPerShaderStage() const { return m_maxStorageBuffersPerShaderStage; }
uint32_t maxStorageTexturesPerShaderStage() const { return m_maxStorageTexturesPerShaderStage; }
uint32_t maxUniformBuffersPerShaderStage() const { return m_maxUniformBuffersPerShaderStage; }
uint64_t maxUniformBufferBindingSize() const { return m_maxUniformBufferBindingSize; }
uint64_t maxStorageBufferBindingSize() const { return m_maxStorageBufferBindingSize; }
uint32_t minUniformBufferOffsetAlignment() const { return m_minUniformBufferOffsetAlignment; }
uint32_t minStorageBufferOffsetAlignment() const { return m_minStorageBufferOffsetAlignment; }
uint32_t maxVertexBuffers() const { return m_maxVertexBuffers; }
uint32_t maxVertexAttributes() const { return m_maxVertexAttributes; }
uint32_t maxVertexBufferArrayStride() const { return m_maxVertexBufferArrayStride; }
uint32_t maxInterStageShaderComponents() const { return m_maxInterStageShaderComponents; }
uint32_t maxComputeWorkgroupStorageSize() const { return m_maxComputeWorkgroupStorageSize; }
uint32_t maxComputeInvocationsPerWorkgroup() const { return m_maxComputeInvocationsPerWorkgroup; }
uint32_t maxComputeWorkgroupSizeX() const { return m_maxComputeWorkgroupSizeX; }
uint32_t maxComputeWorkgroupSizeY() const { return m_maxComputeWorkgroupSizeY; }
uint32_t maxComputeWorkgroupSizeZ() const { return m_maxComputeWorkgroupSizeZ; }
uint32_t maxComputeWorkgroupsPerDimension() const { return m_maxComputeWorkgroupsPerDimension; }
private:
SupportedLimits(
uint32_t maxTextureDimension1D,
uint32_t maxTextureDimension2D,
uint32_t maxTextureDimension3D,
uint32_t maxTextureArrayLayers,
uint32_t maxBindGroups,
uint32_t maxDynamicUniformBuffersPerPipelineLayout,
uint32_t maxDynamicStorageBuffersPerPipelineLayout,
uint32_t maxSampledTexturesPerShaderStage,
uint32_t maxSamplersPerShaderStage,
uint32_t maxStorageBuffersPerShaderStage,
uint32_t maxStorageTexturesPerShaderStage,
uint32_t maxUniformBuffersPerShaderStage,
uint64_t maxUniformBufferBindingSize,
uint64_t maxStorageBufferBindingSize,
uint32_t minUniformBufferOffsetAlignment,
uint32_t minStorageBufferOffsetAlignment,
uint32_t maxVertexBuffers,
uint32_t maxVertexAttributes,
uint32_t maxVertexBufferArrayStride,
uint32_t maxInterStageShaderComponents,
uint32_t maxComputeWorkgroupStorageSize,
uint32_t maxComputeInvocationsPerWorkgroup,
uint32_t maxComputeWorkgroupSizeX,
uint32_t maxComputeWorkgroupSizeY,
uint32_t maxComputeWorkgroupSizeZ,
uint32_t maxComputeWorkgroupsPerDimension)
: m_maxTextureDimension1D(maxTextureDimension1D)
, m_maxTextureDimension2D(maxTextureDimension2D)
, m_maxTextureDimension3D(maxTextureDimension3D)
, m_maxTextureArrayLayers(maxTextureArrayLayers)
, m_maxBindGroups(maxBindGroups)
, m_maxDynamicUniformBuffersPerPipelineLayout(maxDynamicUniformBuffersPerPipelineLayout)
, m_maxDynamicStorageBuffersPerPipelineLayout(maxDynamicStorageBuffersPerPipelineLayout)
, m_maxSampledTexturesPerShaderStage(maxSampledTexturesPerShaderStage)
, m_maxSamplersPerShaderStage(maxSamplersPerShaderStage)
, m_maxStorageBuffersPerShaderStage(maxStorageBuffersPerShaderStage)
, m_maxStorageTexturesPerShaderStage(maxStorageTexturesPerShaderStage)
, m_maxUniformBuffersPerShaderStage(maxUniformBuffersPerShaderStage)
, m_maxUniformBufferBindingSize(maxUniformBufferBindingSize)
, m_maxStorageBufferBindingSize(maxStorageBufferBindingSize)
, m_minUniformBufferOffsetAlignment(minUniformBufferOffsetAlignment)
, m_minStorageBufferOffsetAlignment(minStorageBufferOffsetAlignment)
, m_maxVertexBuffers(maxVertexBuffers)
, m_maxVertexAttributes(maxVertexAttributes)
, m_maxVertexBufferArrayStride(maxVertexBufferArrayStride)
, m_maxInterStageShaderComponents(maxInterStageShaderComponents)
, m_maxComputeWorkgroupStorageSize(maxComputeWorkgroupStorageSize)
, m_maxComputeInvocationsPerWorkgroup(maxComputeInvocationsPerWorkgroup)
, m_maxComputeWorkgroupSizeX(maxComputeWorkgroupSizeX)
, m_maxComputeWorkgroupSizeY(maxComputeWorkgroupSizeY)
, m_maxComputeWorkgroupSizeZ(maxComputeWorkgroupSizeZ)
, m_maxComputeWorkgroupsPerDimension(maxComputeWorkgroupsPerDimension)
{
}
SupportedLimits(const SupportedLimits&) = delete;
SupportedLimits(SupportedLimits&&) = delete;
SupportedLimits& operator=(const SupportedLimits&) = delete;
SupportedLimits& operator=(SupportedLimits&&) = delete;
uint32_t m_maxTextureDimension1D { 0 };
uint32_t m_maxTextureDimension2D { 0 };
uint32_t m_maxTextureDimension3D { 0 };
uint32_t m_maxTextureArrayLayers { 0 };
uint32_t m_maxBindGroups { 0 };
uint32_t m_maxDynamicUniformBuffersPerPipelineLayout { 0 };
uint32_t m_maxDynamicStorageBuffersPerPipelineLayout { 0 };
uint32_t m_maxSampledTexturesPerShaderStage { 0 };
uint32_t m_maxSamplersPerShaderStage { 0 };
uint32_t m_maxStorageBuffersPerShaderStage { 0 };
uint32_t m_maxStorageTexturesPerShaderStage { 0 };
uint32_t m_maxUniformBuffersPerShaderStage { 0 };
uint64_t m_maxUniformBufferBindingSize { 0 };
uint64_t m_maxStorageBufferBindingSize { 0 };
uint32_t m_minUniformBufferOffsetAlignment { 0 };
uint32_t m_minStorageBufferOffsetAlignment { 0 };
uint32_t m_maxVertexBuffers { 0 };
uint32_t m_maxVertexAttributes { 0 };
uint32_t m_maxVertexBufferArrayStride { 0 };
uint32_t m_maxInterStageShaderComponents { 0 };
uint32_t m_maxComputeWorkgroupStorageSize { 0 };
uint32_t m_maxComputeInvocationsPerWorkgroup { 0 };
uint32_t m_maxComputeWorkgroupSizeX { 0 };
uint32_t m_maxComputeWorkgroupSizeY { 0 };
uint32_t m_maxComputeWorkgroupSizeZ { 0 };
uint32_t m_maxComputeWorkgroupsPerDimension { 0 };
};
} // namespace PAL::WebGPU