X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fintel%2Fvulkan%2Fanv_device.c;h=ca71cc6d24522ee07e40b86f9c94f5b4d08d36d1;hb=5fdea9f40182002899fc941bfb8c3f36ed5366a1;hp=027a908f8e7d36d9d3adfb778e3063e6673a3e51;hpb=ccb7d606f1a2939d5a784f1ec491cffc62e8f814;p=mesa.git diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 027a908f8e7..ca71cc6d245 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -2972,6 +2972,14 @@ bool anv_vma_alloc(struct anv_device *device, struct anv_bo *bo, uint64_t client_address) { + const struct anv_physical_device *pdevice = &device->instance->physicalDevice; + const struct gen_device_info *devinfo = &pdevice->info; + /* Gen12 CCS surface addresses need to be 64K aligned. We have no way of + * telling what this allocation is for so pick the largest alignment. + */ + const uint32_t vma_alignment = + devinfo->gen >= 12 ? (64 * 1024) : (4 * 1024); + if (!(bo->flags & EXEC_OBJECT_PINNED)) { assert(!(bo->has_client_visible_address)); return true; @@ -2989,7 +2997,8 @@ anv_vma_alloc(struct anv_device *device, struct anv_bo *bo, bo->offset = gen_canonical_address(client_address); } } else { - uint64_t addr = util_vma_heap_alloc(&device->vma_cva, bo->size, 4096); + uint64_t addr = + util_vma_heap_alloc(&device->vma_cva, bo->size, vma_alignment); if (addr) { bo->offset = gen_canonical_address(addr); assert(addr == gen_48b_address(bo->offset)); @@ -3002,7 +3011,8 @@ anv_vma_alloc(struct anv_device *device, struct anv_bo *bo, assert(client_address == 0); if (bo->flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS) { - uint64_t addr = util_vma_heap_alloc(&device->vma_hi, bo->size, 4096); + uint64_t addr = + util_vma_heap_alloc(&device->vma_hi, bo->size, vma_alignment); if (addr) { bo->offset = gen_canonical_address(addr); assert(addr == gen_48b_address(bo->offset)); @@ -3010,7 +3020,8 @@ anv_vma_alloc(struct anv_device *device, struct anv_bo *bo, } if (bo->offset == 0) { - uint64_t addr = util_vma_heap_alloc(&device->vma_lo, bo->size, 4096); + uint64_t addr = + util_vma_heap_alloc(&device->vma_lo, bo->size, vma_alignment); if (addr) { bo->offset = gen_canonical_address(addr); assert(addr == gen_48b_address(bo->offset)); @@ -3912,8 +3923,17 @@ VkResult anv_CreateBuffer( VkBuffer* pBuffer) { ANV_FROM_HANDLE(anv_device, device, _device); + struct anv_physical_device *pdevice = &device->instance->physicalDevice; struct anv_buffer *buffer; + /* Don't allow creating buffers bigger than our address space. The real + * issue here is that we may align up the buffer size and we don't want + * doing so to cause roll-over. However, no one has any business + * allocating a buffer larger than our GTT size. + */ + if (pCreateInfo->size > pdevice->gtt_size) + return vk_error(VK_ERROR_OUT_OF_DEVICE_MEMORY); + assert(pCreateInfo->sType == VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO); buffer = vk_alloc2(&device->alloc, pAllocator, sizeof(*buffer), 8,