rsx/common - work around macos posix_memalign quirks

This commit is contained in:
kd-11 2025-12-03 02:25:17 +03:00 committed by kd-11
parent b86b4d15c6
commit 8ec8252ea7

View file

@ -12,28 +12,45 @@ namespace rsx
namespace aligned_allocator namespace aligned_allocator
{ {
template <size_t Align> template <size_t Align>
requires (Align != 0) && ((Align & (Align - 1)) == 0)
size_t align_up(size_t size)
{
return (size + (Align - 1)) & ~(Align - 1);
}
template <size_t Align>
requires (Align != 0) && ((Align & (Align - 1)) == 0)
void* malloc(size_t size) void* malloc(size_t size)
{ {
#ifdef _WIN32 #if defined(_WIN32)
return _aligned_malloc(size, Align); return _aligned_malloc(size, Align);
#elif defined(__APPLE__)
constexpr size_t NativeAlign = std::max(Align, sizeof(void*));
return std::aligned_alloc(NativeAlign, align_up<NativeAlign>(size));
#else #else
return std::aligned_alloc(Align, size); return std::aligned_alloc(Align, align_up<Align>(size));
#endif #endif
} }
template <size_t Align> template <size_t Align>
requires (Align != 0) && ((Align & (Align - 1)) == 0)
void* realloc(void* prev_ptr, [[maybe_unused]] size_t prev_size, size_t new_size) void* realloc(void* prev_ptr, [[maybe_unused]] size_t prev_size, size_t new_size)
{ {
if (prev_size >= new_size) if (align_up<Align>(prev_size) >= new_size)
{ {
return prev_ptr; return prev_ptr;
} }
ensure(reinterpret_cast<usz>(prev_ptr) % Align == 0, "Pointer not aligned to Align"); ensure(reinterpret_cast<usz>(prev_ptr) % Align == 0, "Pointer not aligned to Align");
#ifdef _WIN32 #if defined(_WIN32)
return _aligned_realloc(prev_ptr, new_size, Align); return _aligned_realloc(prev_ptr, new_size, Align);
#else #else
void* ret = std::aligned_alloc(Align, new_size); #if defined(__APPLE__)
constexpr size_t NativeAlign = std::max(Align, sizeof(void*));
void* ret = std::aligned_alloc(NativeAlign, align_up<NativeAlign>(new_size));
#else
void* ret = std::aligned_alloc(Align, align_up<Align>(new_size));
#endif
std::memcpy(ret, prev_ptr, std::min(prev_size, new_size)); std::memcpy(ret, prev_ptr, std::min(prev_size, new_size));
std::free(prev_ptr); std::free(prev_ptr);
return ret; return ret;