From dffb8669a94ad0705cd41b043798fa4fa45bce07 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Tue, 11 Apr 2017 08:33:19 -0700 Subject: [PATCH] anv: Limit VkDeviceMemory objects to 2GB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit v2 (Jason Ekstrand): - Limit to 2GB instead of 4GB v3 (Jason Ekstrand): - Fix the build by using pAllocateInfo instead of pAllocationInfo (not sure how that happened). - Return vK_ERROR_OUT_OF_DEVICE_MEMORY (Thanks Ilia!) Cc: "Juan A. Suárez" --- src/intel/vulkan/anv_device.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 35ef4c4..ee9c48f 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -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, -- 2.5.0.400.gff86faf