• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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