diff options
author | Jason Ekstrand <jason.ekstrand@intel.com> | 2017-05-17 12:32:00 -0700 |
---|---|---|
committer | Jason Ekstrand <jason.ekstrand@intel.com> | 2017-05-17 12:32:00 -0700 |
commit | 1e1be2451b0757902ecd2405ade0c0186a952b2a (patch) | |
tree | 925b68376c89b103a4ea9ee75fba687d4aac7b4e /src | |
parent | 5434da8a316d5432bb0ed54441c06e24d8880581 (diff) |
qonos: Select a memory type if the client doesn't ask for one
Diffstat (limited to 'src')
-rw-r--r-- | src/qonos/qonos.c | 41 |
1 files changed, 29 insertions, 12 deletions
diff --git a/src/qonos/qonos.c b/src/qonos/qonos.c index 88d500b..3839752 100644 --- a/src/qonos/qonos.c +++ b/src/qonos/qonos.c @@ -141,38 +141,55 @@ __qoAllocMemory(VkDevice dev, const VkMemoryAllocateInfo *info) VkDeviceMemory __qoAllocMemoryFromRequirements(VkDevice dev, const VkMemoryRequirements *mem_reqs, - const VkMemoryAllocateInfo *override_info) + const QoMemoryAllocateFromRequirementsInfo *info) { - VkMemoryAllocateInfo info = *override_info; + VkMemoryAllocateInfo alloc_info = { + .sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, + .allocationSize = info->allocationSize, + .memoryTypeIndex = info->memoryTypeIndex, + }; - if (info.allocationSize == 0) - info.allocationSize = mem_reqs->size; + if (alloc_info.allocationSize == 0) + alloc_info.allocationSize = mem_reqs->size; + + t_assert(alloc_info.allocationSize >= mem_reqs->size); + + if (alloc_info.memoryTypeIndex == QO_MEMORY_TYPE_INDEX_INVALID) { + const VkPhysicalDeviceMemoryProperties *props = t_physical_dev_mem_props; + for (uint32_t i = 0; i < props->memoryTypeCount; i++) { + const VkMemoryType *type = &props->memoryTypes[i]; + if ((mem_reqs->memoryTypeBits & (1 << i)) && + (type->propertyFlags & info->properties) == info->properties) { + alloc_info.memoryTypeIndex = i; + break; + } + } + } - t_assert(info.allocationSize >= mem_reqs->size); - t_assert(info.memoryTypeIndex != QO_MEMORY_TYPE_INDEX_INVALID); - t_assert((1 << info.memoryTypeIndex) & mem_reqs->memoryTypeBits); + t_assert(alloc_info.memoryTypeIndex != QO_MEMORY_TYPE_INDEX_INVALID); + t_assert((1 << alloc_info.memoryTypeIndex) & mem_reqs->memoryTypeBits); - return __qoAllocMemory(dev, &info); + return __qoAllocMemory(dev, &alloc_info); } VkDeviceMemory __qoAllocBufferMemory(VkDevice dev, VkBuffer buffer, - const VkMemoryAllocateInfo *override_info) + const QoMemoryAllocateFromRequirementsInfo *info) { VkMemoryRequirements mem_reqs = qoGetBufferMemoryRequirements(dev, buffer); - return __qoAllocMemoryFromRequirements(dev, &mem_reqs, override_info); + return __qoAllocMemoryFromRequirements(dev, &mem_reqs, info); } VkDeviceMemory __qoAllocImageMemory(VkDevice dev, VkImage image, - const VkMemoryAllocateInfo *override_info) + const QoMemoryAllocateFromRequirementsInfo *info) { VkMemoryRequirements mem_reqs = qoGetImageMemoryRequirements(dev, image); - return __qoAllocMemoryFromRequirements(dev, &mem_reqs, override_info); + return __qoAllocMemoryFromRequirements(dev, &mem_reqs, info); } void * |