| /* |
| * 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 |