blob: ddca52b1638c4d9ed16bda4cbd1d39c9eb7a7a9f [file] [log] [blame]
/*
* Copyright © 2021 Collabora Ltd.
* SPDX-License-Identifier: MIT
*/
#ifndef PANVK_DEVICE_H
#define PANVK_DEVICE_H
#include <stdint.h>
#include "vk_device.h"
#include "vk_meta.h"
#include "panvk_blend.h"
#include "panvk_instance.h"
#include "panvk_macros.h"
#include "panvk_mempool.h"
#include "panvk_meta.h"
#include "panvk_physical_device.h"
#include "panvk_utrace_perfetto.h"
#include "kmod/pan_kmod.h"
#include "util/pan_ir.h"
#include "util/perf/u_trace.h"
#include "util/vma.h"
#define PANVK_MAX_QUEUE_FAMILIES 1
struct panvk_device {
struct vk_device vk;
struct {
simple_mtx_t lock;
struct util_vma_heap heap;
} as;
struct {
struct pan_kmod_vm *vm;
struct pan_kmod_dev *dev;
struct pan_kmod_allocator allocator;
} kmod;
struct panvk_priv_bo *tiler_heap;
struct panvk_priv_bo *sample_positions;
struct {
struct panvk_priv_bo *handlers_bo;
uint32_t handler_stride;
uint32_t dump_region_size;
} tiler_oom;
struct vk_meta_device meta;
struct {
struct panvk_pool rw;
struct panvk_pool rw_nc;
struct panvk_pool exec;
} mempools;
struct vk_device_dispatch_table cmd_dispatch;
struct panvk_queue *queues[PANVK_MAX_QUEUE_FAMILIES];
int queue_count[PANVK_MAX_QUEUE_FAMILIES];
struct {
struct u_trace_context utctx;
#ifdef HAVE_PERFETTO
struct panvk_utrace_perfetto utp;
#endif
} utrace;
struct {
struct pandecode_context *decode_ctx;
} debug;
};
VK_DEFINE_HANDLE_CASTS(panvk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
static inline struct panvk_device *
to_panvk_device(struct vk_device *dev)
{
return container_of(dev, struct panvk_device, vk);
}
static inline uint32_t
panvk_device_adjust_bo_flags(const struct panvk_device *device,
uint32_t bo_flags)
{
struct panvk_instance *instance =
to_panvk_instance(device->vk.physical->instance);
if (instance->debug_flags & (PANVK_DEBUG_DUMP | PANVK_DEBUG_TRACE))
bo_flags &= ~PAN_KMOD_BO_FLAG_NO_MMAP;
return bo_flags;
}
#if PAN_ARCH
VkResult
panvk_per_arch(create_device)(struct panvk_physical_device *physical_device,
const VkDeviceCreateInfo *pCreateInfo,
const VkAllocationCallbacks *pAllocator,
VkDevice *pDevice);
void panvk_per_arch(destroy_device)(struct panvk_device *device,
const VkAllocationCallbacks *pAllocator);
#if PAN_ARCH >= 10
VkResult panvk_per_arch(device_check_status)(struct vk_device *vk_dev);
VkResult panvk_per_arch(init_tiler_oom)(struct panvk_device *device);
#endif
#endif
#endif