anv/device: Only allocate whole pages in AllocateMemory
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 2 Jan 2016 15:52:22 +0000 (07:52 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 2 Jan 2016 15:52:24 +0000 (07:52 -0800)
The kernel is going to give us whole pages anyway, so allocating part of a
page doesn't help.  And this ensures that we can always work with whole
pages.

src/vulkan/anv_device.c
src/vulkan/anv_private.h

index 9a56d9b7de0f3fa31f3a53d122ae6af899167f8b..c070aaf2125567dad872b4aefc65d7d08756c877 100644 (file)
@@ -1020,7 +1020,10 @@ VkResult anv_AllocateMemory(
    if (mem == NULL)
       return vk_error(VK_ERROR_OUT_OF_HOST_MEMORY);
 
-   result = anv_bo_init_new(&mem->bo, device, pAllocateInfo->allocationSize);
+   /* The kernel is going to give us whole pages anyway */
+   uint64_t alloc_size = align_u64(pAllocateInfo->allocationSize, 4096);
+
+   result = anv_bo_init_new(&mem->bo, device, alloc_size);
    if (result != VK_SUCCESS)
       goto fail;
 
@@ -1088,7 +1091,7 @@ VkResult anv_MapMemory(
    uint64_t map_size = (offset + size) - map_offset;
 
    /* Let's map whole pages */
-   map_size = (map_size + 4095) & ~4095ull;
+   map_size = align_u64(map_size, 4096);
 
    mem->map = anv_gem_mmap(device, mem->bo.gem_handle,
                            map_offset, map_size, gem_flags);
index 44d537ac5a86f7de6a542a8d40cd41869ff8bc4d..cc9e139c034d0dd7987f9f5e026c40b5cbd18609 100644 (file)
@@ -86,6 +86,12 @@ align_u32(uint32_t v, uint32_t a)
    return (v + a - 1) & ~(a - 1);
 }
 
+static inline uint64_t
+align_u64(uint64_t v, uint64_t a)
+{
+   return (v + a - 1) & ~(a - 1);
+}
+
 static inline int32_t
 align_i32(int32_t v, int32_t a)
 {