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();