panvk: Keep tiler_heap and sample_positions BOs at the panvk_device level

We wrap panfrost_device's BOs with a panvk_priv_bo object and store
the result in panvk_device. This way we'll be able to transition to
explicit BO allocation without changing BO users code.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Constantine Shablya <constantine.shablya@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26698>
This commit is contained in:
Boris Brezillon
2023-12-11 17:52:01 +01:00
committed by Marge Bot
parent c05104c71f
commit ab6a61829c
5 changed files with 40 additions and 12 deletions

View File

@@ -899,6 +899,25 @@ struct panvk_priv_bo *panvk_priv_bo_create(struct panvk_device *dev,
return priv_bo;
}
static struct panvk_priv_bo *
panvk_priv_bo_from_pan_bo(struct panvk_device *dev, struct panfrost_bo *bo,
const struct VkAllocationCallbacks *alloc,
VkSystemAllocationScope scope)
{
struct panvk_priv_bo *priv_bo =
vk_zalloc2(&dev->vk.alloc, alloc, sizeof(*priv_bo), 8, scope);
if (!priv_bo)
return NULL;
panfrost_bo_reference(bo);
priv_bo->bo = bo->kmod_bo;
priv_bo->dev = dev;
priv_bo->addr.host = bo->ptr.cpu;
priv_bo->addr.dev = bo->ptr.gpu;
return priv_bo;
}
void
panvk_priv_bo_destroy(struct panvk_priv_bo *priv_bo,
const VkAllocationCallbacks *alloc)
@@ -993,6 +1012,12 @@ panvk_CreateDevice(VkPhysicalDevice physicalDevice,
&device->pdev);
device->kmod.dev = device->pdev.kmod.dev;
device->kmod.vm = device->pdev.kmod.vm;
device->tiler_heap = panvk_priv_bo_from_pan_bo(
device, device->pdev.tiler_heap, &device->vk.alloc,
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
device->sample_positions = panvk_priv_bo_from_pan_bo(
device, device->pdev.sample_positions, &device->vk.alloc,
VK_SYSTEM_ALLOCATION_SCOPE_DEVICE);
vk_device_set_drm_fd(&device->vk, device->pdev.kmod.dev->fd);
panvk_arch_dispatch(arch, meta_init, device);
@@ -1038,6 +1063,8 @@ fail:
panvk_arch_dispatch(pan_arch(physical_device->kmod.props.gpu_prod_id),
meta_cleanup, device);
panvk_priv_bo_destroy(device->tiler_heap, &device->vk.alloc);
panvk_priv_bo_destroy(device->sample_positions, &device->vk.alloc);
panfrost_close_device(&device->pdev);
vk_free(&device->vk.alloc, device);
@@ -1062,6 +1089,8 @@ panvk_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator)
panvk_arch_dispatch(pan_arch(physical_device->kmod.props.gpu_prod_id),
meta_cleanup, device);
panvk_priv_bo_destroy(device->tiler_heap, &device->vk.alloc);
panvk_priv_bo_destroy(device->sample_positions, &device->vk.alloc);
panfrost_close_device(&device->pdev);
vk_free(&device->vk.alloc, device);
}

View File

@@ -279,6 +279,9 @@ struct panvk_device {
struct pan_kmod_dev *dev;
} kmod;
struct panvk_priv_bo *tiler_heap;
struct panvk_priv_bo *sample_positions;
struct panfrost_device pdev;
struct panvk_meta meta;

View File

@@ -142,9 +142,7 @@ panvk_per_arch(cmd_close_batch)(struct panvk_cmd_buffer *cmdbuf)
GENX(pan_emit_tls)(&batch->tlsinfo, batch->tls.cpu);
if (batch->fb.desc.cpu) {
struct panfrost_device *pdev = &cmdbuf->device->pdev;
fbinfo->sample_positions = pdev->sample_positions->ptr.gpu +
fbinfo->sample_positions = cmdbuf->device->sample_positions->addr.dev +
panfrost_sample_positions_offset(
pan_sample_pattern(fbinfo->nr_samples));

View File

@@ -827,13 +827,11 @@ panvk_per_arch(emit_tiler_context)(const struct panvk_device *dev,
unsigned width, unsigned height,
const struct panfrost_ptr *descs)
{
const struct panfrost_device *pdev = &dev->pdev;
pan_pack(descs->cpu + pan_size(TILER_CONTEXT), TILER_HEAP, cfg) {
cfg.size = panfrost_bo_size(pdev->tiler_heap);
cfg.base = pdev->tiler_heap->ptr.gpu;
cfg.bottom = pdev->tiler_heap->ptr.gpu;
cfg.top = pdev->tiler_heap->ptr.gpu + panfrost_bo_size(pdev->tiler_heap);
cfg.size = pan_kmod_bo_size(dev->tiler_heap->bo);
cfg.base = dev->tiler_heap->addr.dev;
cfg.bottom = dev->tiler_heap->addr.dev;
cfg.top = cfg.base + cfg.size;
}
pan_pack(descs->cpu, TILER_CONTEXT, cfg) {

View File

@@ -204,7 +204,7 @@ panvk_per_arch(queue_submit)(struct vk_queue *vk_queue,
struct vk_queue_submit *submit)
{
struct panvk_queue *queue = container_of(vk_queue, struct panvk_queue, vk);
const struct panfrost_device *pdev = &queue->device->pdev;
struct panvk_device *dev = queue->device;
unsigned nr_semaphores = submit->wait_count + 1;
uint32_t semaphores[nr_semaphores];
@@ -261,9 +261,9 @@ panvk_per_arch(queue_submit)(struct vk_queue *vk_queue,
bos[bo_idx++] = pan_kmod_bo_handle(batch->blit.dst);
if (batch->jc.first_tiler)
bos[bo_idx++] = panfrost_bo_handle(pdev->tiler_heap);
bos[bo_idx++] = pan_kmod_bo_handle(dev->tiler_heap->bo);
bos[bo_idx++] = panfrost_bo_handle(pdev->sample_positions);
bos[bo_idx++] = pan_kmod_bo_handle(dev->sample_positions->bo);
assert(bo_idx == nr_bos);
/* Merge identical BO entries. */