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