xref: /aosp_15_r20/external/mesa3d/src/amd/vulkan/radv_queue.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2016 Red Hat.
3  * Copyright © 2016 Bas Nieuwenhuizen
4  *
5  * based in part on anv driver which is:
6  * Copyright © 2015 Intel Corporation
7  *
8  * SPDX-License-Identifier: MIT
9  */
10 
11 #ifndef RADV_QUEUE_H
12 #define RADV_QUEUE_H
13 
14 #include "vk_queue.h"
15 
16 #include "radv_radeon_winsys.h"
17 
18 struct radv_physical_device;
19 struct radv_device;
20 
21 struct radv_queue_ring_info {
22    uint32_t scratch_size_per_wave;
23    uint32_t scratch_waves;
24    uint32_t compute_scratch_size_per_wave;
25    uint32_t compute_scratch_waves;
26    uint32_t esgs_ring_size;
27    uint32_t gsvs_ring_size;
28    uint32_t attr_ring_size;
29    bool tess_rings;
30    bool task_rings;
31    bool mesh_scratch_ring;
32    bool gds;
33    bool gds_oa;
34    bool sample_positions;
35 };
36 
37 enum radv_queue_family {
38    RADV_QUEUE_GENERAL,
39    RADV_QUEUE_COMPUTE,
40    RADV_QUEUE_TRANSFER,
41    RADV_QUEUE_SPARSE,
42    RADV_QUEUE_VIDEO_DEC,
43    RADV_QUEUE_VIDEO_ENC,
44    RADV_MAX_QUEUE_FAMILIES,
45    RADV_QUEUE_FOREIGN = RADV_MAX_QUEUE_FAMILIES,
46    RADV_QUEUE_IGNORED,
47 };
48 
49 struct radv_queue_state {
50    enum radv_queue_family qf;
51    struct radv_queue_ring_info ring_info;
52 
53    struct radeon_winsys_bo *scratch_bo;
54    struct radeon_winsys_bo *descriptor_bo;
55    struct radeon_winsys_bo *compute_scratch_bo;
56    struct radeon_winsys_bo *esgs_ring_bo;
57    struct radeon_winsys_bo *gsvs_ring_bo;
58    struct radeon_winsys_bo *tess_rings_bo;
59    struct radeon_winsys_bo *task_rings_bo;
60    struct radeon_winsys_bo *mesh_scratch_ring_bo;
61    struct radeon_winsys_bo *attr_ring_bo;
62    struct radeon_winsys_bo *gds_bo;
63    struct radeon_winsys_bo *gds_oa_bo;
64 
65    struct radeon_cmdbuf *initial_preamble_cs;
66    struct radeon_cmdbuf *initial_full_flush_preamble_cs;
67    struct radeon_cmdbuf *continue_preamble_cs;
68    struct radeon_cmdbuf *gang_wait_preamble_cs;
69    struct radeon_cmdbuf *gang_wait_postamble_cs;
70 
71    /* the uses_shadow_regs here will be set only for general queue */
72    bool uses_shadow_regs;
73    /* register state is saved in shadowed_regs buffer */
74    struct radeon_winsys_bo *shadowed_regs;
75    /* shadow regs preamble ib. This will be the first preamble ib.
76     * This ib has the packets to start register shadowing.
77     */
78    struct radeon_winsys_bo *shadow_regs_ib;
79    uint32_t shadow_regs_ib_size_dw;
80 };
81 
82 struct radv_queue {
83    struct vk_queue vk;
84    struct radeon_winsys_ctx *hw_ctx;
85    enum radeon_ctx_priority priority;
86    struct radv_queue_state state;
87    struct radv_queue_state *follower_state;
88    struct radeon_winsys_bo *gang_sem_bo;
89 
90    uint64_t last_shader_upload_seq;
91    bool sqtt_present;
92 };
93 
94 VK_DEFINE_HANDLE_CASTS(radv_queue, vk.base, VkQueue, VK_OBJECT_TYPE_QUEUE)
95 
96 static inline struct radv_device *
radv_queue_device(const struct radv_queue * queue)97 radv_queue_device(const struct radv_queue *queue)
98 {
99    return (struct radv_device *)queue->vk.base.device;
100 }
101 
102 int radv_queue_init(struct radv_device *device, struct radv_queue *queue, int idx,
103                     const VkDeviceQueueCreateInfo *create_info,
104                     const VkDeviceQueueGlobalPriorityCreateInfoKHR *global_priority);
105 
106 void radv_queue_finish(struct radv_queue *queue);
107 
108 enum radeon_ctx_priority radv_get_queue_global_priority(const VkDeviceQueueGlobalPriorityCreateInfoKHR *pObj);
109 
110 void radv_emit_graphics(struct radv_device *device, struct radeon_cmdbuf *cs);
111 
112 bool radv_queue_internal_submit(struct radv_queue *queue, struct radeon_cmdbuf *cs);
113 
114 enum amd_ip_type radv_queue_ring(const struct radv_queue *queue);
115 
116 enum amd_ip_type radv_queue_family_to_ring(const struct radv_physical_device *dev, enum radv_queue_family f);
117 
118 #endif /* RADV_QUEUE_H */
119