summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJason Ekstrand <jason.ekstrand@intel.com>2017-05-17 12:32:00 -0700
committerJason Ekstrand <jason.ekstrand@intel.com>2017-05-17 12:32:00 -0700
commit1e1be2451b0757902ecd2405ade0c0186a952b2a (patch)
tree925b68376c89b103a4ea9ee75fba687d4aac7b4e /src
parent5434da8a316d5432bb0ed54441c06e24d8880581 (diff)
qonos: Select a memory type if the client doesn't ask for one
Diffstat (limited to 'src')
-rw-r--r--src/qonos/qonos.c41
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 *