diff options
author | Zach Hilman <DarkLordZach@users.noreply.github.com> | 2019-07-05 13:39:13 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-05 13:39:13 -0400 |
commit | 772c86a260eb446b0fe4232b0a50666511bef25c (patch) | |
tree | 013d92268c06454c93565c83eff2b79b56a00839 /src/common/bit_util.h | |
parent | 3f3a93f13b70959b6ba57b22bf8851b5c88929d4 (diff) | |
parent | 3b9d89839dc62e9e63a3cbe9636cf85276babdfb (diff) |
Merge pull request #2601 from FernandoS27/texture_cache
Implement a new Texture Cache
Diffstat (limited to 'src/common/bit_util.h')
-rw-r--r-- | src/common/bit_util.h | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/common/bit_util.h b/src/common/bit_util.h index d032df413..6f7d5a947 100644 --- a/src/common/bit_util.h +++ b/src/common/bit_util.h @@ -97,4 +97,48 @@ inline u32 CountTrailingZeroes64(u64 value) { } #endif +#ifdef _MSC_VER + +inline u32 MostSignificantBit32(const u32 value) { + unsigned long result; + _BitScanReverse(&result, value); + return static_cast<u32>(result); +} + +inline u32 MostSignificantBit64(const u64 value) { + unsigned long result; + _BitScanReverse64(&result, value); + return static_cast<u32>(result); +} + +#else + +inline u32 MostSignificantBit32(const u32 value) { + return 31U - static_cast<u32>(__builtin_clz(value)); +} + +inline u32 MostSignificantBit64(const u64 value) { + return 63U - static_cast<u32>(__builtin_clzll(value)); +} + +#endif + +inline u32 Log2Floor32(const u32 value) { + return MostSignificantBit32(value); +} + +inline u32 Log2Ceil32(const u32 value) { + const u32 log2_f = Log2Floor32(value); + return log2_f + ((value ^ (1U << log2_f)) != 0U); +} + +inline u32 Log2Floor64(const u64 value) { + return MostSignificantBit64(value); +} + +inline u32 Log2Ceil64(const u64 value) { + const u64 log2_f = static_cast<u64>(Log2Floor64(value)); + return static_cast<u32>(log2_f + ((value ^ (1ULL << log2_f)) != 0ULL)); +} + } // namespace Common |