diff --git a/src/dxvk/dxvk_image.cpp b/src/dxvk/dxvk_image.cpp index 7cf9af1b7..bc7bc5446 100644 --- a/src/dxvk/dxvk_image.cpp +++ b/src/dxvk/dxvk_image.cpp @@ -268,7 +268,7 @@ namespace dxvk { uint16_t mipMask = ((1u << subresources.levelCount) - 1u) << subresources.baseMipLevel; for (uint32_t i = subresources.baseArrayLayer; i < subresources.baseArrayLayer + subresources.layerCount; i++) { - m_uninitializedSubresourceCount -= bit::popcnt(m_uninitializedMipsPerLayer[i] & mipMask); + m_uninitializedSubresourceCount -= bit::popcnt(uint16_t(m_uninitializedMipsPerLayer[i] & mipMask)); m_uninitializedMipsPerLayer[i] &= ~mipMask; } diff --git a/src/util/util_bit.h b/src/util/util_bit.h index 9775e99bc..586ce83c9 100644 --- a/src/util/util_bit.h +++ b/src/util/util_bit.h @@ -54,19 +54,15 @@ namespace dxvk::bit { return (value >> fst) & ~(~T(0) << (lst - fst + 1)); } - inline uint32_t popcntStep(uint32_t n, uint32_t mask, uint32_t shift) { - return (n & mask) + ((n & ~mask) >> shift); + template + T popcnt(T n) { + n -= ((n >> 1u) & T(0x5555555555555555ull)); + n = (n & T(0x3333333333333333ull)) + ((n >> 2u) & T(0x3333333333333333ull)); + n = (n + (n >> 4u)) & T(0x0f0f0f0f0f0f0f0full); + n *= T(0x0101010101010101ull); + return n >> (8u * (sizeof(T) - 1u)); } - - inline uint32_t popcnt(uint32_t n) { - n = popcntStep(n, 0x55555555, 1); - n = popcntStep(n, 0x33333333, 2); - n = popcntStep(n, 0x0F0F0F0F, 4); - n = popcntStep(n, 0x00FF00FF, 8); - n = popcntStep(n, 0x0000FFFF, 16); - return n; - } - + inline uint32_t tzcnt(uint32_t n) { #if defined(_MSC_VER) && !defined(__clang__) return _tzcnt_u32(n);