Merge branch 'master' into update_avail

This commit is contained in:
Megamouse 2025-12-03 14:33:19 +01:00 committed by GitHub
commit 0114683aa3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

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;