diff --git a/Source/Engine/Platform/Base/PlatformBase.h b/Source/Engine/Platform/Base/PlatformBase.h index d2d34c88f..7c200172d 100644 --- a/Source/Engine/Platform/Base/PlatformBase.h +++ b/Source/Engine/Platform/Base/PlatformBase.h @@ -316,6 +316,25 @@ public: /// A pointer to the memory block to deallocate. static void Free(void* ptr) = delete; + /// + /// Returns the OS's default page size that can be used with AllocatePages. + /// + static uint64 GetDefaultPageSize() = delete; + + /// + /// Allocates pages memory block. + /// + /// The number of pages to allocate. + /// The size of single page. Use GetDefaultPageSize() or provide compatible, custom size. + /// The pointer to the allocated pages in memory. + static void* AllocatePages(uint64 numPages, uint64 pageSize) = delete; + + /// + /// Frees allocated pages memory block. + /// + /// The pointer to the pages to deallocate. + static void FreePages(void* ptr) = delete; + public: /// diff --git a/Source/Engine/Platform/Unix/UnixPlatform.cpp b/Source/Engine/Platform/Unix/UnixPlatform.cpp index 42b788649..6255e3588 100644 --- a/Source/Engine/Platform/Unix/UnixPlatform.cpp +++ b/Source/Engine/Platform/Unix/UnixPlatform.cpp @@ -51,6 +51,25 @@ void UnixPlatform::Free(void* ptr) } } +uint64 Win32Platform::GetDefaultPageSize() +{ + return 16; +} + +void* Win32Platform::AllocatePages(uint64 numPages, uint64 pageSize) +{ + const uint64 numBytes = numPages * pageSize; + + // Fallback to malloc + return malloc(numBytes); +} + +void Win32Platform::FreePages(void* ptr) +{ + // Fallback to free + free(ptr); +} + uint64 UnixPlatform::GetCurrentProcessId() { return getpid(); diff --git a/Source/Engine/Platform/Unix/UnixPlatform.h b/Source/Engine/Platform/Unix/UnixPlatform.h index e0041c604..9996e3d7e 100644 --- a/Source/Engine/Platform/Unix/UnixPlatform.h +++ b/Source/Engine/Platform/Unix/UnixPlatform.h @@ -16,6 +16,9 @@ public: // [PlatformBase] static void* Allocate(uint64 size, uint64 alignment); static void Free(void* ptr); + static uint64 GetDefaultPageSize(); + static void* AllocatePages(uint64 numPages, uint64 pageSize); + static void FreePages(void* ptr); static uint64 GetCurrentProcessId(); }; diff --git a/Source/Engine/Platform/Win32/Win32Platform.cpp b/Source/Engine/Platform/Win32/Win32Platform.cpp index b01b96feb..39d52a64c 100644 --- a/Source/Engine/Platform/Win32/Win32Platform.cpp +++ b/Source/Engine/Platform/Win32/Win32Platform.cpp @@ -298,6 +298,29 @@ void Win32Platform::AtomicStore(int64 volatile* dst, int64 value) InterlockedExchange64(dst, value); } +uint64 Win32Platform::GetDefaultPageSize() +{ + SYSTEM_INFO systemInfo; + GetSystemInfo(&systemInfo); + + // Return the page size obtained from system + return systemInfo.dwPageSize; +} + +void* Win32Platform::AllocatePages(uint64 numPages, uint64 pageSize) +{ + const uint64 numBytes = numPages * pageSize; + + // Use VirtualAlloc to allocate page-aligned memory + return VirtualAlloc(nullptr, numBytes, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); +} + +void Win32Platform::FreePages(void* ptr) +{ + // Free page-aligned memory + VirtualFree(ptr, 0, MEM_RELEASE); +} + bool Win32Platform::Is64BitPlatform() { #ifdef PLATFORM_64BITS diff --git a/Source/Engine/Platform/Win32/Win32Platform.h b/Source/Engine/Platform/Win32/Win32Platform.h index cde506278..a1930fad8 100644 --- a/Source/Engine/Platform/Win32/Win32Platform.h +++ b/Source/Engine/Platform/Win32/Win32Platform.h @@ -43,6 +43,9 @@ public: { _aligned_free(ptr); } + static uint64 GetDefaultPageSize(); + static void* AllocatePages(uint64 numPages, uint64 pageSize); + static void FreePages(void* ptr); static bool Is64BitPlatform(); static BatteryInfo GetBatteryInfo(); static CPUInfo GetCPUInfo();