diff options
author | Lionel Landwerlin <lionel.g.landwerlin@intel.com> | 2019-12-10 03:49:49 -0800 |
---|---|---|
committer | Dylan Baker <dylan@pnwbakers.com> | 2019-12-12 09:22:54 -0800 |
commit | ce856a73926650642eebd94086181c1d6723fdf6 (patch) | |
tree | 94fc308085d82c7f47613392a3cdbdef1b59f2ce | |
parent | 3a58a73661ffac7d4cff458dd017d74d3cf588d3 (diff) |
anv: fix incorrect VMA alignment for CCS main surfaces
Maybe finer way of dealing with this requirement would be to increase
the number of pdevice->memory.types[] to add a category for special
alignment cases.
Meanwhile this fixes the problem of CCS surface alignment and it's
probably not going to cause issues given the size of our address
space.
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Fixes: 6af8a4acc4a4 ("anv: Add aux-map translation for gen12+")
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
(cherry picked from commit 5fdea9f40182002899fc941bfb8c3f36ed5366a1)
-rw-r--r-- | src/intel/vulkan/anv_device.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 9947a72e787..af9ad0a2939 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -3000,6 +3000,14 @@ VkResult anv_DeviceWaitIdle( bool anv_vma_alloc(struct anv_device *device, struct anv_bo *bo) { + 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)) return true; @@ -3009,7 +3017,8 @@ anv_vma_alloc(struct anv_device *device, struct anv_bo *bo) if (bo->flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS && device->vma_hi_available >= bo->size) { - 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)); @@ -3018,7 +3027,8 @@ anv_vma_alloc(struct anv_device *device, struct anv_bo *bo) } if (bo->offset == 0 && device->vma_lo_available >= bo->size) { - 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)); |