mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-10-18 16:05:11 +00:00
WebGPU currently allows as many as 108 view descriptors per bind group. This is too many to have one descriptor allocator per size, so we need to bucket them by size. Bug: dawn:443, dawn:488 Change-Id: I4fc8cf7cd0dc8292bb6a8488fd2ceb7575e1e5f7 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/24787 Reviewed-by: Austin Eng <enga@chromium.org> Reviewed-by: Bryan Bernhart <bryan.bernhart@intel.com> Commit-Queue: Austin Eng <enga@chromium.org>
86 lines
2.5 KiB
C++
86 lines
2.5 KiB
C++
// Copyright 2017 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 COMMON_MATH_H_
|
|
#define COMMON_MATH_H_
|
|
|
|
#include "common/Assert.h"
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
|
|
#include <limits>
|
|
#include <type_traits>
|
|
|
|
// The following are not valid for 0
|
|
uint32_t ScanForward(uint32_t bits);
|
|
uint32_t Log2(uint32_t value);
|
|
uint32_t Log2(uint64_t value);
|
|
bool IsPowerOfTwo(uint64_t n);
|
|
uint64_t RoundUp(uint64_t n, uint64_t m);
|
|
|
|
constexpr uint32_t ConstexprLog2(uint64_t v) {
|
|
return v <= 1 ? 0 : 1 + ConstexprLog2(v / 2);
|
|
}
|
|
|
|
constexpr uint32_t ConstexprLog2Ceil(uint64_t v) {
|
|
return v <= 1 ? 0 : ConstexprLog2(v - 1) + 1;
|
|
}
|
|
|
|
inline uint32_t Log2Ceil(uint32_t v) {
|
|
return v <= 1 ? 0 : Log2(v - 1) + 1;
|
|
}
|
|
|
|
inline uint32_t Log2Ceil(uint64_t v) {
|
|
return v <= 1 ? 0 : Log2(v - 1) + 1;
|
|
}
|
|
|
|
uint64_t NextPowerOfTwo(uint64_t n);
|
|
bool IsPtrAligned(const void* ptr, size_t alignment);
|
|
void* AlignVoidPtr(void* ptr, size_t alignment);
|
|
bool IsAligned(uint32_t value, size_t alignment);
|
|
uint32_t Align(uint32_t value, size_t alignment);
|
|
|
|
template <typename T>
|
|
DAWN_FORCE_INLINE T* AlignPtr(T* ptr, size_t alignment) {
|
|
ASSERT(IsPowerOfTwo(alignment));
|
|
ASSERT(alignment != 0);
|
|
return reinterpret_cast<T*>((reinterpret_cast<size_t>(ptr) + (alignment - 1)) &
|
|
~(alignment - 1));
|
|
}
|
|
|
|
template <typename T>
|
|
DAWN_FORCE_INLINE const T* AlignPtr(const T* ptr, size_t alignment) {
|
|
ASSERT(IsPowerOfTwo(alignment));
|
|
ASSERT(alignment != 0);
|
|
return reinterpret_cast<const T*>((reinterpret_cast<size_t>(ptr) + (alignment - 1)) &
|
|
~(alignment - 1));
|
|
}
|
|
|
|
template <typename destType, typename sourceType>
|
|
destType BitCast(const sourceType& source) {
|
|
static_assert(sizeof(destType) == sizeof(sourceType), "BitCast: cannot lose precision.");
|
|
destType output;
|
|
std::memcpy(&output, &source, sizeof(destType));
|
|
return output;
|
|
}
|
|
|
|
uint16_t Float32ToFloat16(float fp32);
|
|
bool IsFloat16NaN(uint16_t fp16);
|
|
|
|
float SRGBToLinear(float srgb);
|
|
|
|
#endif // COMMON_MATH_H_
|