diff --git a/rpcs3/Emu/RSX/Common/simple_array.hpp b/rpcs3/Emu/RSX/Common/simple_array.hpp index 4f8d2a5100..00dd6e7d95 100644 --- a/rpcs3/Emu/RSX/Common/simple_array.hpp +++ b/rpcs3/Emu/RSX/Common/simple_array.hpp @@ -12,28 +12,45 @@ namespace rsx namespace aligned_allocator { template + requires (Align != 0) && ((Align & (Align - 1)) == 0) + size_t align_up(size_t size) + { + return (size + (Align - 1)) & ~(Align - 1); + } + + template + requires (Align != 0) && ((Align & (Align - 1)) == 0) void* malloc(size_t size) { -#ifdef _WIN32 +#if defined(_WIN32) return _aligned_malloc(size, Align); +#elif defined(__APPLE__) + constexpr size_t NativeAlign = std::max(Align, sizeof(void*)); + return std::aligned_alloc(NativeAlign, align_up(size)); #else - return std::aligned_alloc(Align, size); + return std::aligned_alloc(Align, align_up(size)); #endif } template + requires (Align != 0) && ((Align & (Align - 1)) == 0) void* realloc(void* prev_ptr, [[maybe_unused]] size_t prev_size, size_t new_size) { - if (prev_size >= new_size) + if (align_up(prev_size) >= new_size) { return prev_ptr; } ensure(reinterpret_cast(prev_ptr) % Align == 0, "Pointer not aligned to Align"); -#ifdef _WIN32 +#if defined(_WIN32) return _aligned_realloc(prev_ptr, new_size, Align); #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(new_size)); +#else + void* ret = std::aligned_alloc(Align, align_up(new_size)); +#endif std::memcpy(ret, prev_ptr, std::min(prev_size, new_size)); std::free(prev_ptr); return ret;