diff --git a/src/broadcom/vulkan/v3dv_device.c b/src/broadcom/vulkan/v3dv_device.c index 459500bf151..821aff205fd 100644 --- a/src/broadcom/vulkan/v3dv_device.c +++ b/src/broadcom/vulkan/v3dv_device.c @@ -2208,9 +2208,13 @@ v3dv_AllocateMemory(VkDevice _device, assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); /* We always allocate device memory in multiples of a page, so round up - * requested size to that. + * requested size to that. We need to add a V3D_TFU_READHAEAD padding to + * avoid invalid reads done by the TFU unit after the end of the last page + * allocated. */ - const VkDeviceSize alloc_size = align64(pAllocateInfo->allocationSize, 4096); + + const VkDeviceSize alloc_size = align64(pAllocateInfo->allocationSize + + V3D_TFU_READAHEAD_SIZE, 4096); if (unlikely(alloc_size > MAX_MEMORY_ALLOCATION_SIZE)) return vk_error(device, VK_ERROR_OUT_OF_DEVICE_MEMORY); diff --git a/src/broadcom/vulkan/v3dv_private.h b/src/broadcom/vulkan/v3dv_private.h index 94cb7841dad..45bc2c989b6 100644 --- a/src/broadcom/vulkan/v3dv_private.h +++ b/src/broadcom/vulkan/v3dv_private.h @@ -591,6 +591,11 @@ struct v3dv_device { struct util_dynarray device_address_bo_list; /* Array of struct v3dv_bo * */ }; +/* TFU has readhead of 64 bytes. So to avoid the unit reading unmaped memory + * it is needed to overallocate buffers that could be read by the TFU + */ +#define V3D_TFU_READAHEAD_SIZE 64 + struct v3dv_device_memory { struct vk_device_memory vk;