| 3380 | } |
| 3381 | |
| 3382 | static void TestVirtualBlocksAlgorithms() |
| 3383 | { |
| 3384 | wprintf(L"Test virtual blocks algorithms\n"); |
| 3385 | |
| 3386 | RandomNumberGenerator rand{3454335}; |
| 3387 | auto calcRandomAllocSize = [&rand]() -> VkDeviceSize { return rand.Generate() % 20 + 5; }; |
| 3388 | |
| 3389 | for(size_t algorithmIndex = 0; algorithmIndex < 2; ++algorithmIndex) |
| 3390 | { |
| 3391 | // Create the block |
| 3392 | VmaVirtualBlockCreateInfo blockCreateInfo = {}; |
| 3393 | blockCreateInfo.pAllocationCallbacks = g_Allocs; |
| 3394 | blockCreateInfo.size = 10'000; |
| 3395 | switch(algorithmIndex) |
| 3396 | { |
| 3397 | case 1: blockCreateInfo.flags = VMA_VIRTUAL_BLOCK_CREATE_LINEAR_ALGORITHM_BIT; break; |
| 3398 | } |
| 3399 | VmaVirtualBlock block = nullptr; |
| 3400 | VkResult res = vmaCreateVirtualBlock(&blockCreateInfo, &block); |
| 3401 | TEST(res == VK_SUCCESS); |
| 3402 | |
| 3403 | struct AllocData |
| 3404 | { |
| 3405 | VmaVirtualAllocation allocation; |
| 3406 | VkDeviceSize allocOffset, requestedSize, allocationSize; |
| 3407 | }; |
| 3408 | std::vector<AllocData> allocations; |
| 3409 | |
| 3410 | // Test too large allocation |
| 3411 | { |
| 3412 | VmaVirtualAllocationCreateInfo allocCreateInfo = {}; |
| 3413 | allocCreateInfo.size = blockCreateInfo.size * 2; |
| 3414 | VmaVirtualAllocation alloc; |
| 3415 | TEST(vmaVirtualAllocate(block, &allocCreateInfo, &alloc, nullptr) < 0); |
| 3416 | } |
| 3417 | |
| 3418 | // Make some allocations |
| 3419 | for(size_t i = 0; i < 20; ++i) |
| 3420 | { |
| 3421 | VmaVirtualAllocationCreateInfo allocCreateInfo = {}; |
| 3422 | allocCreateInfo.size = calcRandomAllocSize(); |
| 3423 | allocCreateInfo.pUserData = (void*)(uintptr_t)(allocCreateInfo.size * 10); |
| 3424 | if(i < 10) { } |
| 3425 | else if(i < 12) allocCreateInfo.flags = VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT; |
| 3426 | else if(i < 14) allocCreateInfo.flags = VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_TIME_BIT; |
| 3427 | else if(i < 16) allocCreateInfo.flags = VMA_VIRTUAL_ALLOCATION_CREATE_STRATEGY_MIN_MEMORY_BIT; |
| 3428 | else if(i < 18 && algorithmIndex == 1) allocCreateInfo.flags = VMA_VIRTUAL_ALLOCATION_CREATE_UPPER_ADDRESS_BIT; |
| 3429 | |
| 3430 | AllocData alloc = {}; |
| 3431 | alloc.requestedSize = allocCreateInfo.size; |
| 3432 | res = vmaVirtualAllocate(block, &allocCreateInfo, &alloc.allocation, nullptr); |
| 3433 | TEST(res == VK_SUCCESS); |
| 3434 | |
| 3435 | VmaVirtualAllocationInfo allocInfo; |
| 3436 | vmaGetVirtualAllocationInfo(block, alloc.allocation, &allocInfo); |
| 3437 | TEST(allocInfo.size >= allocCreateInfo.size); |
| 3438 | alloc.allocOffset = allocInfo.offset; |
| 3439 | alloc.allocationSize = allocInfo.size; |
no test coverage detected