Skip to content

Commit 54f13c8

Browse files
authored
Restore Android SDK 21 support (#630)
1 parent 39d2dab commit 54f13c8

File tree

1 file changed

+36
-0
lines changed

1 file changed

+36
-0
lines changed

Common/src/DefaultRawMemoryAllocator.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,42 @@
3636
# define USE_CRT_MALLOC_DBG 1
3737
#endif
3838

39+
#if PLATFORM_ANDROID && __ANDROID_API__ < 28
40+
# define USE_ALIGNED_MALLOC_FALLBACK 1
41+
#endif
42+
3943
namespace Diligent
4044
{
4145

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+
4275
DefaultRawMemoryAllocator::DefaultRawMemoryAllocator()
4376
{
4477
}
@@ -71,6 +104,9 @@ void DefaultRawMemoryAllocator::Free(void* Ptr)
71104
#elif defined(_MSC_VER) || defined(__MINGW64__) || defined(__MINGW32__)
72105
# define ALIGNED_MALLOC(Size, Alignment, dbgFileName, dbgLineNumber) _aligned_malloc(Size, Alignment)
73106
# 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)
74110
#else
75111
# define ALIGNED_MALLOC(Size, Alignment, dbgFileName, dbgLineNumber) aligned_alloc(Alignment, Size)
76112
# define ALIGNED_FREE(Ptr) free(Ptr)

0 commit comments

Comments
 (0)