From 39bb51ab274a37e3647641e48073b85f0f92577c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Roberto=20de=20Souza?= Date: Wed, 19 Feb 2025 09:24:37 -0800 Subject: [PATCH] anv: Add support for batch buffers in anv_slab_bo in Xe KMD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Because of the ANV_BO_ALLOC_CAPTURE flag, batch buffers were not allowed to use memory pool. So to workaround that here adding a new anv_bo_slab_heap heap for cached+coherent+capture buffers with the main goal to get batch buffer to memory pool but other buffers will as well. For now that will only work in Xe KMD as i915 requires more changes to support it. Reviewed-by: Lionel Landwerlin Signed-off-by: José Roberto de Souza Part-of: --- src/intel/vulkan/anv_device.c | 9 ++------- src/intel/vulkan/anv_private.h | 9 +++++++++ src/intel/vulkan/anv_slab_bo.c | 10 ++++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index c6c07e35414..a50eb957f15 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -75,10 +75,7 @@ static VkResult anv_device_init_trivial_batch(struct anv_device *device) { VkResult result = anv_device_alloc_bo(device, "trivial-batch", 4096, - ANV_BO_ALLOC_MAPPED | - ANV_BO_ALLOC_HOST_COHERENT | - ANV_BO_ALLOC_INTERNAL | - ANV_BO_ALLOC_CAPTURE, + ANV_BO_ALLOC_BATCH_BUFFER_INTERNAL_FLAGS, 0 /* explicit_address */, &device->trivial_batch_bo); ANV_DMR_BO_ALLOC(&device->vk.base, device->trivial_batch_bo, result); @@ -519,9 +516,7 @@ VkResult anv_CreateDevice( goto fail_queue_cond; anv_bo_pool_init(&device->batch_bo_pool, device, "batch", - ANV_BO_ALLOC_MAPPED | - ANV_BO_ALLOC_HOST_CACHED_COHERENT | - ANV_BO_ALLOC_CAPTURE); + ANV_BO_ALLOC_BATCH_BUFFER_FLAGS); if (device->vk.enabled_extensions.KHR_acceleration_structure) { anv_bo_pool_init(&device->bvh_bo_pool, device, "bvh build", 0 /* alloc_flags */); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 3d8e458a1f6..7c3270a4df6 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -475,6 +475,15 @@ enum anv_bo_alloc_flags { ANV_BO_ALLOC_HOST_CACHED_COHERENT | \ ANV_BO_ALLOC_DESCRIPTOR_POOL) +#define ANV_BO_ALLOC_BATCH_BUFFER_FLAGS (ANV_BO_ALLOC_MAPPED | \ + ANV_BO_ALLOC_HOST_CACHED_COHERENT | \ + ANV_BO_ALLOC_CAPTURE) + +#define ANV_BO_ALLOC_BATCH_BUFFER_INTERNAL_FLAGS (ANV_BO_ALLOC_MAPPED | \ + ANV_BO_ALLOC_HOST_COHERENT | \ + ANV_BO_ALLOC_INTERNAL | \ + ANV_BO_ALLOC_CAPTURE) + struct anv_bo { const char *name; diff --git a/src/intel/vulkan/anv_slab_bo.c b/src/intel/vulkan/anv_slab_bo.c index 07b9cdf9f07..b39ca70a3c0 100644 --- a/src/intel/vulkan/anv_slab_bo.c +++ b/src/intel/vulkan/anv_slab_bo.c @@ -5,6 +5,7 @@ #include "anv_slab_bo.h" enum anv_bo_slab_heap { + ANV_BO_SLAB_HEAP_CACHED_COHERENT_CAPTURE, /* main usage is batch buffers but other buffers also matches */ ANV_BO_SLAB_HEAP_DYNAMIC_VISIBLE_POOL, ANV_BO_SLAB_HEAP_DESCRIPTOR_POOL, ANV_BO_SLAB_HEAP_SMEM_CACHED_COHERENT, @@ -48,6 +49,12 @@ anv_bo_alloc_flags_to_slab_heap(struct anv_device *device, ANV_BO_ALLOC_IMPLICIT_WRITE); } + /* TODO: add i915 support */ + if ((alloc_flags == ANV_BO_ALLOC_BATCH_BUFFER_FLAGS || + alloc_flags == ANV_BO_ALLOC_BATCH_BUFFER_INTERNAL_FLAGS) && + (device->info->kmd_type == INTEL_KMD_TYPE_XE)) + return ANV_BO_SLAB_HEAP_CACHED_COHERENT_CAPTURE; + if (alloc_flags == ANV_BO_ALLOC_DYNAMIC_VISIBLE_POOL_FLAGS) return ANV_BO_SLAB_HEAP_DYNAMIC_VISIBLE_POOL; @@ -233,6 +240,9 @@ anv_slab_alloc(void *priv, break; case ANV_BO_SLAB_HEAP_LMEM_ONLY: break; + case ANV_BO_SLAB_HEAP_CACHED_COHERENT_CAPTURE: + alloc_flags |= ANV_BO_ALLOC_BATCH_BUFFER_FLAGS; + break; case ANV_BO_SLAB_HEAP_DYNAMIC_VISIBLE_POOL: alloc_flags |= ANV_BO_ALLOC_DYNAMIC_VISIBLE_POOL_FLAGS; break;