|
36 | 36 | # define USE_CRT_MALLOC_DBG 1 |
37 | 37 | #endif |
38 | 38 |
|
| 39 | +#if PLATFORM_ANDROID && __ANDROID_API__ < 28 |
| 40 | +# define USE_ALIGNED_MALLOC_FALLBACK 1 |
| 41 | +#endif |
| 42 | + |
39 | 43 | namespace Diligent |
40 | 44 | { |
41 | 45 |
|
| 46 | +#ifdef USE_ALIGNED_MALLOC_FALLBACK |
| 47 | +namespace |
| 48 | +{ |
| 49 | +void* AllocateAlignedFallback(size_t Size, size_t Alignment) |
| 50 | +{ |
| 51 | + constexpr size_t PointerSize = sizeof(void*); |
| 52 | + const size_t AdjustedAlignment = (std::max)(Alignment, PointerSize); |
| 53 | + |
| 54 | + void* Pointer = malloc(Size + AdjustedAlignment + PointerSize); |
| 55 | + void* AlignedPointer = AlignUp(reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(Pointer) + PointerSize), AdjustedAlignment); |
| 56 | + |
| 57 | + void** StoredPointer = reinterpret_cast<void**>(AlignedPointer) - 1; |
| 58 | + VERIFY_EXPR(StoredPointer >= Pointer); |
| 59 | + *StoredPointer = Pointer; |
| 60 | + |
| 61 | + return AlignedPointer; |
| 62 | +} |
| 63 | + |
| 64 | +void FreeAlignedFallback(void* Ptr) |
| 65 | +{ |
| 66 | + if (Ptr != nullptr) |
| 67 | + { |
| 68 | + void* OriginalPointer = *(reinterpret_cast<void**>(Ptr) - 1); |
| 69 | + free(OriginalPointer); |
| 70 | + } |
| 71 | +} |
| 72 | +} // namespace |
| 73 | +#endif |
| 74 | + |
42 | 75 | DefaultRawMemoryAllocator::DefaultRawMemoryAllocator() |
43 | 76 | { |
44 | 77 | } |
@@ -71,6 +104,9 @@ void DefaultRawMemoryAllocator::Free(void* Ptr) |
71 | 104 | #elif defined(_MSC_VER) || defined(__MINGW64__) || defined(__MINGW32__) |
72 | 105 | # define ALIGNED_MALLOC(Size, Alignment, dbgFileName, dbgLineNumber) _aligned_malloc(Size, Alignment) |
73 | 106 | # define ALIGNED_FREE(Ptr) _aligned_free(Ptr) |
| 107 | +#elif defined(USE_ALIGNED_MALLOC_FALLBACK) |
| 108 | +# define ALIGNED_MALLOC(Size, Alignment, dbgFileName, dbgLineNumber) AllocateAlignedFallback(Size, Alignment) |
| 109 | +# define ALIGNED_FREE(Ptr) FreeAlignedFallback(Ptr) |
74 | 110 | #else |
75 | 111 | # define ALIGNED_MALLOC(Size, Alignment, dbgFileName, dbgLineNumber) aligned_alloc(Alignment, Size) |
76 | 112 | # define ALIGNED_FREE(Ptr) free(Ptr) |
|
0 commit comments