| // Copyright 2020 The Dawn Authors |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #ifndef DAWNNATIVE_BINDINGINFO_H_ |
| #define DAWNNATIVE_BINDINGINFO_H_ |
| |
| #include "common/Constants.h" |
| #include "common/ityp_array.h" |
| #include "dawn_native/Error.h" |
| #include "dawn_native/Format.h" |
| #include "dawn_native/IntegerTypes.h" |
| #include "dawn_native/PerStage.h" |
| |
| #include "dawn_native/dawn_platform.h" |
| |
| #include <cstdint> |
| |
| namespace dawn::native { |
| |
| // Not a real WebGPU limit, but the sum of the two limits is useful for internal optimizations. |
| static constexpr uint32_t kMaxDynamicBuffersPerPipelineLayout = |
| kMaxDynamicUniformBuffersPerPipelineLayout + kMaxDynamicStorageBuffersPerPipelineLayout; |
| |
| static constexpr BindingIndex kMaxDynamicBuffersPerPipelineLayoutTyped = |
| BindingIndex(kMaxDynamicBuffersPerPipelineLayout); |
| |
| // Not a real WebGPU limit, but used to optimize parts of Dawn which expect valid usage of the |
| // API. There should never be more bindings than the max per stage, for each stage. |
| static constexpr uint32_t kMaxBindingsPerPipelineLayout = |
| 3 * (kMaxSampledTexturesPerShaderStage + kMaxSamplersPerShaderStage + |
| kMaxStorageBuffersPerShaderStage + kMaxStorageTexturesPerShaderStage + |
| kMaxUniformBuffersPerShaderStage); |
| |
| static constexpr BindingIndex kMaxBindingsPerPipelineLayoutTyped = |
| BindingIndex(kMaxBindingsPerPipelineLayout); |
| |
| // TODO(enga): Figure out a good number for this. |
| static constexpr uint32_t kMaxOptimalBindingsPerGroup = 32; |
| |
| enum class BindingInfoType { Buffer, Sampler, Texture, StorageTexture, ExternalTexture }; |
| |
| absl::FormatConvertResult<absl::FormatConversionCharSet::kString> AbslFormatConvert( |
| BindingInfoType value, |
| const absl::FormatConversionSpec& spec, |
| absl::FormatSink* s); |
| |
| struct BindingInfo { |
| BindingNumber binding; |
| wgpu::ShaderStage visibility; |
| |
| BindingInfoType bindingType; |
| |
| // TODO(dawn:527): These four values could be made into a union. |
| BufferBindingLayout buffer; |
| SamplerBindingLayout sampler; |
| TextureBindingLayout texture; |
| StorageTextureBindingLayout storageTexture; |
| }; |
| |
| struct BindingSlot { |
| BindGroupIndex group; |
| BindingNumber binding; |
| }; |
| |
| struct PerStageBindingCounts { |
| uint32_t sampledTextureCount; |
| uint32_t samplerCount; |
| uint32_t storageBufferCount; |
| uint32_t storageTextureCount; |
| uint32_t uniformBufferCount; |
| uint32_t externalTextureCount; |
| }; |
| |
| struct BindingCounts { |
| uint32_t totalCount; |
| uint32_t bufferCount; |
| uint32_t unverifiedBufferCount; // Buffers with minimum buffer size unspecified |
| uint32_t dynamicUniformBufferCount; |
| uint32_t dynamicStorageBufferCount; |
| PerStage<PerStageBindingCounts> perStage; |
| }; |
| |
| void IncrementBindingCounts(BindingCounts* bindingCounts, const BindGroupLayoutEntry& entry); |
| void AccumulateBindingCounts(BindingCounts* bindingCounts, const BindingCounts& rhs); |
| MaybeError ValidateBindingCounts(const BindingCounts& bindingCounts); |
| |
| // For buffer size validation |
| using RequiredBufferSizes = ityp::array<BindGroupIndex, std::vector<uint64_t>, kMaxBindGroups>; |
| |
| } // namespace dawn::native |
| |
| #endif // DAWNNATIVE_BINDINGINFO_H_ |