1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-01 08:52:11 +01:00

[dxvk] Add utility function to clear large regions of memory

This commit is contained in:
Philip Rebohle 2024-10-27 00:37:43 +02:00 committed by Philip Rebohle
parent d535e2964f
commit e9574a4155

View File

@ -183,6 +183,37 @@ namespace dxvk::bit {
return shift > Bits ? shift - Bits : 0;
}
/**
* \brief Clears cache lines of memory
*
* Uses non-temporal stores. The memory region offset
* and size are assumed to be aligned to 64 bytes.
* \param [in] mem Memory region to clear
* \param [in] size Number of bytes to clear
*/
inline void bclear(void* mem, size_t size) {
#if defined(DXVK_ARCH_X86) && (defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER))
auto zero = _mm_setzero_si128();
#if defined(__clang__)
#pragma nounroll
#elif defined(__GNUC__)
#pragma GCC unroll 0
#endif
for (size_t i = 0; i < size; i += 64u) {
auto* ptr = reinterpret_cast<__m128i*>(mem) + i / sizeof(zero);
_mm_stream_si128(ptr + 0u, zero);
_mm_stream_si128(ptr + 1u, zero);
_mm_stream_si128(ptr + 2u, zero);
_mm_stream_si128(ptr + 3u, zero);
}
#else
std::memset(mem, 0, size);
#endif
}
/**
* \brief Compares two aligned structs bit by bit
*