blob: ddca52b1638c4d9ed16bda4cbd1d39c9eb7a7a9f [file] [log] [blame]
Boris Brezillon8157f512023-12-21 10:57:15 +01001/*
2 * Copyright © 2021 Collabora Ltd.
3 * SPDX-License-Identifier: MIT
4 */
5
6#ifndef PANVK_DEVICE_H
7#define PANVK_DEVICE_H
8
9#include <stdint.h>
10
11#include "vk_device.h"
Boris Brezillon50679212024-04-29 10:21:28 +020012#include "vk_meta.h"
Boris Brezillon8157f512023-12-21 10:57:15 +010013
Boris Brezillon6724ee72024-02-06 15:36:56 +010014#include "panvk_blend.h"
Boris Brezillon8157f512023-12-21 10:57:15 +010015#include "panvk_instance.h"
16#include "panvk_macros.h"
17#include "panvk_mempool.h"
18#include "panvk_meta.h"
19#include "panvk_physical_device.h"
Chia-I Wu576a87a2024-11-25 21:15:51 -080020#include "panvk_utrace_perfetto.h"
Boris Brezillon8157f512023-12-21 10:57:15 +010021
22#include "kmod/pan_kmod.h"
23#include "util/pan_ir.h"
Chia-I Wud340ed62024-11-22 20:25:35 -080024#include "util/perf/u_trace.h"
Boris Brezillon8157f512023-12-21 10:57:15 +010025
Boris Brezillon53fb1d92024-08-20 14:56:38 +020026#include "util/vma.h"
27
Boris Brezillon8157f512023-12-21 10:57:15 +010028#define PANVK_MAX_QUEUE_FAMILIES 1
29
30struct panvk_device {
31 struct vk_device vk;
32
33 struct {
Boris Brezillon22841ba2024-09-20 16:18:26 +020034 simple_mtx_t lock;
Boris Brezillon53fb1d92024-08-20 14:56:38 +020035 struct util_vma_heap heap;
36 } as;
37
38 struct {
Boris Brezillon8157f512023-12-21 10:57:15 +010039 struct pan_kmod_vm *vm;
40 struct pan_kmod_dev *dev;
41 struct pan_kmod_allocator allocator;
42 } kmod;
43
44 struct panvk_priv_bo *tiler_heap;
45 struct panvk_priv_bo *sample_positions;
46
Lars-Ivar Hesselberg Simonsenafaf4542024-10-28 15:54:34 +010047 struct {
48 struct panvk_priv_bo *handlers_bo;
49 uint32_t handler_stride;
Boris Brezillon16dd9902024-11-26 15:10:35 +010050 uint32_t dump_region_size;
Lars-Ivar Hesselberg Simonsenafaf4542024-10-28 15:54:34 +010051 } tiler_oom;
52
Boris Brezillon50679212024-04-29 10:21:28 +020053 struct vk_meta_device meta;
54
Boris Brezillon50679212024-04-29 10:21:28 +020055 struct {
Boris Brezillon2eaa4372024-06-12 09:41:38 +020056 struct panvk_pool rw;
Boris Brezillon7049d312024-08-31 11:52:42 +020057 struct panvk_pool rw_nc;
Boris Brezillon2eaa4372024-06-12 09:41:38 +020058 struct panvk_pool exec;
59 } mempools;
60
Boris Brezillon8157f512023-12-21 10:57:15 +010061 struct vk_device_dispatch_table cmd_dispatch;
62
63 struct panvk_queue *queues[PANVK_MAX_QUEUE_FAMILIES];
64 int queue_count[PANVK_MAX_QUEUE_FAMILIES];
65
66 struct {
Chia-I Wud340ed62024-11-22 20:25:35 -080067 struct u_trace_context utctx;
Chia-I Wu576a87a2024-11-25 21:15:51 -080068#ifdef HAVE_PERFETTO
69 struct panvk_utrace_perfetto utp;
70#endif
Chia-I Wud340ed62024-11-22 20:25:35 -080071 } utrace;
72
73 struct {
Boris Brezillon8157f512023-12-21 10:57:15 +010074 struct pandecode_context *decode_ctx;
75 } debug;
76};
77
78VK_DEFINE_HANDLE_CASTS(panvk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
79
80static inline struct panvk_device *
81to_panvk_device(struct vk_device *dev)
82{
83 return container_of(dev, struct panvk_device, vk);
84}
85
Boris Brezillonb7e0f142024-06-28 11:52:22 +020086static inline uint32_t
87panvk_device_adjust_bo_flags(const struct panvk_device *device,
88 uint32_t bo_flags)
89{
90 struct panvk_instance *instance =
91 to_panvk_instance(device->vk.physical->instance);
92
Boris Brezillon343bff72024-09-06 16:00:14 +020093 if (instance->debug_flags & (PANVK_DEBUG_DUMP | PANVK_DEBUG_TRACE))
Boris Brezillonb7e0f142024-06-28 11:52:22 +020094 bo_flags &= ~PAN_KMOD_BO_FLAG_NO_MMAP;
95
96 return bo_flags;
97}
98
Boris Brezillon8157f512023-12-21 10:57:15 +010099#if PAN_ARCH
100VkResult
101panvk_per_arch(create_device)(struct panvk_physical_device *physical_device,
102 const VkDeviceCreateInfo *pCreateInfo,
103 const VkAllocationCallbacks *pAllocator,
104 VkDevice *pDevice);
105
106void panvk_per_arch(destroy_device)(struct panvk_device *device,
107 const VkAllocationCallbacks *pAllocator);
Chia-I Wu1be7e2e2024-11-15 15:46:53 -0800108
109#if PAN_ARCH >= 10
110VkResult panvk_per_arch(device_check_status)(struct vk_device *vk_dev);
Chia-I Wu1be7e2e2024-11-15 15:46:53 -0800111
Lars-Ivar Hesselberg Simonsenafaf4542024-10-28 15:54:34 +0100112VkResult panvk_per_arch(init_tiler_oom)(struct panvk_device *device);
113#endif
Boris Brezillon8157f512023-12-21 10:57:15 +0100114#endif
115
116#endif