20void VKDescriptorSetTracker::bind_buffer(VkDescriptorType vk_descriptor_type,
22 VkDeviceSize size_in_bytes,
23 VKDescriptorSet::Location location)
25 vk_descriptor_buffer_infos_.
append({vk_buffer, 0, size_in_bytes});
26 vk_write_descriptor_sets_.
append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
38void VKDescriptorSetTracker::bind_texel_buffer(VkBufferView vk_buffer_view,
39 const VKDescriptorSet::Location location)
41 vk_buffer_views_.
append(vk_buffer_view);
42 vk_write_descriptor_sets_.
append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
48 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
54void VKDescriptorSetTracker::bind_image(VkDescriptorType vk_descriptor_type,
56 VkImageView vk_image_view,
57 VkImageLayout vk_image_layout,
58 VKDescriptorSet::Location location)
60 vk_descriptor_image_infos_.
append({vk_sampler, vk_image_view, vk_image_layout});
61 vk_write_descriptor_sets_.
append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
73void VKDescriptorSetTracker::bind_image_resource(
const VKStateManager &state_manager,
74 const VKResourceBinding &resource_binding,
75 render_graph::VKResourceAccessInfo &access_info)
77 VKTexture &texture = *state_manager.images_.get(resource_binding.binding);
78 bind_image(VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
80 texture.image_view_get(resource_binding.arrayed).vk_handle(),
81 VK_IMAGE_LAYOUT_GENERAL,
82 resource_binding.location);
85 uint32_t layer_count = VK_REMAINING_ARRAY_LAYERS;
87 IndexRange layer_range = texture.layer_range();
88 layer_base = layer_range.start();
89 layer_count = layer_range.size();
91 access_info.images.append({texture.vk_image_handle(),
92 resource_binding.access_mask,
98void VKDescriptorSetTracker::bind_texture_resource(
const VKDevice &device,
99 const VKStateManager &state_manager,
100 const VKResourceBinding &resource_binding,
101 render_graph::VKResourceAccessInfo &access_info)
103 const BindSpaceTextures::Elem &elem = state_manager.textures_.get(resource_binding.binding);
104 switch (elem.resource_type) {
106 VKVertexBuffer *vertex_buffer =
static_cast<VKVertexBuffer *
>(elem.resource);
107 vertex_buffer->ensure_updated();
108 vertex_buffer->ensure_buffer_view();
109 bind_texel_buffer(vertex_buffer->vk_buffer_view_get(), resource_binding.location);
110 access_info.buffers.append({vertex_buffer->vk_handle(), resource_binding.access_mask});
114 VKTexture *texture =
static_cast<VKTexture *
>(elem.resource);
116 const VKSampler &
sampler = device.samplers().get(elem.sampler);
117 bind_image(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
119 texture->image_view_get(resource_binding.arrayed).vk_handle(),
120 VK_IMAGE_LAYOUT_GENERAL,
121 resource_binding.location);
122 access_info.images.append({texture->vk_image_handle(),
123 resource_binding.access_mask,
126 VK_REMAINING_ARRAY_LAYERS});
132 VKVertexBuffer *vertex_buffer = texture->source_buffer_;
133 vertex_buffer->ensure_updated();
134 vertex_buffer->ensure_buffer_view();
135 bind_texel_buffer(vertex_buffer->vk_buffer_view_get(), resource_binding.location);
136 access_info.buffers.append({vertex_buffer->vk_handle(), resource_binding.access_mask});
146void VKDescriptorSetTracker::bind_storage_buffer_resource(
147 const VKStateManager &state_manager,
148 const VKResourceBinding &resource_binding,
149 render_graph::VKResourceAccessInfo &access_info)
151 const BindSpaceStorageBuffers::Elem &elem = state_manager.storage_buffers_.get(
152 resource_binding.binding);
153 VkBuffer vk_buffer = VK_NULL_HANDLE;
154 VkDeviceSize vk_device_size = 0;
155 switch (elem.resource_type) {
157 VKIndexBuffer *index_buffer =
static_cast<VKIndexBuffer *
>(elem.resource);
158 index_buffer->ensure_updated();
159 vk_buffer = index_buffer->vk_handle();
160 vk_device_size = index_buffer->size_get();
164 VKVertexBuffer *vertex_buffer =
static_cast<VKVertexBuffer *
>(elem.resource);
165 vertex_buffer->ensure_updated();
166 vk_buffer = vertex_buffer->vk_handle();
167 vk_device_size = vertex_buffer->size_used_get();
171 VKUniformBuffer *uniform_buffer =
static_cast<VKUniformBuffer *
>(elem.resource);
172 uniform_buffer->ensure_updated();
173 vk_buffer = uniform_buffer->vk_handle();
174 vk_device_size = uniform_buffer->size_in_bytes();
178 VKStorageBuffer *storage_buffer =
static_cast<VKStorageBuffer *
>(elem.resource);
179 storage_buffer->ensure_allocated();
180 vk_buffer = storage_buffer->vk_handle();
181 vk_device_size = storage_buffer->size_in_bytes();
190 VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, vk_buffer, vk_device_size, resource_binding.location);
191 access_info.buffers.append({vk_buffer, resource_binding.access_mask});
194void VKDescriptorSetTracker::bind_uniform_buffer_resource(
195 const VKStateManager &state_manager,
196 const VKResourceBinding &resource_binding,
197 render_graph::VKResourceAccessInfo &access_info)
199 VKUniformBuffer &uniform_buffer = *state_manager.uniform_buffers_.get(resource_binding.binding);
200 uniform_buffer.ensure_updated();
201 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
202 uniform_buffer.vk_handle(),
203 uniform_buffer.size_in_bytes(),
204 resource_binding.location);
205 access_info.buffers.append({uniform_buffer.vk_handle(), resource_binding.access_mask});
208void VKDescriptorSetTracker::bind_push_constants(VKPushConstants &push_constants,
209 render_graph::VKResourceAccessInfo &access_info)
211 if (push_constants.layout_get().storage_type_get() !=
216 push_constants.update_uniform_buffer();
217 const VKUniformBuffer &uniform_buffer = *push_constants.uniform_buffer_get().get();
218 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
219 uniform_buffer.vk_handle(),
220 uniform_buffer.size_in_bytes(),
221 push_constants.layout_get().descriptor_set_location_get());
222 access_info.buffers.append({uniform_buffer.vk_handle(), VK_ACCESS_UNIFORM_READ_BIT});
225void VKDescriptorSetTracker::bind_shader_resources(
const VKDevice &device,
226 const VKStateManager &state_manager,
228 render_graph::VKResourceAccessInfo &access_info)
230 const VKShaderInterface &shader_interface = shader.interface_get();
231 for (
const VKResourceBinding &resource_binding : shader_interface.resource_bindings_get()) {
232 if (resource_binding.binding == -1) {
236 switch (resource_binding.bind_type) {
238 bind_image_resource(state_manager, resource_binding, access_info);
242 bind_texture_resource(device, state_manager, resource_binding, access_info);
246 bind_storage_buffer_resource(state_manager, resource_binding, access_info);
250 bind_uniform_buffer_resource(state_manager, resource_binding, access_info);
256 bind_push_constants(shader.push_constants, access_info);
268 shader.push_constants.layout_get().storage_type_get() !=
276 VkDescriptorSetLayout vk_descriptor_set_layout = shader.vk_descriptor_set_layout_get();
277 vk_descriptor_set = context.descriptor_pools_get().allocate(vk_descriptor_set_layout);
281 bind_shader_resources(device, state_manager, shader, access_info);
286 if (vk_write_descriptor_sets_.
is_empty()) {
291 int buffer_index = 0;
292 int buffer_view_index = 0;
294 for (
int write_index : vk_write_descriptor_sets_.
index_range()) {
295 VkWriteDescriptorSet &vk_write_descriptor_set = vk_write_descriptor_sets_[write_index++];
296 switch (vk_write_descriptor_set.descriptorType) {
297 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
298 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
299 vk_write_descriptor_set.pImageInfo = &vk_descriptor_image_infos_[image_index++];
302 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
303 vk_write_descriptor_set.pTexelBufferView = &vk_buffer_views_[buffer_view_index++];
306 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
307 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
308 vk_write_descriptor_set.pBufferInfo = &vk_descriptor_buffer_infos_[buffer_index++];
319 vkUpdateDescriptorSets(device.
vk_handle(),
320 vk_write_descriptor_sets_.
size(),
321 vk_write_descriptor_sets_.
data(),
325 vk_descriptor_image_infos_.
clear();
326 vk_descriptor_buffer_infos_.
clear();
327 vk_buffer_views_.
clear();
328 vk_write_descriptor_sets_.
clear();
#define BLI_assert_unreachable()
void append(const T &value)
IndexRange index_range() const
void update_descriptor_set(VKContext &context, render_graph::VKResourceAccessInfo &resource_access_info)
VkDescriptorSet vk_descriptor_set
void upload_descriptor_sets()
VkDevice vk_handle() const
local_group_size(16, 16) .push_constant(Type local_group_size(16, 16) .push_constant(Type input_tx sampler(1, ImageType::FLOAT_2D, "matte_tx") .image(0
void object_label(GLenum type, GLuint object, const char *name)
static Context * unwrap(GPUContext *ctx)
VkImageAspectFlags to_vk_image_aspect_flag_bits(const eGPUTextureFormat format)
bool assign_if_different(T &old_value, T new_value)