xref: /aosp_15_r20/external/mesa3d/src/amd/vulkan/radv_descriptor_set.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2016 Bas Nieuwenhuizen
3  *
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #ifndef RADV_DESCRIPTOR_SET_H
8 #define RADV_DESCRIPTOR_SET_H
9 
10 #include "util/mesa-blake3.h"
11 
12 #include "radv_constants.h"
13 
14 #include "vk_descriptor_set_layout.h"
15 #include "vk_object.h"
16 
17 #include <vulkan/vulkan.h>
18 
19 struct radv_descriptor_set_binding_layout {
20    VkDescriptorType type;
21 
22    /* Number of array elements in this binding */
23    uint32_t array_size;
24 
25    uint32_t offset;
26    uint32_t buffer_offset;
27    uint16_t dynamic_offset_offset;
28 
29    uint16_t dynamic_offset_count;
30    /* redundant with the type, each for a single array element */
31    uint32_t size;
32 
33    /* Offset in the radv_descriptor_set_layout of the immutable samplers, or 0
34     * if there are no immutable samplers. */
35    uint32_t immutable_samplers_offset;
36    bool immutable_samplers_equal;
37 };
38 
39 struct radv_descriptor_set_layout {
40    struct vk_descriptor_set_layout vk;
41 
42    /* Hash of all fields below */
43    blake3_hash hash;
44 
45    /* Everything below is hashed and shouldn't contain any pointers. Be careful when modifying this
46     * structure.
47     */
48 
49    /* The create flags for this descriptor set layout */
50    VkDescriptorSetLayoutCreateFlags flags;
51 
52    /* Number of bindings in this descriptor set */
53    uint32_t binding_count;
54 
55    /* Total size of the descriptor set with room for all array entries */
56    uint32_t size;
57 
58    /* Shader stages affected by this descriptor set */
59    uint16_t dynamic_shader_stages;
60 
61    /* Number of buffers in this descriptor set */
62    uint32_t buffer_count;
63 
64    /* Number of dynamic offsets used by this descriptor set */
65    uint16_t dynamic_offset_count;
66 
67    bool has_immutable_samplers;
68    bool has_variable_descriptors;
69 
70    uint32_t ycbcr_sampler_offsets_offset;
71 
72    /* Bindings in this descriptor set */
73    struct radv_descriptor_set_binding_layout binding[0];
74 };
75 
76 VK_DEFINE_NONDISP_HANDLE_CASTS(radv_descriptor_set_layout, vk.base, VkDescriptorSetLayout,
77                                VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
78 
79 struct radv_descriptor_range {
80    uint64_t va;
81    uint32_t size;
82 };
83 
84 struct radv_descriptor_set_header {
85    struct vk_object_base base;
86    struct radv_descriptor_set_layout *layout;
87    uint32_t size;
88    uint32_t buffer_count;
89 
90    struct radeon_winsys_bo *bo;
91    uint64_t va;
92    uint32_t *mapped_ptr;
93    struct radv_descriptor_range *dynamic_descriptors;
94 };
95 
96 struct radv_descriptor_set {
97    struct radv_descriptor_set_header header;
98 
99    struct radeon_winsys_bo *descriptors[];
100 };
101 
102 VK_DEFINE_NONDISP_HANDLE_CASTS(radv_descriptor_set, header.base, VkDescriptorSet, VK_OBJECT_TYPE_DESCRIPTOR_SET)
103 
104 struct radv_push_descriptor_set {
105    struct radv_descriptor_set_header set;
106    uint32_t capacity;
107 };
108 
109 struct radv_descriptor_pool_entry {
110    uint32_t offset;
111    uint32_t size;
112    struct radv_descriptor_set *set;
113 };
114 
115 struct radv_descriptor_pool {
116    struct vk_object_base base;
117    struct radeon_winsys_bo *bo;
118    uint8_t *host_bo;
119    uint8_t *mapped_ptr;
120    uint64_t current_offset;
121    uint64_t size;
122 
123    uint8_t *host_memory_base;
124    uint8_t *host_memory_ptr;
125    uint8_t *host_memory_end;
126 
127    uint32_t entry_count;
128    uint32_t max_entry_count;
129 
130    union {
131       struct radv_descriptor_set *sets[0];
132       struct radv_descriptor_pool_entry entries[0];
133    };
134 };
135 
136 VK_DEFINE_NONDISP_HANDLE_CASTS(radv_descriptor_pool, base, VkDescriptorPool, VK_OBJECT_TYPE_DESCRIPTOR_POOL)
137 
138 struct radv_descriptor_update_template_entry {
139    VkDescriptorType descriptor_type;
140 
141    /* The number of descriptors to update */
142    uint32_t descriptor_count;
143 
144    /* Into mapped_ptr or dynamic_descriptors, in units of the respective array */
145    uint32_t dst_offset;
146 
147    /* In dwords. Not valid/used for dynamic descriptors */
148    uint32_t dst_stride;
149 
150    uint32_t buffer_offset;
151 
152    /* Only valid for combined image samplers and samplers */
153    uint8_t has_sampler;
154    uint8_t sampler_offset;
155 
156    /* In bytes */
157    size_t src_offset;
158    size_t src_stride;
159 
160    /* For push descriptors */
161    const uint32_t *immutable_samplers;
162 };
163 
164 struct radv_descriptor_update_template {
165    struct vk_object_base base;
166    uint32_t entry_count;
167    VkPipelineBindPoint bind_point;
168    struct radv_descriptor_update_template_entry entry[0];
169 };
170 
171 VK_DEFINE_NONDISP_HANDLE_CASTS(radv_descriptor_update_template, base, VkDescriptorUpdateTemplate,
172                                VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE)
173 
174 struct radv_pipeline_layout {
175    struct vk_object_base base;
176    struct {
177       struct radv_descriptor_set_layout *layout;
178       uint32_t dynamic_offset_start;
179    } set[MAX_SETS];
180 
181    uint32_t num_sets;
182    uint32_t push_constant_size;
183    uint32_t dynamic_offset_count;
184    uint16_t dynamic_shader_stages;
185 
186    bool independent_sets;
187 
188    blake3_hash hash;
189 };
190 
VK_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline_layout,base,VkPipelineLayout,VK_OBJECT_TYPE_PIPELINE_LAYOUT)191 VK_DEFINE_NONDISP_HANDLE_CASTS(radv_pipeline_layout, base, VkPipelineLayout, VK_OBJECT_TYPE_PIPELINE_LAYOUT)
192 
193 static inline const uint32_t *
194 radv_immutable_samplers(const struct radv_descriptor_set_layout *set,
195                         const struct radv_descriptor_set_binding_layout *binding)
196 {
197    return (const uint32_t *)((const char *)set + binding->immutable_samplers_offset);
198 }
199 
200 static inline unsigned
radv_combined_image_descriptor_sampler_offset(const struct radv_descriptor_set_binding_layout * binding)201 radv_combined_image_descriptor_sampler_offset(const struct radv_descriptor_set_binding_layout *binding)
202 {
203    return binding->size - ((!binding->immutable_samplers_equal) ? 16 : 0);
204 }
205 
206 static inline const struct vk_ycbcr_conversion_state *
radv_immutable_ycbcr_samplers(const struct radv_descriptor_set_layout * set,unsigned binding_index)207 radv_immutable_ycbcr_samplers(const struct radv_descriptor_set_layout *set, unsigned binding_index)
208 {
209    if (!set->ycbcr_sampler_offsets_offset)
210       return NULL;
211 
212    const uint32_t *offsets = (const uint32_t *)((const char *)set + set->ycbcr_sampler_offsets_offset);
213 
214    if (offsets[binding_index] == 0)
215       return NULL;
216    return (const struct vk_ycbcr_conversion_state *)((const char *)set + offsets[binding_index]);
217 }
218 
219 struct radv_device;
220 struct radv_cmd_buffer;
221 
222 void radv_pipeline_layout_init(struct radv_device *device, struct radv_pipeline_layout *layout, bool independent_sets);
223 void radv_pipeline_layout_add_set(struct radv_pipeline_layout *layout, uint32_t set_idx,
224                                   struct radv_descriptor_set_layout *set_layout);
225 void radv_pipeline_layout_hash(struct radv_pipeline_layout *layout);
226 void radv_pipeline_layout_finish(struct radv_device *device, struct radv_pipeline_layout *layout);
227 
228 void radv_cmd_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer,
229                                      VkDescriptorSet overrideSet, uint32_t descriptorWriteCount,
230                                      const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount,
231                                      const VkCopyDescriptorSet *pDescriptorCopies);
232 
233 void radv_cmd_update_descriptor_set_with_template(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer,
234                                                   struct radv_descriptor_set *set,
235                                                   VkDescriptorUpdateTemplate descriptorUpdateTemplate,
236                                                   const void *pData);
237 
238 #endif /* RADV_DESCRIPTOR_SET_H */
239