Blender V5.0
vk_descriptor_set.hh
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11#include "BLI_utility_mixins.hh"
12#include "BLI_vector.hh"
13
14#include "gpu_shader_private.hh"
15
18#include "vk_buffer.hh"
19#include "vk_common.hh"
21#include "vk_uniform_buffer.hh"
22
23namespace blender::gpu {
25class VKStateManager;
26class VKDevice;
27class VKPushConstants;
28class VKShader;
30class VKVertexBuffer;
31
41
42 public:
54 struct Location {
56 friend class VKShaderInterface;
57 friend struct VKResourceBinding;
58
59 private:
63 uint32_t binding;
64
65 Location(uint32_t binding) : binding(binding) {}
66
67 public:
68 Location() = default;
69
70 bool operator==(const Location &other) const
71 {
72 return binding == other.binding;
73 }
74
75 operator uint32_t() const
76 {
77 return binding;
78 }
79 };
80};
81
83 public:
85
87 VKContext &context,
89 VkDescriptorSetLayout vk_descriptor_set_layout,
90 render_graph::VKPipelineData &r_pipeline_data) = 0;
91 void bind_shader_resources(const VKDevice &device,
92 const VKStateManager &state_manager,
95 virtual void upload_descriptor_sets() = 0;
96
97 private:
98 void bind_image_resource(const VKStateManager &state_manager,
99 const VKResourceBinding &resource_binding,
101 void bind_texture_resource(const VKDevice &device,
102 const VKStateManager &state_manager,
103 const VKResourceBinding &resource_binding,
105 void bind_storage_buffer_resource(const VKStateManager &state_manager,
106 const VKResourceBinding &resource_binding,
108 void bind_uniform_buffer_resource(const VKStateManager &state_manager,
109 const VKResourceBinding &resource_binding,
111 void bind_input_attachment_resource(const VKDevice &device,
112 const VKStateManager &state_manager,
113 const VKResourceBinding &resource_binding,
115
116 void bind_push_constants(VKPushConstants &push_constants,
118
119 protected:
120 virtual void bind_texel_buffer(VKVertexBuffer &vertex_buffer,
121 VKDescriptorSet::Location location) = 0;
122 virtual void bind_buffer(VkDescriptorType vk_descriptor_type,
123 VkBuffer vk_buffer,
124 VkDeviceAddress vk_device_address,
125 VkDeviceSize buffer_offset,
126 VkDeviceSize size_in_bytes,
127 VKDescriptorSet::Location location) = 0;
128 virtual void bind_image(VkDescriptorType vk_descriptor_type,
129 VkSampler vk_sampler,
130 VkImageView vk_image_view,
131 VkImageLayout vk_image_layout,
132 VKDescriptorSet::Location location) = 0;
133};
134
136 public:
137 VkDescriptorSet vk_descriptor_set = VK_NULL_HANDLE;
138
140 VKContext &context,
142 VkDescriptorSetLayout vk_descriptor_set_layout,
143 render_graph::VKPipelineData &r_pipeline_data) override;
144
145 void upload_descriptor_sets() override;
146
147 protected:
148 void bind_texel_buffer(VKVertexBuffer &vertex_buffer,
149 VKDescriptorSet::Location location) override;
150 void bind_buffer(VkDescriptorType vk_descriptor_type,
151 VkBuffer vk_buffer,
152 VkDeviceAddress vk_device_address,
153 VkDeviceSize buffer_offset,
154 VkDeviceSize size_in_bytes,
155 VKDescriptorSet::Location location) override;
156 void bind_image(VkDescriptorType vk_descriptor_type,
157 VkSampler vk_sampler,
158 VkImageView vk_image_view,
159 VkImageLayout vk_image_layout,
160 VKDescriptorSet::Location location) override;
161
162 private:
163 Vector<VkBufferView> vk_buffer_views_;
164 Vector<VkDescriptorBufferInfo> vk_descriptor_buffer_infos_;
165 Vector<VkDescriptorImageInfo> vk_descriptor_image_infos_;
166 Vector<VkWriteDescriptorSet> vk_write_descriptor_sets_;
167};
168
170 public:
171 /* Offset to the beginning of the current descriptor set. */
172 VkDeviceSize descriptor_set_head = 0;
173 /* Offset to the end (+1) of the current descriptor set. */
174 VkDeviceSize descriptor_set_tail = 0;
175 /* Current layout of the descriptor set being filled. */
177 /* Descriptor buffers */
179
180 /* Current descriptor buffer handle and offset. */
182 uint8_t *descriptor_buffer_data = nullptr;
183 VkDeviceSize descriptor_buffer_offset = 0;
184
186 VKContext &context,
188 VkDescriptorSetLayout vk_descriptor_set_layout,
189 render_graph::VKPipelineData &r_pipeline_data) override;
190
191 void upload_descriptor_sets() override;
192
193 protected:
194 void bind_texel_buffer(VKVertexBuffer &vertex_buffer,
195 VKDescriptorSet::Location location) override;
196 void bind_buffer(VkDescriptorType vk_descriptor_type,
197 VkBuffer vk_buffer,
198 VkDeviceAddress vk_device_address,
199 VkDeviceSize buffer_offset,
200 VkDeviceSize size_in_bytes,
201 VKDescriptorSet::Location location) override;
202 void bind_image(VkDescriptorType vk_descriptor_type,
203 VkSampler vk_sampler,
204 VkImageView vk_image_view,
205 VkImageLayout vk_image_layout,
206 VKDescriptorSet::Location location) override;
207
208 private:
209 inline uint8_t *get_descriptor_binding_ptr(uint32_t binding) const
210 {
211 return descriptor_buffer_data + descriptor_buffer_offset + layout.binding_offsets[binding];
212 }
213};
214
216 friend class VKDescriptorSet;
217
218 /* Last used layout to identify changes. */
219 VkDescriptorSetLayout vk_descriptor_set_layout_ = VK_NULL_HANDLE;
220
221 public:
224
226
231 void update_descriptor_set(VKContext &context,
232 render_graph::VKResourceAccessInfo &resource_access_info,
233 render_graph::VKPipelineData &r_pipeline_data);
234
239
240 private:
241};
242
243} // namespace blender::gpu
NonCopyable(const NonCopyable &other)=delete
void allocate_new_descriptor_set(VKDevice &device, VKContext &context, VKShader &shader, VkDescriptorSetLayout vk_descriptor_set_layout, render_graph::VKPipelineData &r_pipeline_data) override
void bind_texel_buffer(VKVertexBuffer &vertex_buffer, VKDescriptorSet::Location location) override
Vector< std::unique_ptr< VKBuffer > > buffers
void bind_buffer(VkDescriptorType vk_descriptor_type, VkBuffer vk_buffer, VkDeviceAddress vk_device_address, VkDeviceSize buffer_offset, VkDeviceSize size_in_bytes, VKDescriptorSet::Location location) override
void bind_image(VkDescriptorType vk_descriptor_type, VkSampler vk_sampler, VkImageView vk_image_view, VkImageLayout vk_image_layout, VKDescriptorSet::Location location) override
void bind_buffer(VkDescriptorType vk_descriptor_type, VkBuffer vk_buffer, VkDeviceAddress vk_device_address, VkDeviceSize buffer_offset, VkDeviceSize size_in_bytes, VKDescriptorSet::Location location) override
void allocate_new_descriptor_set(VKDevice &device, VKContext &context, VKShader &shader, VkDescriptorSetLayout vk_descriptor_set_layout, render_graph::VKPipelineData &r_pipeline_data) override
void bind_image(VkDescriptorType vk_descriptor_type, VkSampler vk_sampler, VkImageView vk_image_view, VkImageLayout vk_image_layout, VKDescriptorSet::Location location) override
void bind_texel_buffer(VKVertexBuffer &vertex_buffer, VKDescriptorSet::Location location) override
class VKDescriptorSetPoolUpdator descriptor_sets
void update_descriptor_set(VKContext &context, render_graph::VKResourceAccessInfo &resource_access_info, render_graph::VKPipelineData &r_pipeline_data)
class VKDescriptorBufferUpdator descriptor_buffers
void bind_shader_resources(const VKDevice &device, const VKStateManager &state_manager, VKShader &shader, render_graph::VKResourceAccessInfo &access_info)
virtual void bind_texel_buffer(VKVertexBuffer &vertex_buffer, VKDescriptorSet::Location location)=0
virtual void allocate_new_descriptor_set(VKDevice &device, VKContext &context, VKShader &shader, VkDescriptorSetLayout vk_descriptor_set_layout, render_graph::VKPipelineData &r_pipeline_data)=0
virtual void bind_buffer(VkDescriptorType vk_descriptor_type, VkBuffer vk_buffer, VkDeviceAddress vk_device_address, VkDeviceSize buffer_offset, VkDeviceSize size_in_bytes, VKDescriptorSet::Location location)=0
virtual void bind_image(VkDescriptorType vk_descriptor_type, VkSampler vk_sampler, VkImageView vk_image_view, VkImageLayout vk_image_layout, VKDescriptorSet::Location location)=0
bool operator==(const Location &other) const