panvk: Add the concept of private BO

Those are all the BOs that are allocated for internal use (descriptor
allocation, mostly). Such BOs get allocated and immediately mapped in
CPU and GPU VMs.

The new panvk_priv_bo abstraction uses a pan_kmod_bo as we're trying
to get away from panfrost_bo in panvk.

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 14:17:26 +01:00
committed by Marge Bot
parent 9672ddcc3a
commit 78e5bc1ee5
2 changed files with 72 additions and 0 deletions

View File

@@ -862,6 +862,58 @@ panvk_queue_finish(struct panvk_queue *queue)
vk_queue_finish(&queue->vk);
}
struct panvk_priv_bo *panvk_priv_bo_create(struct panvk_device *dev,
size_t size, uint32_t flags,
const struct VkAllocationCallbacks *alloc,
VkSystemAllocationScope scope)
{
struct panfrost_device *pdev = &dev->pdev;
uint32_t conv_flags = 0;
if (flags & PAN_KMOD_BO_FLAG_EXECUTABLE)
conv_flags |= PAN_BO_EXECUTE;
if (flags & PAN_KMOD_BO_FLAG_NO_MMAP)
conv_flags |= PAN_BO_INVISIBLE;
if (flags & PAN_KMOD_BO_FLAG_ALLOC_ON_FAULT)
conv_flags |= PAN_BO_GROWABLE;
struct panvk_priv_bo *priv_bo =
vk_zalloc2(&dev->vk.alloc, alloc, sizeof(*priv_bo), 8, scope);
if (!priv_bo)
return NULL;
struct panfrost_bo *bo =
panfrost_bo_create(pdev, size, conv_flags, "Private BO");
if (!bo) {
vk_free2(&dev->vk.alloc, alloc, priv_bo);
return NULL;
}
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)
{
if (!priv_bo)
return;
struct panvk_device *dev = priv_bo->dev;
struct panfrost_device *pdev = &dev->pdev;
struct panfrost_bo *bo = panfrost_bo_from_kmod_bo(pdev, priv_bo->bo);
panfrost_bo_unreference(bo);
vk_free2(&dev->vk.alloc, alloc, priv_bo);
}
VkResult
panvk_CreateDevice(VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo *pCreateInfo,

View File

@@ -117,6 +117,26 @@ typedef uint32_t xcb_window_t;
#define panvk_stub() assert(!"stub")
struct panvk_device;
/* Used for internal object allocation. */
struct panvk_priv_bo {
struct panvk_device *dev;
struct pan_kmod_bo *bo;
struct {
mali_ptr dev;
void *host;
} addr;
};
struct panvk_priv_bo *panvk_priv_bo_create(struct panvk_device *dev,
size_t size, uint32_t flags,
const VkAllocationCallbacks *alloc,
VkSystemAllocationScope scope);
void panvk_priv_bo_destroy(struct panvk_priv_bo *bo,
const VkAllocationCallbacks *alloc);
#define PANVK_META_COPY_BUF2IMG_NUM_FORMATS 12
#define PANVK_META_COPY_IMG2BUF_NUM_FORMATS 12
#define PANVK_META_COPY_IMG2IMG_NUM_FORMATS 14