From 7b560e5ffaf3504b590db69309bd8290125920e4 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Fri, 28 Nov 2025 23:04:30 +0300 Subject: [PATCH] rsx: Clean up aligned realloc implementation --- rpcs3/Emu/RSX/Common/simple_array.hpp | 8 +++---- rpcs3/tests/test_simple_array.cpp | 31 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/rpcs3/Emu/RSX/Common/simple_array.hpp b/rpcs3/Emu/RSX/Common/simple_array.hpp index dda8cb5b3a..4f8d2a5100 100644 --- a/rpcs3/Emu/RSX/Common/simple_array.hpp +++ b/rpcs3/Emu/RSX/Common/simple_array.hpp @@ -24,12 +24,12 @@ namespace rsx template void* realloc(void* prev_ptr, [[maybe_unused]] size_t prev_size, size_t new_size) { - ensure(reinterpret_cast(prev_ptr) % Align == 0, - "Pointer not aligned to Align"); - if (prev_size >= ((new_size + Align - 1) & (0 - Align))) + if (prev_size >= new_size) { - return prev_ptr; + return prev_ptr; } + + ensure(reinterpret_cast(prev_ptr) % Align == 0, "Pointer not aligned to Align"); #ifdef _WIN32 return _aligned_realloc(prev_ptr, new_size, Align); #else diff --git a/rpcs3/tests/test_simple_array.cpp b/rpcs3/tests/test_simple_array.cpp index 0627c1d4d1..05bba60f4a 100644 --- a/rpcs3/tests/test_simple_array.cpp +++ b/rpcs3/tests/test_simple_array.cpp @@ -323,4 +323,35 @@ namespace rsx EXPECT_EQ(*arr.find_if(FN(x == 8)), 8); EXPECT_EQ(arr.find_if(FN(x == 99)), nullptr); } + + TEST(AlignedAllocator, Alloc) + { + auto ptr = rsx::aligned_allocator::malloc<256>(16); + const auto ptr_value = reinterpret_cast(ptr); + rsx::aligned_allocator::free(ptr); + + EXPECT_NE(ptr_value, 0); + EXPECT_EQ(ptr_value % 256, 0); + } + + TEST(AlignedAllocator, Realloc) + { + auto ptr = rsx::aligned_allocator::malloc<256>(16); + auto ptr2 = rsx::aligned_allocator::realloc<256>(ptr, 16, 32); + const auto ptr_value = reinterpret_cast(ptr2); + rsx::aligned_allocator::free(ptr2); + + EXPECT_NE(ptr, ptr2); + EXPECT_NE(ptr_value, 0); + EXPECT_EQ(ptr_value % 256, 0); + } + + TEST(AlignedAllocator, Realloc_ReturnsPreviousPointerIfFits) + { + auto ptr = rsx::aligned_allocator::malloc<256>(16); + auto ptr2 = rsx::aligned_allocator::realloc<256>(ptr, 16, 8); + rsx::aligned_allocator::free(ptr2); + + EXPECT_EQ(ptr, ptr2); + } }