anv: Limit VkDeviceMemory objects to 2GB
authorJason Ekstrand <jason.ekstrand@intel.com>
Tue, 11 Apr 2017 15:33:19 +0000 (08:33 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 14 Apr 2017 20:35:02 +0000 (13:35 -0700)
Reviewed-by: Juan A. Suarez Romero <jasuarez@igalia.com>
src/intel/vulkan/anv_device.c

index 35ef4c486b2b8f8a45723307e6bee0c6c29415b6..ee9c48fa73e9536de2c05f2ef6c969a92bced881 100644 (file)
@@ -1539,6 +1539,26 @@ VkResult anv_AllocateMemory(
    assert(pAllocateInfo->memoryTypeIndex == 0 ||
           (!device->info.has_llc && pAllocateInfo->memoryTypeIndex < 2));
 
+   /* The kernel relocation API has a limitation of a 32-bit delta value
+    * applied to the address before it is written which, in spite of it being
+    * unsigned, is treated as signed .  Because of the way that this maps to
+    * the Vulkan API, we cannot handle an offset into a buffer that does not
+    * fit into a signed 32 bits.  The only mechanism we have for dealing with
+    * this at the moment is to limit all VkDeviceMemory objects to a maximum
+    * of 2GB each.  The Vulkan spec allows us to do this:
+    *
+    *    "Some platforms may have a limit on the maximum size of a single
+    *    allocation. For example, certain systems may fail to create
+    *    allocations with a size greater than or equal to 4GB. Such a limit is
+    *    implementation-dependent, and if such a failure occurs then the error
+    *    VK_ERROR_OUT_OF_DEVICE_MEMORY should be returned."
+    *
+    * We don't use vk_error here because it's not an error so much as an
+    * indication to the application that the allocation is too large.
+    */
+   if (pAllocateInfo->allocationSize > (1ull << 31))
+      return VK_ERROR_OUT_OF_DEVICE_MEMORY;
+
    /* FINISHME: Fail if allocation request exceeds heap size. */
 
    mem = vk_alloc2(&device->alloc, pAllocator, sizeof(*mem), 8,