More implementation and first tests.
Crashing for now - need more refactoring.
This commit is contained in:
parent
7acc6c0ca8
commit
54b7eccc35
2 changed files with 219 additions and 46 deletions
125
src/Tests.cpp
125
src/Tests.cpp
|
@ -31,6 +31,7 @@
|
|||
#ifdef _WIN32
|
||||
|
||||
static const char* CODE_DESCRIPTION = "Foo";
|
||||
static constexpr VkDeviceSize MEGABYTE = 1024 * 1024;
|
||||
|
||||
extern VkCommandBuffer g_hTemporaryCommandBuffer;
|
||||
extern const VkAllocationCallbacks* g_Allocs;
|
||||
|
@ -2686,6 +2687,126 @@ static void TestBasics()
|
|||
TestInvalidAllocations();
|
||||
}
|
||||
|
||||
static void TestVirtualBlocks()
|
||||
{
|
||||
wprintf(L"Test virtual blocks\n");
|
||||
|
||||
const VkDeviceSize blockSize = 16 * MEGABYTE;
|
||||
const VkDeviceSize alignment = 256;
|
||||
|
||||
// # Create block 16 MB
|
||||
|
||||
VmaVirtualBlockCreateInfo blockCreateInfo = {};
|
||||
blockCreateInfo.pAllocationCallbacks = g_Allocs;
|
||||
blockCreateInfo.size = blockSize;
|
||||
VmaVirtualBlock block;
|
||||
TEST(vmaCreateVirtualBlock(&blockCreateInfo, &block) == VK_SUCCESS && block);
|
||||
|
||||
// # Allocate 8 MB
|
||||
|
||||
VmaVirtualAllocationCreateInfo allocCreateInfo = {};
|
||||
allocCreateInfo.alignment = alignment;
|
||||
allocCreateInfo.pUserData = (void*)(uintptr_t)1;
|
||||
allocCreateInfo.size = 8 * MEGABYTE;
|
||||
VkDeviceSize alloc0Offset;
|
||||
TEST(vmaVirtualAllocate(block, &allocCreateInfo, &alloc0Offset) == VK_SUCCESS && alloc0Offset < blockSize);
|
||||
|
||||
#if 0
|
||||
// # Validate the allocation
|
||||
|
||||
VIRTUAL_ALLOCATION_INFO allocInfo = {};
|
||||
block->GetAllocationInfo(alloc0Offset, &allocInfo);
|
||||
CHECK_BOOL( allocInfo.size == allocDesc.Size );
|
||||
CHECK_BOOL( allocInfo.pUserData == allocDesc.pUserData );
|
||||
|
||||
// # Check SetUserData
|
||||
|
||||
block->SetAllocationUserData(alloc0Offset, (void*)(uintptr_t)2);
|
||||
block->GetAllocationInfo(alloc0Offset, &allocInfo);
|
||||
CHECK_BOOL( allocInfo.pUserData == (void*)(uintptr_t)2 );
|
||||
|
||||
// # Allocate 4 MB
|
||||
|
||||
allocDesc.Size = 4 * MEGABYTE;
|
||||
allocDesc.Alignment = alignment;
|
||||
UINT64 alloc1Offset;
|
||||
CHECK_HR( block->Allocate(&allocDesc, &alloc1Offset) );
|
||||
CHECK_BOOL( alloc1Offset < blockSize );
|
||||
CHECK_BOOL( alloc1Offset + 4 * MEGABYTE <= alloc0Offset || alloc0Offset + 8 * MEGABYTE <= alloc1Offset ); // Check if they don't overlap.
|
||||
|
||||
// # Allocate another 8 MB - it should fail
|
||||
|
||||
allocDesc.Size = 8 * MEGABYTE;
|
||||
allocDesc.Alignment = alignment;
|
||||
UINT64 alloc2Offset;
|
||||
CHECK_BOOL( FAILED(block->Allocate(&allocDesc, &alloc2Offset)) );
|
||||
CHECK_BOOL( alloc2Offset == UINT64_MAX );
|
||||
|
||||
// # Free the 4 MB block. Now allocation of 8 MB should succeed.
|
||||
|
||||
block->FreeAllocation(alloc1Offset);
|
||||
CHECK_HR( block->Allocate(&allocDesc, &alloc2Offset) );
|
||||
CHECK_BOOL( alloc2Offset < blockSize );
|
||||
CHECK_BOOL( alloc2Offset + 4 * MEGABYTE <= alloc0Offset || alloc0Offset + 8 * MEGABYTE <= alloc2Offset ); // Check if they don't overlap.
|
||||
|
||||
// # Calculate statistics
|
||||
|
||||
StatInfo statInfo = {};
|
||||
block->CalculateStats(&statInfo);
|
||||
CHECK_BOOL(statInfo.AllocationCount == 2);
|
||||
CHECK_BOOL(statInfo.BlockCount == 1);
|
||||
CHECK_BOOL(statInfo.UsedBytes == blockSize);
|
||||
CHECK_BOOL(statInfo.UnusedBytes + statInfo.UsedBytes == blockSize);
|
||||
|
||||
// # Generate JSON dump
|
||||
|
||||
WCHAR* json = nullptr;
|
||||
block->BuildStatsString(&json);
|
||||
{
|
||||
std::wstring str(json);
|
||||
CHECK_BOOL( str.find(L"\"UserData\": 1") != std::wstring::npos );
|
||||
CHECK_BOOL( str.find(L"\"UserData\": 2") != std::wstring::npos );
|
||||
}
|
||||
block->FreeStatsString(json);
|
||||
#endif
|
||||
|
||||
// # Free alloc0, leave alloc2 unfreed.
|
||||
|
||||
vmaVirtualFree(block, alloc0Offset);
|
||||
|
||||
#if 0
|
||||
// # Test alignment
|
||||
|
||||
{
|
||||
constexpr size_t allocCount = 10;
|
||||
UINT64 allocOffset[allocCount] = {};
|
||||
for(size_t i = 0; i < allocCount; ++i)
|
||||
{
|
||||
const bool alignment0 = i == allocCount - 1;
|
||||
allocDesc.Size = i * 3 + 15;
|
||||
allocDesc.Alignment = alignment0 ? 0 : 8;
|
||||
CHECK_HR(block->Allocate(&allocDesc, &allocOffset[i]));
|
||||
if(!alignment0)
|
||||
{
|
||||
CHECK_BOOL(allocOffset[i] % allocDesc.Alignment == 0);
|
||||
}
|
||||
}
|
||||
|
||||
for(size_t i = allocCount; i--; )
|
||||
{
|
||||
block->FreeAllocation(allocOffset[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// # Final cleanup
|
||||
|
||||
block->FreeAllocation(alloc2Offset);
|
||||
#endif
|
||||
|
||||
//vmaClearVirtualBlock(block);
|
||||
vmaDestroyVirtualBlock(block);
|
||||
}
|
||||
|
||||
static void TestAllocationVersusResourceSize()
|
||||
{
|
||||
wprintf(L"Test allocation versus resource size\n");
|
||||
|
@ -6561,16 +6682,18 @@ void Test()
|
|||
{
|
||||
wprintf(L"TESTING:\n");
|
||||
|
||||
if(false)
|
||||
if(true)
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// Temporarily insert custom tests here:
|
||||
TestVirtualBlocks();
|
||||
return;
|
||||
}
|
||||
|
||||
// # Simple tests
|
||||
|
||||
TestBasics();
|
||||
TestVirtualBlocks();
|
||||
TestAllocationVersusResourceSize();
|
||||
//TestGpuData(); // Not calling this because it's just testing the testing environment.
|
||||
#if VMA_DEBUG_MARGIN
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue