Blender V4.5
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"
22#include "vk_uniform_buffer.hh"
23
24namespace blender::gpu {
26class VKStateManager;
27class VKDevice;
28class VKPushConstants;
29class VKShader;
31class VKVertexBuffer;
32
42
43 public:
55 struct Location {
57 friend class VKShaderInterface;
58 friend struct VKResourceBinding;
59
60 private:
64 uint32_t binding;
65
66 Location(uint32_t binding) : binding(binding) {}
67
68 public:
69 Location() = default;
70
71 bool operator==(const Location &other) const
72 {
73 return binding == other.binding;
74 }
75
76 operator uint32_t() const
77 {
78 return binding;
79 }
80 };
81};
82
84 public:
86
88 VKContext &context,
90 VkDescriptorSetLayout vk_descriptor_set_layout,
91 render_graph::VKPipelineData &r_pipeline_data) = 0;
92 void bind_shader_resources(const VKDevice &device,
93 const VKStateManager &state_manager,
96 virtual void upload_descriptor_sets() = 0;
97
98 private:
99 void bind_image_resource(const VKStateManager &state_manager,
100 const VKResourceBinding &resource_binding,
102 void bind_texture_resource(const VKDevice &device,
103 const VKStateManager &state_manager,
104 const VKResourceBinding &resource_binding,
106 void bind_storage_buffer_resource(const VKStateManager &state_manager,
107 const VKResourceBinding &resource_binding,
109 void bind_uniform_buffer_resource(const VKStateManager &state_manager,
110 const VKResourceBinding &resource_binding,
112 void bind_input_attachment_resource(const VKDevice &device,
113 const VKStateManager &state_manager,
114 const VKResourceBinding &resource_binding,
116
117 void bind_push_constants(VKPushConstants &push_constants,
119
120 protected:
121 virtual void bind_texel_buffer(VKVertexBuffer &vertex_buffer,
122 VKDescriptorSet::Location location) = 0;
123 virtual void bind_buffer(VkDescriptorType vk_descriptor_type,
124 VkBuffer vk_buffer,
125 VkDeviceAddress vk_device_address,
126 VkDeviceSize buffer_offset,
127 VkDeviceSize size_in_bytes,
128 VKDescriptorSet::Location location) = 0;
129 virtual void bind_image(VkDescriptorType vk_descriptor_type,
130 VkSampler vk_sampler,
131 VkImageView vk_image_view,
132 VkImageLayout vk_image_layout,
133 VKDescriptorSet::Location location) = 0;
134};
135
137 public:
138 VkDescriptorSet vk_descriptor_set = VK_NULL_HANDLE;
139
141 VKContext &context,
143 VkDescriptorSetLayout vk_descriptor_set_layout,
144 render_graph::VKPipelineData &r_pipeline_data) override;
145
146 void upload_descriptor_sets() override;
147
148 protected:
149 void bind_texel_buffer(VKVertexBuffer &vertex_buffer,
150 VKDescriptorSet::Location location) override;
151 void bind_buffer(VkDescriptorType vk_descriptor_type,
152 VkBuffer vk_buffer,
153 VkDeviceAddress vk_device_address,
154 VkDeviceSize buffer_offset,
155 VkDeviceSize size_in_bytes,
156 VKDescriptorSet::Location location) override;
157 void bind_image(VkDescriptorType vk_descriptor_type,
158 VkSampler vk_sampler,
159 VkImageView vk_image_view,
160 VkImageLayout vk_image_layout,
161 VKDescriptorSet::Location location) override;
162
163 private:
164 Vector<VkBufferView> vk_buffer_views_;
165 Vector<VkDescriptorBufferInfo> vk_descriptor_buffer_infos_;
166 Vector<VkDescriptorImageInfo> vk_descriptor_image_infos_;
167 Vector<VkWriteDescriptorSet> vk_write_descriptor_sets_;
168};
169
171 public:
172 /* Offset to the beginning of the current descriptor set. */
173 VkDeviceSize descriptor_set_head = 0;
174 /* Offset to the end (+1) of the current descriptor set. */
175 VkDeviceSize descriptor_set_tail = 0;
176 /* Current layout of the descriptor set being filled. */
178 /* Descriptor buffers */
180
181 /* Current descriptor buffer handle and offset. */
183 uint8_t *descriptor_buffer_data = nullptr;
184 VkDeviceSize descriptor_buffer_offset = 0;
185
187 VKContext &context,
189 VkDescriptorSetLayout vk_descriptor_set_layout,
190 render_graph::VKPipelineData &r_pipeline_data) override;
191
192 void upload_descriptor_sets() override;
193
194 protected:
195 void bind_texel_buffer(VKVertexBuffer &vertex_buffer,
196 VKDescriptorSet::Location location) override;
197 void bind_buffer(VkDescriptorType vk_descriptor_type,
198 VkBuffer vk_buffer,
199 VkDeviceAddress vk_device_address,
200 VkDeviceSize buffer_offset,
201 VkDeviceSize size_in_bytes,
202 VKDescriptorSet::Location location) override;
203 void bind_image(VkDescriptorType vk_descriptor_type,
204 VkSampler vk_sampler,
205 VkImageView vk_image_view,
206 VkImageLayout vk_image_layout,
207 VKDescriptorSet::Location location) override;
208
209 private:
210 inline uint8_t *get_descriptor_binding_ptr(uint32_t binding) const
211 {
212 return descriptor_buffer_data + descriptor_buffer_offset + layout.binding_offsets[binding];
213 }
214};
215
217 friend class VKDescriptorSet;
218
219 /* Last used layout to identify changes. */
220 VkDescriptorSetLayout vk_descriptor_set_layout_ = VK_NULL_HANDLE;
221
222 public:
225
227
232 void update_descriptor_set(VKContext &context,
233 render_graph::VKResourceAccessInfo &resource_access_info,
234 render_graph::VKPipelineData &r_pipeline_data);
235
242
243 private:
244};
245
246} // 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