diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-05-10 22:12:35 -0400 |
---|---|---|
committer | ReinUsesLisp <reinuseslisp@airmail.cc> | 2019-06-20 21:36:12 -0300 |
commit | 94f2be5473182789ec3f6388b43fcd708a505500 (patch) | |
tree | 449c07c6f2ca05db69b720543bac5124e6ba7940 /src/common/bit_util.h | |
parent | a4a58be2d46e95df4cead2916b6efbd658a0deaa (diff) |
texture_cache: Optimize GetMipBlockHeight and GetMipBlockDepth
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 d032df4131..6f7d5a9479 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 |