Reviewed-by: Juan A. Suarez Romero <jasua...@igalia.com>
On Tue, 2017-04-11 at 11:11 -0700, Jason Ekstrand wrote: > 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" <jasua...@igalia.com> > --- > 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, _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev