1 /*
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"
12 #include "vk_meta.h"
13
14 #include "panvk_blend.h"
15 #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"
20 #include "panvk_utrace_perfetto.h"
21
22 #include "kmod/pan_kmod.h"
23 #include "util/pan_ir.h"
24 #include "util/perf/u_trace.h"
25
26 #include "util/vma.h"
27
28 #define PANVK_MAX_QUEUE_FAMILIES 1
29
30 struct panvk_device {
31 struct vk_device vk;
32
33 struct {
34 simple_mtx_t lock;
35 struct util_vma_heap heap;
36 } as;
37
38 struct {
39 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
47 struct {
48 struct panvk_priv_bo *handlers_bo;
49 uint32_t handler_stride;
50 uint32_t dump_region_size;
51 } tiler_oom;
52
53 struct vk_meta_device meta;
54
55 struct {
56 struct panvk_pool rw;
57 struct panvk_pool rw_nc;
58 struct panvk_pool exec;
59 } mempools;
60
61 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 {
67 struct u_trace_context utctx;
68 #ifdef HAVE_PERFETTO
69 struct panvk_utrace_perfetto utp;
70 #endif
71 } utrace;
72
73 struct {
74 struct pandecode_context *decode_ctx;
75 } debug;
76 };
77
78 VK_DEFINE_HANDLE_CASTS(panvk_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
79
80 static inline struct panvk_device *
to_panvk_device(struct vk_device * dev)81 to_panvk_device(struct vk_device *dev)
82 {
83 return container_of(dev, struct panvk_device, vk);
84 }
85
86 static inline uint32_t
panvk_device_adjust_bo_flags(const struct panvk_device * device,uint32_t bo_flags)87 panvk_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
93 if (instance->debug_flags & (PANVK_DEBUG_DUMP | PANVK_DEBUG_TRACE))
94 bo_flags &= ~PAN_KMOD_BO_FLAG_NO_MMAP;
95
96 return bo_flags;
97 }
98
99 #if PAN_ARCH
100 VkResult
101 panvk_per_arch(create_device)(struct panvk_physical_device *physical_device,
102 const VkDeviceCreateInfo *pCreateInfo,
103 const VkAllocationCallbacks *pAllocator,
104 VkDevice *pDevice);
105
106 void panvk_per_arch(destroy_device)(struct panvk_device *device,
107 const VkAllocationCallbacks *pAllocator);
108
109 #if PAN_ARCH >= 10
110 VkResult panvk_per_arch(device_check_status)(struct vk_device *vk_dev);
111
112 VkResult panvk_per_arch(init_tiler_oom)(struct panvk_device *device);
113 #endif
114 #endif
115
116 #endif
117