| 3120 | } |
| 3121 | |
| 3122 | static void TestMemoryRequirements() |
| 3123 | { |
| 3124 | VkResult res; |
| 3125 | VkBuffer buf; |
| 3126 | VmaAllocation alloc; |
| 3127 | VmaAllocationInfo allocInfo; |
| 3128 | |
| 3129 | const VkPhysicalDeviceMemoryProperties* memProps; |
| 3130 | vmaGetMemoryProperties(g_hAllocator, &memProps); |
| 3131 | |
| 3132 | VkBufferCreateInfo bufInfo = { VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO }; |
| 3133 | bufInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT; |
| 3134 | bufInfo.size = 128; |
| 3135 | |
| 3136 | VmaAllocationCreateInfo allocCreateInfo = {}; |
| 3137 | |
| 3138 | // No requirements. |
| 3139 | res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo); |
| 3140 | TEST(res == VK_SUCCESS); |
| 3141 | vmaDestroyBuffer(g_hAllocator, buf, alloc); |
| 3142 | |
| 3143 | // Usage = auto + host access. |
| 3144 | allocCreateInfo.usage = VMA_MEMORY_USAGE_AUTO; |
| 3145 | allocCreateInfo.flags = VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT; |
| 3146 | allocCreateInfo.requiredFlags = 0; |
| 3147 | allocCreateInfo.preferredFlags = 0; |
| 3148 | allocCreateInfo.memoryTypeBits = UINT32_MAX; |
| 3149 | |
| 3150 | res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo); |
| 3151 | TEST(res == VK_SUCCESS); |
| 3152 | TEST(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); |
| 3153 | vmaDestroyBuffer(g_hAllocator, buf, alloc); |
| 3154 | |
| 3155 | // Required flags, preferred flags. |
| 3156 | allocCreateInfo.usage = VMA_MEMORY_USAGE_UNKNOWN; |
| 3157 | allocCreateInfo.flags = 0; |
| 3158 | allocCreateInfo.requiredFlags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT; |
| 3159 | allocCreateInfo.preferredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT; |
| 3160 | allocCreateInfo.memoryTypeBits = 0; |
| 3161 | |
| 3162 | res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo); |
| 3163 | TEST(res == VK_SUCCESS); |
| 3164 | TEST(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT); |
| 3165 | TEST(memProps->memoryTypes[allocInfo.memoryType].propertyFlags & VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); |
| 3166 | vmaDestroyBuffer(g_hAllocator, buf, alloc); |
| 3167 | |
| 3168 | // memoryTypeBits. |
| 3169 | const uint32_t memType = allocInfo.memoryType; |
| 3170 | allocCreateInfo.usage = VMA_MEMORY_USAGE_UNKNOWN; |
| 3171 | allocCreateInfo.flags = 0; |
| 3172 | allocCreateInfo.requiredFlags = 0; |
| 3173 | allocCreateInfo.preferredFlags = 0; |
| 3174 | allocCreateInfo.memoryTypeBits = 1u << memType; |
| 3175 | |
| 3176 | res = vmaCreateBuffer(g_hAllocator, &bufInfo, &allocCreateInfo, &buf, &alloc, &allocInfo); |
| 3177 | TEST(res == VK_SUCCESS); |
| 3178 | TEST(allocInfo.memoryType == memType); |
| 3179 | vmaDestroyBuffer(g_hAllocator, buf, alloc); |
no test coverage detected