| 3232 | } |
| 3233 | |
| 3234 | static void TestVirtualBlocks() |
| 3235 | { |
| 3236 | wprintf(L"Test virtual blocks\n"); |
| 3237 | |
| 3238 | const VkDeviceSize blockSize = 16 * MEGABYTE; |
| 3239 | const VkDeviceSize alignment = 256; |
| 3240 | VkDeviceSize offset; |
| 3241 | |
| 3242 | // # Create block 16 MB |
| 3243 | |
| 3244 | VmaVirtualBlockCreateInfo blockCreateInfo = {}; |
| 3245 | blockCreateInfo.pAllocationCallbacks = g_Allocs; |
| 3246 | blockCreateInfo.size = blockSize; |
| 3247 | VmaVirtualBlock block; |
| 3248 | TEST(vmaCreateVirtualBlock(&blockCreateInfo, &block) == VK_SUCCESS && block); |
| 3249 | |
| 3250 | // # Allocate 8 MB (also fetch offset from the allocation) |
| 3251 | |
| 3252 | VmaVirtualAllocationCreateInfo allocCreateInfo = {}; |
| 3253 | allocCreateInfo.alignment = alignment; |
| 3254 | allocCreateInfo.pUserData = (void*)(uintptr_t)1; |
| 3255 | allocCreateInfo.size = 8 * MEGABYTE; |
| 3256 | VmaVirtualAllocation allocation0 = VK_NULL_HANDLE; |
| 3257 | TEST(vmaVirtualAllocate(block, &allocCreateInfo, &allocation0, &offset) == VK_SUCCESS); |
| 3258 | TEST(allocation0 != VK_NULL_HANDLE); |
| 3259 | |
| 3260 | // # Validate the allocation |
| 3261 | |
| 3262 | VmaVirtualAllocationInfo allocInfo0 = {}; |
| 3263 | vmaGetVirtualAllocationInfo(block, allocation0, &allocInfo0); |
| 3264 | TEST(allocInfo0.offset < blockSize); |
| 3265 | TEST(allocInfo0.offset == offset); |
| 3266 | TEST(allocInfo0.size == allocCreateInfo.size); |
| 3267 | TEST(allocInfo0.pUserData == allocCreateInfo.pUserData); |
| 3268 | |
| 3269 | // # Check SetUserData |
| 3270 | |
| 3271 | vmaSetVirtualAllocationUserData(block, allocation0, (void*)(uintptr_t)2); |
| 3272 | vmaGetVirtualAllocationInfo(block, allocation0, &allocInfo0); |
| 3273 | TEST(allocInfo0.pUserData == (void*)(uintptr_t)2); |
| 3274 | |
| 3275 | // # Allocate 4 MB (also test passing null as pOffset during allocation) |
| 3276 | |
| 3277 | allocCreateInfo.size = 4 * MEGABYTE; |
| 3278 | VmaVirtualAllocation allocation1 = VK_NULL_HANDLE; |
| 3279 | TEST(vmaVirtualAllocate(block, &allocCreateInfo, &allocation1, nullptr) == VK_SUCCESS); |
| 3280 | TEST(allocation1 != VK_NULL_HANDLE); |
| 3281 | VmaVirtualAllocationInfo allocInfo1 = {}; |
| 3282 | vmaGetVirtualAllocationInfo(block, allocation1, &allocInfo1); |
| 3283 | TEST(allocInfo1.offset < blockSize); |
| 3284 | TEST(allocInfo1.offset + 4 * MEGABYTE <= allocInfo0.offset || allocInfo0.offset + 8 * MEGABYTE <= allocInfo1.offset); // Check if they don't overlap. |
| 3285 | |
| 3286 | // # Allocate another 8 MB - it should fail |
| 3287 | |
| 3288 | allocCreateInfo.size = 8 * MEGABYTE; |
| 3289 | VmaVirtualAllocation allocation2 = VK_NULL_HANDLE; |
| 3290 | TEST(vmaVirtualAllocate(block, &allocCreateInfo, &allocation2, &offset) < 0); |
| 3291 | TEST(allocation2 == VK_NULL_HANDLE); |
no test coverage detected