xref: /aosp_15_r20/external/mesa3d/src/freedreno/vulkan/tu_device.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Red Hat.
3*61046927SAndroid Build Coastguard Worker  * Copyright © 2016 Bas Nieuwenhuizen
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * based in part on anv driver which is:
7*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
8*61046927SAndroid Build Coastguard Worker  */
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #ifndef TU_DEVICE_H
11*61046927SAndroid Build Coastguard Worker #define TU_DEVICE_H
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "tu_common.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #include "vk_device_memory.h"
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker #include "tu_autotune.h"
18*61046927SAndroid Build Coastguard Worker #include "tu_pass.h"
19*61046927SAndroid Build Coastguard Worker #include "tu_perfetto.h"
20*61046927SAndroid Build Coastguard Worker #include "tu_suballoc.h"
21*61046927SAndroid Build Coastguard Worker #include "tu_util.h"
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker #include "common/freedreno_rd_output.h"
24*61046927SAndroid Build Coastguard Worker #include "util/vma.h"
25*61046927SAndroid Build Coastguard Worker #include "util/u_vector.h"
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker /* queue types */
28*61046927SAndroid Build Coastguard Worker #define TU_QUEUE_GENERAL 0
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #define TU_MAX_QUEUE_FAMILIES 1
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #define TU_BORDER_COLOR_COUNT 4096
33*61046927SAndroid Build Coastguard Worker #define TU_BORDER_COLOR_BUILTIN 6
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #define TU_BLIT_SHADER_SIZE 4096
36*61046927SAndroid Build Coastguard Worker 
37*61046927SAndroid Build Coastguard Worker /* extra space in vsc draw/prim streams */
38*61046927SAndroid Build Coastguard Worker #define VSC_PAD 0x40
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker enum global_shader {
41*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_VS_BLIT,
42*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_VS_CLEAR,
43*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_FS_BLIT,
44*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_FS_BLIT_ZSCALE,
45*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_FS_COPY_MS,
46*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_FS_COPY_MS_HALF,
47*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_FS_CLEAR0,
48*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_FS_CLEAR_MAX = GLOBAL_SH_FS_CLEAR0 + MAX_RTS,
49*61046927SAndroid Build Coastguard Worker    GLOBAL_SH_COUNT,
50*61046927SAndroid Build Coastguard Worker };
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker struct tu_memory_heap {
53*61046927SAndroid Build Coastguard Worker    /* Standard bits passed on to the client */
54*61046927SAndroid Build Coastguard Worker    VkDeviceSize      size;
55*61046927SAndroid Build Coastguard Worker    VkMemoryHeapFlags flags;
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker    /** Copied from ANV:
58*61046927SAndroid Build Coastguard Worker     *
59*61046927SAndroid Build Coastguard Worker     * Driver-internal book-keeping.
60*61046927SAndroid Build Coastguard Worker     *
61*61046927SAndroid Build Coastguard Worker     * Align it to 64 bits to make atomic operations faster on 32 bit platforms.
62*61046927SAndroid Build Coastguard Worker     */
63*61046927SAndroid Build Coastguard Worker    alignas(8) VkDeviceSize used;
64*61046927SAndroid Build Coastguard Worker };
65*61046927SAndroid Build Coastguard Worker 
66*61046927SAndroid Build Coastguard Worker enum tu_kgsl_dma_type
67*61046927SAndroid Build Coastguard Worker {
68*61046927SAndroid Build Coastguard Worker    TU_KGSL_DMA_TYPE_ION_LEGACY,
69*61046927SAndroid Build Coastguard Worker    TU_KGSL_DMA_TYPE_ION,
70*61046927SAndroid Build Coastguard Worker    TU_KGSL_DMA_TYPE_DMAHEAP,
71*61046927SAndroid Build Coastguard Worker };
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker extern uint64_t os_page_size;
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker struct tu_physical_device
76*61046927SAndroid Build Coastguard Worker {
77*61046927SAndroid Build Coastguard Worker    struct vk_physical_device vk;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    struct tu_instance *instance;
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker    const char *name;
82*61046927SAndroid Build Coastguard Worker    uint8_t driver_uuid[VK_UUID_SIZE];
83*61046927SAndroid Build Coastguard Worker    uint8_t device_uuid[VK_UUID_SIZE];
84*61046927SAndroid Build Coastguard Worker    uint8_t cache_uuid[VK_UUID_SIZE];
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    struct wsi_device wsi_device;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker    char fd_path[20];
89*61046927SAndroid Build Coastguard Worker    int local_fd;
90*61046927SAndroid Build Coastguard Worker    bool has_local;
91*61046927SAndroid Build Coastguard Worker    int64_t local_major;
92*61046927SAndroid Build Coastguard Worker    int64_t local_minor;
93*61046927SAndroid Build Coastguard Worker    int master_fd;
94*61046927SAndroid Build Coastguard Worker    bool has_master;
95*61046927SAndroid Build Coastguard Worker    int64_t master_major;
96*61046927SAndroid Build Coastguard Worker    int64_t master_minor;
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker    int kgsl_dma_fd;
99*61046927SAndroid Build Coastguard Worker    enum tu_kgsl_dma_type kgsl_dma_type;
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker    uint32_t gmem_size;
102*61046927SAndroid Build Coastguard Worker    uint64_t gmem_base;
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker    uint32_t usable_gmem_size_gmem;
105*61046927SAndroid Build Coastguard Worker    uint32_t ccu_offset_gmem;
106*61046927SAndroid Build Coastguard Worker    uint32_t ccu_offset_bypass;
107*61046927SAndroid Build Coastguard Worker    uint32_t ccu_depth_offset_bypass;
108*61046927SAndroid Build Coastguard Worker    uint32_t vpc_attr_buf_offset_gmem;
109*61046927SAndroid Build Coastguard Worker    uint32_t vpc_attr_buf_size_gmem;
110*61046927SAndroid Build Coastguard Worker    uint32_t vpc_attr_buf_offset_bypass;
111*61046927SAndroid Build Coastguard Worker    uint32_t vpc_attr_buf_size_bypass;
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker    /* Amount of usable descriptor sets, this excludes any reserved set */
114*61046927SAndroid Build Coastguard Worker    uint32_t usable_sets;
115*61046927SAndroid Build Coastguard Worker    /* Index of the reserved descriptor set, may be -1 if unset */
116*61046927SAndroid Build Coastguard Worker    int32_t reserved_set_idx;
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    bool has_set_iova;
119*61046927SAndroid Build Coastguard Worker    uint64_t va_start;
120*61046927SAndroid Build Coastguard Worker    uint64_t va_size;
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker    bool has_cached_coherent_memory;
123*61046927SAndroid Build Coastguard Worker    bool has_cached_non_coherent_memory;
124*61046927SAndroid Build Coastguard Worker    uintptr_t level1_dcache_size;
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker    struct {
127*61046927SAndroid Build Coastguard Worker       uint32_t type_count;
128*61046927SAndroid Build Coastguard Worker       VkMemoryPropertyFlags types[VK_MAX_MEMORY_TYPES];
129*61046927SAndroid Build Coastguard Worker    } memory;
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker    struct fd_dev_id dev_id;
132*61046927SAndroid Build Coastguard Worker    struct fd_dev_info dev_info;
133*61046927SAndroid Build Coastguard Worker    const struct fd_dev_info *info;
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker    int msm_major_version;
136*61046927SAndroid Build Coastguard Worker    int msm_minor_version;
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker    /* with 0 being the highest priority */
139*61046927SAndroid Build Coastguard Worker    uint32_t submitqueue_priority_count;
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    struct tu_memory_heap heap;
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker    struct vk_sync_type syncobj_type;
144*61046927SAndroid Build Coastguard Worker    struct vk_sync_timeline_type timeline_type;
145*61046927SAndroid Build Coastguard Worker    const struct vk_sync_type *sync_types[3];
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    uint32_t device_count;
148*61046927SAndroid Build Coastguard Worker };
149*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(tu_physical_device, vk.base, VkPhysicalDevice,
150*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_PHYSICAL_DEVICE)
151*61046927SAndroid Build Coastguard Worker 
152*61046927SAndroid Build Coastguard Worker struct tu_knl;
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker struct tu_instance
155*61046927SAndroid Build Coastguard Worker {
156*61046927SAndroid Build Coastguard Worker    struct vk_instance vk;
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker    const struct tu_knl *knl;
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker    uint32_t instance_idx;
161*61046927SAndroid Build Coastguard Worker    uint32_t api_version;
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker    struct driOptionCache dri_options;
164*61046927SAndroid Build Coastguard Worker    struct driOptionCache available_dri_options;
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker    bool dont_care_as_load;
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker    /* Conservative LRZ (default true) invalidates LRZ on draws with
169*61046927SAndroid Build Coastguard Worker     * blend and depth-write enabled, because this can lead to incorrect
170*61046927SAndroid Build Coastguard Worker     * rendering.  Driconf can be used to disable conservative LRZ for
171*61046927SAndroid Build Coastguard Worker     * games which do not have the problematic sequence of draws *and*
172*61046927SAndroid Build Coastguard Worker     * suffer a performance loss with conservative LRZ.
173*61046927SAndroid Build Coastguard Worker     */
174*61046927SAndroid Build Coastguard Worker    bool conservative_lrz;
175*61046927SAndroid Build Coastguard Worker 
176*61046927SAndroid Build Coastguard Worker    /* If to internally reserve a descriptor set for descriptor set
177*61046927SAndroid Build Coastguard Worker     * dynamic offsets, a descriptor set can be freed at the cost of
178*61046927SAndroid Build Coastguard Worker     * being unable to use the feature. As it is a part of the Vulkan
179*61046927SAndroid Build Coastguard Worker     * core, this is enabled by default.
180*61046927SAndroid Build Coastguard Worker     */
181*61046927SAndroid Build Coastguard Worker    bool reserve_descriptor_set;
182*61046927SAndroid Build Coastguard Worker 
183*61046927SAndroid Build Coastguard Worker    /* Allow out of bounds UBO access by disabling lowering of UBO loads for
184*61046927SAndroid Build Coastguard Worker     * indirect access, which rely on the UBO bounds specified in the shader,
185*61046927SAndroid Build Coastguard Worker     * rather than the bound UBO size which isn't known until draw time.
186*61046927SAndroid Build Coastguard Worker     *
187*61046927SAndroid Build Coastguard Worker     * See: https://github.com/doitsujin/dxvk/issues/3861
188*61046927SAndroid Build Coastguard Worker     */
189*61046927SAndroid Build Coastguard Worker    bool allow_oob_indirect_ubo_loads;
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    /* DXVK and VKD3D-Proton use customBorderColorWithoutFormat
192*61046927SAndroid Build Coastguard Worker     * and have most of D24S8 images with USAGE_SAMPLED, in such case we
193*61046927SAndroid Build Coastguard Worker     * disable UBWC for correctness. However, games don't use border color for
194*61046927SAndroid Build Coastguard Worker     * depth-stencil images. So we elect to ignore this edge case and force
195*61046927SAndroid Build Coastguard Worker     * UBWC to be enabled.
196*61046927SAndroid Build Coastguard Worker     */
197*61046927SAndroid Build Coastguard Worker    bool disable_d24s8_border_color_workaround;
198*61046927SAndroid Build Coastguard Worker };
199*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(tu_instance, vk.base, VkInstance,
200*61046927SAndroid Build Coastguard Worker                        VK_OBJECT_TYPE_INSTANCE)
201*61046927SAndroid Build Coastguard Worker 
202*61046927SAndroid Build Coastguard Worker struct tu_queue
203*61046927SAndroid Build Coastguard Worker {
204*61046927SAndroid Build Coastguard Worker    struct vk_queue vk;
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker    struct tu_device *device;
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker    uint32_t msm_queue_id;
209*61046927SAndroid Build Coastguard Worker    uint32_t priority;
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker    int fence;           /* timestamp/fence of the last queue submission */
212*61046927SAndroid Build Coastguard Worker };
213*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(tu_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
214*61046927SAndroid Build Coastguard Worker 
215*61046927SAndroid Build Coastguard Worker /* This struct defines the layout of the global_bo */
216*61046927SAndroid Build Coastguard Worker struct tu6_global
217*61046927SAndroid Build Coastguard Worker {
218*61046927SAndroid Build Coastguard Worker    /* clear/blit shaders */
219*61046927SAndroid Build Coastguard Worker    uint32_t shaders[TU_BLIT_SHADER_SIZE];
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker    uint32_t seqno_dummy;          /* dummy seqno for CP_EVENT_WRITE */
222*61046927SAndroid Build Coastguard Worker    uint32_t _pad0;
223*61046927SAndroid Build Coastguard Worker    volatile uint32_t vsc_draw_overflow;
224*61046927SAndroid Build Coastguard Worker    uint32_t _pad1;
225*61046927SAndroid Build Coastguard Worker    volatile uint32_t vsc_prim_overflow;
226*61046927SAndroid Build Coastguard Worker    uint32_t _pad2;
227*61046927SAndroid Build Coastguard Worker    uint64_t predicate;
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker    /* scratch space for VPC_SO[i].FLUSH_BASE_LO/HI, start on 32 byte boundary. */
230*61046927SAndroid Build Coastguard Worker    struct {
231*61046927SAndroid Build Coastguard Worker       uint32_t offset;
232*61046927SAndroid Build Coastguard Worker       uint32_t pad[7];
233*61046927SAndroid Build Coastguard Worker    } flush_base[4];
234*61046927SAndroid Build Coastguard Worker 
235*61046927SAndroid Build Coastguard Worker    alignas(16) uint32_t cs_indirect_xyz[12];
236*61046927SAndroid Build Coastguard Worker 
237*61046927SAndroid Build Coastguard Worker    volatile uint32_t vtx_stats_query_not_running;
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker    /* To know when renderpass stats for autotune are valid */
240*61046927SAndroid Build Coastguard Worker    volatile uint32_t autotune_fence;
241*61046927SAndroid Build Coastguard Worker 
242*61046927SAndroid Build Coastguard Worker    /* For recycling command buffers for dynamic suspend/resume comamnds */
243*61046927SAndroid Build Coastguard Worker    volatile uint32_t dynamic_rendering_fence;
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker    volatile uint32_t dbg_one;
246*61046927SAndroid Build Coastguard Worker    volatile uint32_t dbg_gmem_total_loads;
247*61046927SAndroid Build Coastguard Worker    volatile uint32_t dbg_gmem_taken_loads;
248*61046927SAndroid Build Coastguard Worker    volatile uint32_t dbg_gmem_total_stores;
249*61046927SAndroid Build Coastguard Worker    volatile uint32_t dbg_gmem_taken_stores;
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker    /* Written from GPU */
252*61046927SAndroid Build Coastguard Worker    volatile uint32_t breadcrumb_gpu_sync_seqno;
253*61046927SAndroid Build Coastguard Worker    uint32_t _pad3;
254*61046927SAndroid Build Coastguard Worker    /* Written from CPU, acknowledges value written from GPU */
255*61046927SAndroid Build Coastguard Worker    volatile uint32_t breadcrumb_cpu_sync_seqno;
256*61046927SAndroid Build Coastguard Worker    uint32_t _pad4;
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker    volatile uint32_t userspace_fence;
259*61046927SAndroid Build Coastguard Worker    uint32_t _pad5;
260*61046927SAndroid Build Coastguard Worker 
261*61046927SAndroid Build Coastguard Worker    /* note: larger global bo will be used for customBorderColors */
262*61046927SAndroid Build Coastguard Worker    struct bcolor_entry bcolor_builtin[TU_BORDER_COLOR_BUILTIN], bcolor[];
263*61046927SAndroid Build Coastguard Worker };
264*61046927SAndroid Build Coastguard Worker #define gb_offset(member) offsetof(struct tu6_global, member)
265*61046927SAndroid Build Coastguard Worker #define global_iova(cmd, member) ((cmd)->device->global_bo->iova + gb_offset(member))
266*61046927SAndroid Build Coastguard Worker #define global_iova_arr(cmd, member, idx)                                    \
267*61046927SAndroid Build Coastguard Worker    (global_iova(cmd, member) + sizeof_field(struct tu6_global, member[0]) * (idx))
268*61046927SAndroid Build Coastguard Worker 
269*61046927SAndroid Build Coastguard Worker struct tu_pvtmem_bo {
270*61046927SAndroid Build Coastguard Worker       mtx_t mtx;
271*61046927SAndroid Build Coastguard Worker       struct tu_bo *bo;
272*61046927SAndroid Build Coastguard Worker       uint32_t per_fiber_size, per_sp_size;
273*61046927SAndroid Build Coastguard Worker };
274*61046927SAndroid Build Coastguard Worker 
275*61046927SAndroid Build Coastguard Worker struct tu_virtio_device;
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker struct tu_device
278*61046927SAndroid Build Coastguard Worker {
279*61046927SAndroid Build Coastguard Worker    struct vk_device vk;
280*61046927SAndroid Build Coastguard Worker    struct tu_instance *instance;
281*61046927SAndroid Build Coastguard Worker 
282*61046927SAndroid Build Coastguard Worker    struct tu_queue *queues[TU_MAX_QUEUE_FAMILIES];
283*61046927SAndroid Build Coastguard Worker    int queue_count[TU_MAX_QUEUE_FAMILIES];
284*61046927SAndroid Build Coastguard Worker 
285*61046927SAndroid Build Coastguard Worker    struct tu_physical_device *physical_device;
286*61046927SAndroid Build Coastguard Worker    uint32_t device_idx;
287*61046927SAndroid Build Coastguard Worker    int fd;
288*61046927SAndroid Build Coastguard Worker 
289*61046927SAndroid Build Coastguard Worker    struct ir3_compiler *compiler;
290*61046927SAndroid Build Coastguard Worker 
291*61046927SAndroid Build Coastguard Worker    /* Backup in-memory cache to be used if the app doesn't provide one */
292*61046927SAndroid Build Coastguard Worker    struct vk_pipeline_cache *mem_cache;
293*61046927SAndroid Build Coastguard Worker 
294*61046927SAndroid Build Coastguard Worker #define MIN_SCRATCH_BO_SIZE_LOG2 12 /* A page */
295*61046927SAndroid Build Coastguard Worker 
296*61046927SAndroid Build Coastguard Worker    /* Currently the kernel driver uses a 32-bit GPU address space, but it
297*61046927SAndroid Build Coastguard Worker     * should be impossible to go beyond 48 bits.
298*61046927SAndroid Build Coastguard Worker     */
299*61046927SAndroid Build Coastguard Worker    struct {
300*61046927SAndroid Build Coastguard Worker       struct tu_bo *bo;
301*61046927SAndroid Build Coastguard Worker       mtx_t construct_mtx;
302*61046927SAndroid Build Coastguard Worker       bool initialized;
303*61046927SAndroid Build Coastguard Worker    } scratch_bos[48 - MIN_SCRATCH_BO_SIZE_LOG2];
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker    struct tu_pvtmem_bo fiber_pvtmem_bo, wave_pvtmem_bo;
306*61046927SAndroid Build Coastguard Worker 
307*61046927SAndroid Build Coastguard Worker    struct tu_bo *global_bo;
308*61046927SAndroid Build Coastguard Worker    struct tu6_global *global_bo_map;
309*61046927SAndroid Build Coastguard Worker 
310*61046927SAndroid Build Coastguard Worker    uint32_t implicit_sync_bo_count;
311*61046927SAndroid Build Coastguard Worker 
312*61046927SAndroid Build Coastguard Worker    /* Device-global BO suballocator for reducing BO management overhead for
313*61046927SAndroid Build Coastguard Worker     * (read-only) pipeline state.  Synchronized by pipeline_mutex.
314*61046927SAndroid Build Coastguard Worker     */
315*61046927SAndroid Build Coastguard Worker    struct tu_suballocator pipeline_suballoc;
316*61046927SAndroid Build Coastguard Worker    mtx_t pipeline_mutex;
317*61046927SAndroid Build Coastguard Worker 
318*61046927SAndroid Build Coastguard Worker    /* Device-global BO suballocator for reducing BO management for small
319*61046927SAndroid Build Coastguard Worker     * gmem/sysmem autotune result buffers.  Synchronized by autotune_mutex.
320*61046927SAndroid Build Coastguard Worker     */
321*61046927SAndroid Build Coastguard Worker    struct tu_suballocator autotune_suballoc;
322*61046927SAndroid Build Coastguard Worker    mtx_t autotune_mutex;
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker    /* KGSL requires a small chunk of GPU mem to retrieve raw GPU time on
325*61046927SAndroid Build Coastguard Worker     * each submission.
326*61046927SAndroid Build Coastguard Worker     */
327*61046927SAndroid Build Coastguard Worker    struct tu_suballocator kgsl_profiling_suballoc;
328*61046927SAndroid Build Coastguard Worker    mtx_t kgsl_profiling_mutex;
329*61046927SAndroid Build Coastguard Worker 
330*61046927SAndroid Build Coastguard Worker    /* the blob seems to always use 8K factor and 128K param sizes, copy them */
331*61046927SAndroid Build Coastguard Worker #define TU_TESS_FACTOR_SIZE (8 * 1024)
332*61046927SAndroid Build Coastguard Worker #define TU_TESS_PARAM_SIZE (128 * 1024)
333*61046927SAndroid Build Coastguard Worker #define TU_TESS_BO_SIZE (TU_TESS_FACTOR_SIZE + TU_TESS_PARAM_SIZE)
334*61046927SAndroid Build Coastguard Worker    /* Lazily allocated, protected by the device mutex. */
335*61046927SAndroid Build Coastguard Worker    struct tu_bo *tess_bo;
336*61046927SAndroid Build Coastguard Worker 
337*61046927SAndroid Build Coastguard Worker    struct ir3_shader_variant *global_shader_variants[GLOBAL_SH_COUNT];
338*61046927SAndroid Build Coastguard Worker    struct ir3_shader *global_shaders[GLOBAL_SH_COUNT];
339*61046927SAndroid Build Coastguard Worker    uint64_t global_shader_va[GLOBAL_SH_COUNT];
340*61046927SAndroid Build Coastguard Worker 
341*61046927SAndroid Build Coastguard Worker    struct tu_shader *empty_tcs, *empty_tes, *empty_gs, *empty_fs, *empty_fs_fdm;
342*61046927SAndroid Build Coastguard Worker 
343*61046927SAndroid Build Coastguard Worker    uint32_t vsc_draw_strm_pitch;
344*61046927SAndroid Build Coastguard Worker    uint32_t vsc_prim_strm_pitch;
345*61046927SAndroid Build Coastguard Worker    BITSET_DECLARE(custom_border_color, TU_BORDER_COLOR_COUNT);
346*61046927SAndroid Build Coastguard Worker    mtx_t mutex;
347*61046927SAndroid Build Coastguard Worker 
348*61046927SAndroid Build Coastguard Worker    mtx_t vma_mutex;
349*61046927SAndroid Build Coastguard Worker    struct util_vma_heap vma;
350*61046927SAndroid Build Coastguard Worker 
351*61046927SAndroid Build Coastguard Worker    /* bo list for submits: */
352*61046927SAndroid Build Coastguard Worker    struct drm_msm_gem_submit_bo *bo_list;
353*61046927SAndroid Build Coastguard Worker    /* map bo handles to bo list index: */
354*61046927SAndroid Build Coastguard Worker    uint32_t bo_count, bo_list_size;
355*61046927SAndroid Build Coastguard Worker    mtx_t bo_mutex;
356*61046927SAndroid Build Coastguard Worker    /* protects imported BOs creation/freeing */
357*61046927SAndroid Build Coastguard Worker    struct u_rwlock dma_bo_lock;
358*61046927SAndroid Build Coastguard Worker 
359*61046927SAndroid Build Coastguard Worker    /* Tracking of name -> size allocated for TU_DEBUG_BOS */
360*61046927SAndroid Build Coastguard Worker    struct hash_table *bo_sizes;
361*61046927SAndroid Build Coastguard Worker 
362*61046927SAndroid Build Coastguard Worker    /* This array holds all our 'struct tu_bo' allocations. We use this
363*61046927SAndroid Build Coastguard Worker     * so we can add a refcount to our BOs and check if a particular BO
364*61046927SAndroid Build Coastguard Worker     * was already allocated in this device using its GEM handle. This is
365*61046927SAndroid Build Coastguard Worker     * necessary to properly manage BO imports, because the kernel doesn't
366*61046927SAndroid Build Coastguard Worker     * refcount the underlying BO memory.
367*61046927SAndroid Build Coastguard Worker     *
368*61046927SAndroid Build Coastguard Worker     * Specifically, when self-importing (i.e. importing a BO into the same
369*61046927SAndroid Build Coastguard Worker     * device that created it), the kernel will give us the same BO handle
370*61046927SAndroid Build Coastguard Worker     * for both BOs and we must only free it once when  both references are
371*61046927SAndroid Build Coastguard Worker     * freed. Otherwise, if we are not self-importing, we get two different BO
372*61046927SAndroid Build Coastguard Worker     * handles, and we want to free each one individually.
373*61046927SAndroid Build Coastguard Worker     *
374*61046927SAndroid Build Coastguard Worker     * The refcount is also useful for being able to maintain BOs across
375*61046927SAndroid Build Coastguard Worker     * VK object lifetimes, such as pipelines suballocating out of BOs
376*61046927SAndroid Build Coastguard Worker     * allocated on the device.
377*61046927SAndroid Build Coastguard Worker     */
378*61046927SAndroid Build Coastguard Worker    struct util_sparse_array bo_map;
379*61046927SAndroid Build Coastguard Worker 
380*61046927SAndroid Build Coastguard Worker    /* We cannot immediately free VMA when freeing BO, kernel truly
381*61046927SAndroid Build Coastguard Worker     * frees BO when it stops being busy.
382*61046927SAndroid Build Coastguard Worker     * So we have to free our VMA only after the kernel does it.
383*61046927SAndroid Build Coastguard Worker     */
384*61046927SAndroid Build Coastguard Worker    struct u_vector zombie_vmas;
385*61046927SAndroid Build Coastguard Worker 
386*61046927SAndroid Build Coastguard Worker    /* Command streams to set pass index to a scratch reg */
387*61046927SAndroid Build Coastguard Worker    struct tu_cs *perfcntrs_pass_cs;
388*61046927SAndroid Build Coastguard Worker    struct tu_cs_entry *perfcntrs_pass_cs_entries;
389*61046927SAndroid Build Coastguard Worker 
390*61046927SAndroid Build Coastguard Worker    struct tu_cs *cmdbuf_start_a725_quirk_cs;
391*61046927SAndroid Build Coastguard Worker    struct tu_cs_entry *cmdbuf_start_a725_quirk_entry;
392*61046927SAndroid Build Coastguard Worker 
393*61046927SAndroid Build Coastguard Worker    struct util_dynarray dynamic_rendering_pending;
394*61046927SAndroid Build Coastguard Worker    VkCommandPool dynamic_rendering_pool;
395*61046927SAndroid Build Coastguard Worker    uint32_t dynamic_rendering_fence;
396*61046927SAndroid Build Coastguard Worker 
397*61046927SAndroid Build Coastguard Worker    /* Condition variable for timeline semaphore to notify waiters when a
398*61046927SAndroid Build Coastguard Worker     * new submit is executed. */
399*61046927SAndroid Build Coastguard Worker    pthread_cond_t timeline_cond;
400*61046927SAndroid Build Coastguard Worker    pthread_mutex_t submit_mutex;
401*61046927SAndroid Build Coastguard Worker 
402*61046927SAndroid Build Coastguard Worker    struct tu_autotune autotune;
403*61046927SAndroid Build Coastguard Worker 
404*61046927SAndroid Build Coastguard Worker    struct breadcrumbs_context *breadcrumbs_ctx;
405*61046927SAndroid Build Coastguard Worker 
406*61046927SAndroid Build Coastguard Worker    struct tu_cs *dbg_cmdbuf_stomp_cs;
407*61046927SAndroid Build Coastguard Worker    struct tu_cs *dbg_renderpass_stomp_cs;
408*61046927SAndroid Build Coastguard Worker 
409*61046927SAndroid Build Coastguard Worker #ifdef TU_HAS_VIRTIO
410*61046927SAndroid Build Coastguard Worker    struct tu_virtio_device *vdev;
411*61046927SAndroid Build Coastguard Worker #endif
412*61046927SAndroid Build Coastguard Worker 
413*61046927SAndroid Build Coastguard Worker    uint32_t submit_count;
414*61046927SAndroid Build Coastguard Worker 
415*61046927SAndroid Build Coastguard Worker    /* Address space and global fault count for this local_fd with DRM backend */
416*61046927SAndroid Build Coastguard Worker    uint64_t fault_count;
417*61046927SAndroid Build Coastguard Worker 
418*61046927SAndroid Build Coastguard Worker    struct u_trace_context trace_context;
419*61046927SAndroid Build Coastguard Worker 
420*61046927SAndroid Build Coastguard Worker    #ifdef HAVE_PERFETTO
421*61046927SAndroid Build Coastguard Worker    struct tu_perfetto_state perfetto;
422*61046927SAndroid Build Coastguard Worker    #endif
423*61046927SAndroid Build Coastguard Worker 
424*61046927SAndroid Build Coastguard Worker    bool use_z24uint_s8uint;
425*61046927SAndroid Build Coastguard Worker    bool use_lrz;
426*61046927SAndroid Build Coastguard Worker 
427*61046927SAndroid Build Coastguard Worker    struct fd_rd_output rd_output;
428*61046927SAndroid Build Coastguard Worker };
429*61046927SAndroid Build Coastguard Worker VK_DEFINE_HANDLE_CASTS(tu_device, vk.base, VkDevice, VK_OBJECT_TYPE_DEVICE)
430*61046927SAndroid Build Coastguard Worker 
431*61046927SAndroid Build Coastguard Worker struct tu_device_memory
432*61046927SAndroid Build Coastguard Worker {
433*61046927SAndroid Build Coastguard Worker    struct vk_device_memory vk;
434*61046927SAndroid Build Coastguard Worker 
435*61046927SAndroid Build Coastguard Worker    struct tu_bo *bo;
436*61046927SAndroid Build Coastguard Worker 
437*61046927SAndroid Build Coastguard Worker    /* for dedicated allocations */
438*61046927SAndroid Build Coastguard Worker    struct tu_image *image;
439*61046927SAndroid Build Coastguard Worker };
440*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(tu_device_memory, vk.base, VkDeviceMemory,
441*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_DEVICE_MEMORY)
442*61046927SAndroid Build Coastguard Worker 
443*61046927SAndroid Build Coastguard Worker struct tu_attachment_info
444*61046927SAndroid Build Coastguard Worker {
445*61046927SAndroid Build Coastguard Worker    struct tu_image_view *attachment;
446*61046927SAndroid Build Coastguard Worker };
447*61046927SAndroid Build Coastguard Worker 
448*61046927SAndroid Build Coastguard Worker struct tu_tiling_config {
449*61046927SAndroid Build Coastguard Worker    /* size of the first tile */
450*61046927SAndroid Build Coastguard Worker    VkExtent2D tile0;
451*61046927SAndroid Build Coastguard Worker    /* number of tiles */
452*61046927SAndroid Build Coastguard Worker    VkExtent2D tile_count;
453*61046927SAndroid Build Coastguard Worker 
454*61046927SAndroid Build Coastguard Worker    /* size of the first VSC pipe */
455*61046927SAndroid Build Coastguard Worker    VkExtent2D pipe0;
456*61046927SAndroid Build Coastguard Worker    /* number of VSC pipes */
457*61046927SAndroid Build Coastguard Worker    VkExtent2D pipe_count;
458*61046927SAndroid Build Coastguard Worker 
459*61046927SAndroid Build Coastguard Worker    /* Whether using GMEM is even possible with this configuration */
460*61046927SAndroid Build Coastguard Worker    bool possible;
461*61046927SAndroid Build Coastguard Worker 
462*61046927SAndroid Build Coastguard Worker    /* Whether binning should be used for gmem rendering using this framebuffer. */
463*61046927SAndroid Build Coastguard Worker    bool binning;
464*61046927SAndroid Build Coastguard Worker 
465*61046927SAndroid Build Coastguard Worker    /* Whether binning could be used for gmem rendering using this framebuffer. */
466*61046927SAndroid Build Coastguard Worker    bool binning_possible;
467*61046927SAndroid Build Coastguard Worker 
468*61046927SAndroid Build Coastguard Worker    /* pipe register values */
469*61046927SAndroid Build Coastguard Worker    uint32_t pipe_config[MAX_VSC_PIPES];
470*61046927SAndroid Build Coastguard Worker    uint32_t pipe_sizes[MAX_VSC_PIPES];
471*61046927SAndroid Build Coastguard Worker };
472*61046927SAndroid Build Coastguard Worker 
473*61046927SAndroid Build Coastguard Worker struct tu_framebuffer
474*61046927SAndroid Build Coastguard Worker {
475*61046927SAndroid Build Coastguard Worker    struct vk_object_base base;
476*61046927SAndroid Build Coastguard Worker 
477*61046927SAndroid Build Coastguard Worker    uint32_t width;
478*61046927SAndroid Build Coastguard Worker    uint32_t height;
479*61046927SAndroid Build Coastguard Worker    uint32_t layers;
480*61046927SAndroid Build Coastguard Worker 
481*61046927SAndroid Build Coastguard Worker    struct tu_tiling_config tiling[TU_GMEM_LAYOUT_COUNT];
482*61046927SAndroid Build Coastguard Worker 
483*61046927SAndroid Build Coastguard Worker    uint32_t attachment_count;
484*61046927SAndroid Build Coastguard Worker    struct tu_attachment_info attachments[0];
485*61046927SAndroid Build Coastguard Worker };
486*61046927SAndroid Build Coastguard Worker VK_DEFINE_NONDISP_HANDLE_CASTS(tu_framebuffer, base, VkFramebuffer,
487*61046927SAndroid Build Coastguard Worker                                VK_OBJECT_TYPE_FRAMEBUFFER)
488*61046927SAndroid Build Coastguard Worker 
489*61046927SAndroid Build Coastguard Worker uint64_t
490*61046927SAndroid Build Coastguard Worker tu_get_system_heap_size(struct tu_physical_device *physical_device);
491*61046927SAndroid Build Coastguard Worker 
492*61046927SAndroid Build Coastguard Worker VkResult
493*61046927SAndroid Build Coastguard Worker tu_physical_device_init(struct tu_physical_device *device,
494*61046927SAndroid Build Coastguard Worker                         struct tu_instance *instance);
495*61046927SAndroid Build Coastguard Worker 
496*61046927SAndroid Build Coastguard Worker uint64_t
497*61046927SAndroid Build Coastguard Worker tu_device_ticks_to_ns(struct tu_device *dev, uint64_t ts);
498*61046927SAndroid Build Coastguard Worker 
499*61046927SAndroid Build Coastguard Worker static inline struct tu_bo *
tu_device_lookup_bo(struct tu_device * device,uint32_t handle)500*61046927SAndroid Build Coastguard Worker tu_device_lookup_bo(struct tu_device *device, uint32_t handle)
501*61046927SAndroid Build Coastguard Worker {
502*61046927SAndroid Build Coastguard Worker    return (struct tu_bo *) util_sparse_array_get(&device->bo_map, handle);
503*61046927SAndroid Build Coastguard Worker }
504*61046927SAndroid Build Coastguard Worker 
505*61046927SAndroid Build Coastguard Worker struct u_trace_context *
506*61046927SAndroid Build Coastguard Worker tu_device_get_u_trace(struct tu_device *device);
507*61046927SAndroid Build Coastguard Worker 
508*61046927SAndroid Build Coastguard Worker /* Get a scratch bo for use inside a command buffer. This will always return
509*61046927SAndroid Build Coastguard Worker  * the same bo given the same size or similar sizes, so only one scratch bo
510*61046927SAndroid Build Coastguard Worker  * can be used at the same time. It's meant for short-lived things where we
511*61046927SAndroid Build Coastguard Worker  * need to write to some piece of memory, read from it, and then immediately
512*61046927SAndroid Build Coastguard Worker  * discard it.
513*61046927SAndroid Build Coastguard Worker  */
514*61046927SAndroid Build Coastguard Worker VkResult
515*61046927SAndroid Build Coastguard Worker tu_get_scratch_bo(struct tu_device *dev, uint64_t size, struct tu_bo **bo);
516*61046927SAndroid Build Coastguard Worker 
517*61046927SAndroid Build Coastguard Worker void tu_setup_dynamic_framebuffer(struct tu_cmd_buffer *cmd_buffer,
518*61046927SAndroid Build Coastguard Worker                                   const VkRenderingInfo *pRenderingInfo);
519*61046927SAndroid Build Coastguard Worker 
520*61046927SAndroid Build Coastguard Worker void
521*61046927SAndroid Build Coastguard Worker tu_copy_buffer(struct u_trace_context *utctx, void *cmdstream,
522*61046927SAndroid Build Coastguard Worker                void *ts_from, uint64_t from_offset_B,
523*61046927SAndroid Build Coastguard Worker                void *ts_to, uint64_t to_offset_B,
524*61046927SAndroid Build Coastguard Worker                uint64_t size_B);
525*61046927SAndroid Build Coastguard Worker 
526*61046927SAndroid Build Coastguard Worker 
527*61046927SAndroid Build Coastguard Worker VkResult
528*61046927SAndroid Build Coastguard Worker tu_create_copy_timestamp_cs(struct tu_cmd_buffer *cmdbuf, struct tu_cs** cs,
529*61046927SAndroid Build Coastguard Worker                             struct u_trace **trace_copy);
530*61046927SAndroid Build Coastguard Worker 
531*61046927SAndroid Build Coastguard Worker /* If we copy trace and timestamps we will have to free them. */
532*61046927SAndroid Build Coastguard Worker struct tu_u_trace_cmd_data
533*61046927SAndroid Build Coastguard Worker {
534*61046927SAndroid Build Coastguard Worker    struct tu_cs *timestamp_copy_cs;
535*61046927SAndroid Build Coastguard Worker    struct u_trace *trace;
536*61046927SAndroid Build Coastguard Worker };
537*61046927SAndroid Build Coastguard Worker 
538*61046927SAndroid Build Coastguard Worker /* Data necessary to retrieve timestamps and clean all
539*61046927SAndroid Build Coastguard Worker  * associated resources afterwards.
540*61046927SAndroid Build Coastguard Worker  */
541*61046927SAndroid Build Coastguard Worker struct tu_u_trace_submission_data
542*61046927SAndroid Build Coastguard Worker {
543*61046927SAndroid Build Coastguard Worker    uint32_t submission_id;
544*61046927SAndroid Build Coastguard Worker    /* We have to know when timestamps are available,
545*61046927SAndroid Build Coastguard Worker     * this sync object indicates it.
546*61046927SAndroid Build Coastguard Worker     */
547*61046927SAndroid Build Coastguard Worker    struct tu_u_trace_syncobj *syncobj;
548*61046927SAndroid Build Coastguard Worker 
549*61046927SAndroid Build Coastguard Worker    uint32_t cmd_buffer_count;
550*61046927SAndroid Build Coastguard Worker    uint32_t last_buffer_with_tracepoints;
551*61046927SAndroid Build Coastguard Worker    struct tu_u_trace_cmd_data *cmd_trace_data;
552*61046927SAndroid Build Coastguard Worker 
553*61046927SAndroid Build Coastguard Worker    /* GPU time is reset on GPU power cycle and the GPU time
554*61046927SAndroid Build Coastguard Worker     * offset may change between submissions due to power cycle.
555*61046927SAndroid Build Coastguard Worker     */
556*61046927SAndroid Build Coastguard Worker    uint64_t gpu_ts_offset;
557*61046927SAndroid Build Coastguard Worker 
558*61046927SAndroid Build Coastguard Worker    /* KGSL needs a GPU memory to write submission timestamps into */
559*61046927SAndroid Build Coastguard Worker    struct tu_suballoc_bo kgsl_timestamp_bo;
560*61046927SAndroid Build Coastguard Worker };
561*61046927SAndroid Build Coastguard Worker 
562*61046927SAndroid Build Coastguard Worker VkResult
563*61046927SAndroid Build Coastguard Worker tu_u_trace_submission_data_create(
564*61046927SAndroid Build Coastguard Worker    struct tu_device *device,
565*61046927SAndroid Build Coastguard Worker    struct tu_cmd_buffer **cmd_buffers,
566*61046927SAndroid Build Coastguard Worker    uint32_t cmd_buffer_count,
567*61046927SAndroid Build Coastguard Worker    struct tu_u_trace_submission_data **submission_data);
568*61046927SAndroid Build Coastguard Worker 
569*61046927SAndroid Build Coastguard Worker void
570*61046927SAndroid Build Coastguard Worker tu_u_trace_submission_data_finish(
571*61046927SAndroid Build Coastguard Worker    struct tu_device *device,
572*61046927SAndroid Build Coastguard Worker    struct tu_u_trace_submission_data *submission_data);
573*61046927SAndroid Build Coastguard Worker 
574*61046927SAndroid Build Coastguard Worker const char *
575*61046927SAndroid Build Coastguard Worker tu_debug_bos_add(struct tu_device *dev, uint64_t size, const char *name);
576*61046927SAndroid Build Coastguard Worker void
577*61046927SAndroid Build Coastguard Worker tu_debug_bos_del(struct tu_device *dev, struct tu_bo *bo);
578*61046927SAndroid Build Coastguard Worker void
579*61046927SAndroid Build Coastguard Worker tu_debug_bos_print_stats(struct tu_device *dev);
580*61046927SAndroid Build Coastguard Worker 
581*61046927SAndroid Build Coastguard Worker #endif /* TU_DEVICE_H */
582