Blender V5.0
vk_descriptor_set.cc
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
10#include "vk_index_buffer.hh"
11#include "vk_shader.hh"
13#include "vk_state_manager.hh"
14#include "vk_storage_buffer.hh"
15#include "vk_texture.hh"
16#include "vk_vertex_buffer.hh"
17
18namespace blender::gpu {
19
22 render_graph::VKPipelineData &r_pipeline_data)
23{
24 VKShader &shader = *unwrap(context.shader);
25 VKStateManager &state_manager = context.state_manager_get();
26
27 /* Can we reuse previous descriptor set. */
28 const VkDescriptorSetLayout shader_descriptor_set_layout = shader.vk_descriptor_set_layout_get();
29 if (!state_manager.is_dirty && vk_descriptor_set_layout_ == shader_descriptor_set_layout &&
30 shader.push_constants.layout_get().storage_type_get() !=
32 {
33 return;
34 }
35 vk_descriptor_set_layout_ = shader_descriptor_set_layout;
36 state_manager.is_dirty = false;
37
38 VKDevice &device = VKBackend::get().device;
39 VkDescriptorSetLayout vk_descriptor_set_layout = shader.vk_descriptor_set_layout_get();
41 if (device.extensions_get().descriptor_buffer) {
42 updator = &descriptor_buffers;
43 }
45 device, context, shader, vk_descriptor_set_layout, r_pipeline_data);
46 updator->bind_shader_resources(device, state_manager, shader, access_info);
47}
48
50{
51 VKDevice &device = VKBackend::get().device;
52 if (device.extensions_get().descriptor_buffer) {
53 descriptor_buffers.upload_descriptor_sets();
54 }
55 else {
56 descriptor_sets.upload_descriptor_sets();
57 }
58 vk_descriptor_set_layout_ = VK_NULL_HANDLE;
59}
60
61/* -------------------------------------------------------------------- */
64
65void VKDescriptorSetUpdator::bind_image_resource(const VKStateManager &state_manager,
66 const VKResourceBinding &resource_binding,
68{
69 VKTexture &texture = *state_manager.images_.get(resource_binding.binding);
71 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
72 VK_NULL_HANDLE,
73 texture.image_view_get(resource_binding.arrayed, VKImageViewFlags::NO_SWIZZLING).vk_handle(),
74 VK_IMAGE_LAYOUT_GENERAL,
75 resource_binding.location);
76 /* Update access info. */
77 VKSubImageRange subimage = {};
78 if (texture.is_texture_view()) {
79 IndexRange layer_range = texture.layer_range();
80 IndexRange mipmap_range = texture.mip_map_range();
81 subimage = {uint32_t(mipmap_range.start()),
82 uint32_t(mipmap_range.size()),
83 uint32_t(layer_range.start()),
84 uint32_t(layer_range.size())};
85 }
86 access_info.images.append({texture.vk_image_handle(),
87 resource_binding.access_mask,
88 to_vk_image_aspect_flag_bits(texture.device_format_get()),
89 subimage});
90}
91
92void VKDescriptorSetUpdator::bind_texture_resource(const VKDevice &device,
93 const VKStateManager &state_manager,
94 const VKResourceBinding &resource_binding,
96{
97 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(resource_binding.binding);
98 if (!elem_ptr) {
99 /* Unbound resource. */
101 return;
102 }
103 const BindSpaceTextures::Elem &elem = *elem_ptr;
104 switch (elem.resource_type) {
106 VKVertexBuffer &vertex_buffer = *static_cast<VKVertexBuffer *>(elem.resource);
107 vertex_buffer.ensure_updated();
108 bind_texel_buffer(vertex_buffer, resource_binding.location);
109 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
110 break;
111 }
113 VKTexture *texture = static_cast<VKTexture *>(elem.resource);
114 if (texture->type_ == GPU_TEXTURE_BUFFER) {
115 /* Texture buffers are no textures, but wrap around vertex buffers and need to be
116 * bound as texel buffers. */
117 /* TODO: Investigate if this can be improved in the API. */
118 VKVertexBuffer &vertex_buffer = *texture->source_buffer_;
119 vertex_buffer.ensure_updated();
120 bind_texel_buffer(vertex_buffer, resource_binding.location);
121 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
122 }
123 else {
124 const VKSampler &sampler = device.samplers().get(elem.sampler);
125 bind_image(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
126 sampler.vk_handle(),
127 texture->image_view_get(resource_binding.arrayed, VKImageViewFlags::DEFAULT)
128 .vk_handle(),
129 VK_IMAGE_LAYOUT_GENERAL,
130 resource_binding.location);
131 access_info.images.append({texture->vk_image_handle(),
132 resource_binding.access_mask,
133 to_vk_image_aspect_flag_bits(texture->device_format_get()),
134 {}});
135 }
136 break;
137 }
140 }
141 }
142}
143
144void VKDescriptorSetUpdator::bind_input_attachment_resource(
145 const VKDevice &device,
146 const VKStateManager &state_manager,
147 const VKResourceBinding &resource_binding,
149{
150 const bool supports_local_read = device.extensions_get().dynamic_rendering_local_read;
151 if (supports_local_read) {
152 VKTexture *texture = static_cast<VKTexture *>(
153 state_manager.images_.get(resource_binding.binding));
155 bind_image(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
156 VK_NULL_HANDLE,
157 texture->image_view_get(resource_binding.arrayed, VKImageViewFlags::NO_SWIZZLING)
158 .vk_handle(),
159 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR,
160 resource_binding.location);
161 VkImage vk_image = texture->vk_image_handle();
162 if (vk_image != VK_NULL_HANDLE) {
163 access_info.images.append({texture->vk_image_handle(),
164 resource_binding.access_mask,
165 to_vk_image_aspect_flag_bits(texture->device_format_get()),
166 {}});
167 }
168 }
169 else {
170 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(
171 resource_binding.binding);
172 if (!elem_ptr) {
173 /* Unbound resource. */
175 return;
176 }
177 const BindSpaceTextures::Elem &elem = *elem_ptr;
178 VKTexture *texture = static_cast<VKTexture *>(elem.resource);
180 BLI_assert(elem.resource_type == BindSpaceTextures::Type::Texture);
181 const VKSampler &sampler = device.samplers().get(elem.sampler);
183 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
184 sampler.vk_handle(),
185 texture->image_view_get(resource_binding.arrayed, VKImageViewFlags::DEFAULT).vk_handle(),
186 VK_IMAGE_LAYOUT_GENERAL,
187 resource_binding.location);
188 VkImage vk_image = texture->vk_image_handle();
189 if (vk_image != VK_NULL_HANDLE) {
190 access_info.images.append({vk_image,
191 resource_binding.access_mask,
192 to_vk_image_aspect_flag_bits(texture->device_format_get()),
193 {}});
194 }
195 }
196}
197
198void VKDescriptorSetUpdator::bind_storage_buffer_resource(
199 const VKStateManager &state_manager,
200 const VKResourceBinding &resource_binding,
202{
203 const BindSpaceStorageBuffers::Elem &elem = state_manager.storage_buffers_.get(
204 resource_binding.binding);
205 VkBuffer vk_buffer = VK_NULL_HANDLE;
206 VkDeviceSize vk_device_size = 0;
207 VkDeviceAddress vk_device_address = 0;
208 switch (elem.resource_type) {
210 VKIndexBuffer *index_buffer = static_cast<VKIndexBuffer *>(elem.resource);
211 index_buffer->ensure_updated();
212 vk_buffer = index_buffer->vk_handle();
213 vk_device_size = index_buffer->size_get() - elem.offset;
214 vk_device_address = index_buffer->device_address_get();
215 break;
216 }
218 VKVertexBuffer *vertex_buffer = static_cast<VKVertexBuffer *>(elem.resource);
219 vertex_buffer->ensure_updated();
220 vk_buffer = vertex_buffer->vk_handle();
221 vk_device_size = vertex_buffer->size_used_get() - elem.offset;
222 vk_device_address = vertex_buffer->device_address_get();
223 break;
224 }
226 VKUniformBuffer *uniform_buffer = static_cast<VKUniformBuffer *>(elem.resource);
227 uniform_buffer->ensure_updated();
228 vk_buffer = uniform_buffer->vk_handle();
229 vk_device_size = uniform_buffer->size_in_bytes() - elem.offset;
230 vk_device_address = uniform_buffer->device_address_get();
231 break;
232 }
234 VKStorageBuffer *storage_buffer = static_cast<VKStorageBuffer *>(elem.resource);
235 storage_buffer->ensure_allocated();
236 vk_buffer = storage_buffer->vk_handle();
237 vk_device_size = storage_buffer->usage_size_get();
238 vk_device_address = storage_buffer->device_address_get();
239 break;
240 }
242 VKBuffer *buffer = static_cast<VKBuffer *>(elem.resource);
243 vk_buffer = buffer->vk_handle();
244 vk_device_size = buffer->size_in_bytes() - elem.offset;
245 vk_device_address = buffer->device_address_get();
246 break;
247 }
250 }
251 }
252
253 bind_buffer(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
254 vk_buffer,
255 vk_device_address,
256 elem.offset,
257 vk_device_size,
258 resource_binding.location);
259 if (vk_buffer != VK_NULL_HANDLE) {
260 access_info.buffers.append({vk_buffer, resource_binding.access_mask});
261 }
262}
263
264void VKDescriptorSetUpdator::bind_uniform_buffer_resource(
265 const VKStateManager &state_manager,
266 const VKResourceBinding &resource_binding,
268{
269 VKUniformBuffer &uniform_buffer = *state_manager.uniform_buffers_.get(resource_binding.binding);
270 uniform_buffer.ensure_updated();
271 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
272 uniform_buffer.vk_handle(),
273 uniform_buffer.device_address_get(),
274 0,
275 uniform_buffer.size_in_bytes(),
276 resource_binding.location);
277 access_info.buffers.append({uniform_buffer.vk_handle(), resource_binding.access_mask});
278}
279
280void VKDescriptorSetUpdator::bind_push_constants(VKPushConstants &push_constants,
282{
283 if (push_constants.layout_get().storage_type_get() !=
285 {
286 return;
287 }
288 push_constants.update_uniform_buffer();
289 const VKUniformBuffer &uniform_buffer = *push_constants.uniform_buffer_get().get();
290 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
291 uniform_buffer.vk_handle(),
292 uniform_buffer.device_address_get(),
293 0,
294 uniform_buffer.size_in_bytes(),
295 push_constants.layout_get().descriptor_set_location_get());
296 access_info.buffers.append({uniform_buffer.vk_handle(), VK_ACCESS_UNIFORM_READ_BIT});
297}
298
300 const VKStateManager &state_manager,
303{
304 const VKShaderInterface &shader_interface = shader.interface_get();
305 for (const VKResourceBinding &resource_binding : shader_interface.resource_bindings_get()) {
306 if (resource_binding.binding == -1) {
307 continue;
308 }
309
310 switch (resource_binding.bind_type) {
312 bind_uniform_buffer_resource(state_manager, resource_binding, access_info);
313 break;
314
316 bind_storage_buffer_resource(state_manager, resource_binding, access_info);
317 break;
318
320 bind_texture_resource(device, state_manager, resource_binding, access_info);
321 break;
322
324 bind_image_resource(state_manager, resource_binding, access_info);
325 break;
326
328 bind_input_attachment_resource(device, state_manager, resource_binding, access_info);
329 break;
330 }
331 }
332
333 /* Bind uniform push constants to descriptor set. */
334 bind_push_constants(shader.push_constants, access_info);
335}
336
338
339/* -------------------------------------------------------------------- */
342
344 VKDevice & /*device*/,
345 VKContext &context,
347 VkDescriptorSetLayout vk_descriptor_set_layout,
348 render_graph::VKPipelineData &r_pipeline_data)
349{
350 /* Use descriptor pools/sets. */
351 vk_descriptor_set = context.descriptor_pools_get().allocate(vk_descriptor_set_layout);
352 BLI_assert(vk_descriptor_set != VK_NULL_HANDLE);
354 r_pipeline_data.vk_descriptor_set = vk_descriptor_set;
355}
356
357void VKDescriptorSetPoolUpdator::bind_buffer(VkDescriptorType vk_descriptor_type,
358 VkBuffer vk_buffer,
359 VkDeviceAddress /*vk_device_address*/,
360 VkDeviceSize buffer_offset,
361 VkDeviceSize size_in_bytes,
363{
364 if (vk_buffer == VK_NULL_HANDLE) {
365 vk_descriptor_buffer_infos_.append({VK_NULL_HANDLE, 0, VK_WHOLE_SIZE});
366 }
367 else {
368 vk_descriptor_buffer_infos_.append({vk_buffer, buffer_offset, size_in_bytes});
369 }
370 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
371 nullptr,
373 location,
374 0,
375 1,
376 vk_descriptor_type,
377 nullptr,
378 nullptr,
379 nullptr});
380}
381
383 const VKDescriptorSet::Location location)
384{
385 vertex_buffer.ensure_buffer_view();
386 vk_buffer_views_.append(vertex_buffer.vk_buffer_view_get());
387 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
388 nullptr,
390 location,
391 0,
392 1,
393 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
394 nullptr,
395 nullptr,
396 nullptr});
397}
398
399void VKDescriptorSetPoolUpdator::bind_image(VkDescriptorType vk_descriptor_type,
400 VkSampler vk_sampler,
401 VkImageView vk_image_view,
402 VkImageLayout vk_image_layout,
404{
405 vk_descriptor_image_infos_.append({vk_sampler, vk_image_view, vk_image_layout});
406 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
407 nullptr,
409 location,
410 0,
411 1,
412 vk_descriptor_type,
413 nullptr,
414 nullptr,
415 nullptr});
416}
417
419{
420 if (vk_write_descriptor_sets_.is_empty()) {
421 return;
422 }
423
424 /* Finalize pointers that could have changed due to reallocations. */
425 int buffer_index = 0;
426 int buffer_view_index = 0;
427 int image_index = 0;
428 for (VkWriteDescriptorSet &vk_write_descriptor_set : vk_write_descriptor_sets_) {
429 switch (vk_write_descriptor_set.descriptorType) {
430 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
431 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
432 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
433 vk_write_descriptor_set.pImageInfo = &vk_descriptor_image_infos_[image_index++];
434 break;
435
436 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
437 vk_write_descriptor_set.pTexelBufferView = &vk_buffer_views_[buffer_view_index++];
438 break;
439
440 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
441 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
442 vk_write_descriptor_set.pBufferInfo = &vk_descriptor_buffer_infos_[buffer_index++];
443 break;
444
445 default:
447 break;
448 }
449 }
450
451#if 0
452 /* Uncomment this for rebalancing VKDescriptorPools::POOL_SIZE_* */
453 {
454 int storage_buffer_count = 0;
455 int storage_image_count = 0;
456 int combined_image_sampler_count = 0;
457 int uniform_buffer_count = 0;
458 int uniform_texel_buffer_count = 0;
459 int input_attachment_count = 0;
460 Set<VkDescriptorSet> descriptor_set_count;
461
462 for (VkWriteDescriptorSet &vk_write_descriptor_set : vk_write_descriptor_sets_) {
463 descriptor_set_count.add(vk_write_descriptor_set.dstSet);
464 switch (vk_write_descriptor_set.descriptorType) {
465 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
466 combined_image_sampler_count += 1;
467 break;
468 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
469 storage_image_count += 1;
470 break;
471 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
472 uniform_texel_buffer_count += 1;
473 break;
474 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
475 uniform_buffer_count += 1;
476 break;
477 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
478 storage_buffer_count += 1;
479 break;
480 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
481 input_attachment_count += 1;
482 break;
483 default:
485 }
486 }
487 std::cout << __func__ << ": "
488 << "descriptor_set=" << descriptor_set_count.size()
489 << ", combined_image_sampler=" << combined_image_sampler_count
490 << ", storage_image=" << storage_image_count
491 << ", uniform_texel_buffer=" << uniform_texel_buffer_count
492 << ", uniform_buffer=" << uniform_buffer_count
493 << ", storage_buffer=" << storage_buffer_count
494 << ", input_attachment=" << input_attachment_count << "\n";
495 }
496#endif
497
498 /* Update the descriptor set on the device. */
499 const VKDevice &device = VKBackend::get().device;
500 vkUpdateDescriptorSets(device.vk_handle(),
501 vk_write_descriptor_sets_.size(),
502 vk_write_descriptor_sets_.data(),
503 0,
504 nullptr);
505
506 vk_descriptor_image_infos_.clear();
507 vk_descriptor_buffer_infos_.clear();
508 vk_buffer_views_.clear();
509 vk_write_descriptor_sets_.clear();
510}
511
513
514/* -------------------------------------------------------------------- */
517
519 VKDevice &device,
520 VKContext & /*context*/,
521 VKShader & /*shader*/,
522 VkDescriptorSetLayout vk_descriptor_set_layout,
523 render_graph::VKPipelineData &r_pipeline_data)
524{
525 /* Use descriptor buffer. */
528 vk_descriptor_set_layout);
529
530 /* Ensure if there is still place left in the current buffer. */
531 if (buffers.is_empty() ||
532 layout.size > buffers.last().get()->size_in_bytes() - descriptor_set_head)
533 {
534 const VkDeviceSize default_buffer_size = 8 * 1024 * 1024;
535 buffers.append(std::make_unique<VKBuffer>());
536 VKBuffer *buffer = buffers.last().get();
537 buffer->create(default_buffer_size,
538 VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT |
539 VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,
540 VMA_MEMORY_USAGE_AUTO,
541 VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT,
542 0.8f);
543 debug::object_label(buffer->vk_handle(), "DescriptorBuffer");
544 descriptor_buffer_data = static_cast<uint8_t *>(buffer->mapped_memory_get());
549 }
550
552
553 /* Update the current descriptor buffer and its offset to point to the active descriptor set. */
555
558}
559
560void VKDescriptorBufferUpdator::bind_buffer(VkDescriptorType vk_descriptor_type,
561 VkBuffer /*vk_buffer*/,
562 VkDeviceAddress vk_device_address,
563 VkDeviceSize buffer_offset,
564 VkDeviceSize size_in_bytes,
566{
567 BLI_assert(vk_device_address != 0);
568 VKDevice &device = VKBackend::get().device;
569 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
571 VkDescriptorAddressInfoEXT descriptor_address_info = {
572 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
573 nullptr,
574 vk_device_address + buffer_offset,
575 size_in_bytes};
576
577 VkDescriptorGetInfoEXT vk_descriptor_get_info{
578 VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, nullptr, vk_descriptor_type};
579 VkDeviceSize descriptor_size = 0;
580 switch (vk_descriptor_type) {
581 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
582 vk_descriptor_get_info.data.pUniformBuffer = &descriptor_address_info;
583 descriptor_size = vk_descriptor_buffer_properties.uniformBufferDescriptorSize;
584 break;
585
586 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
587 vk_descriptor_get_info.data.pStorageBuffer = &descriptor_address_info;
588 descriptor_size = vk_descriptor_buffer_properties.storageBufferDescriptorSize;
589 break;
590
591 default:
593 }
594
595 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
597 device.vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
598}
599
601 const VKDescriptorSet::Location location)
602{
603 VkDeviceAddress vk_device_address = vertex_buffer.device_address_get();
604 BLI_assert(vk_device_address != 0);
605 VKDevice &device = VKBackend::get().device;
606 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
608 VkDescriptorAddressInfoEXT descriptor_address_info = {
609 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
610 nullptr,
611 vk_device_address,
612 vertex_buffer.size_used_get(),
613 vertex_buffer.to_vk_format()};
614
615 VkDescriptorGetInfoEXT vk_descriptor_get_info{
616 VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, nullptr, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER};
617 vk_descriptor_get_info.data.pUniformTexelBuffer = &descriptor_address_info;
618 VkDeviceSize descriptor_size = vk_descriptor_buffer_properties.uniformTexelBufferDescriptorSize;
619
620 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
622 device.vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
623}
624
625void VKDescriptorBufferUpdator::bind_image(VkDescriptorType vk_descriptor_type,
626 VkSampler vk_sampler,
627 VkImageView vk_image_view,
628 VkImageLayout vk_image_layout,
630{
631 VKDevice &device = VKBackend::get().device;
632 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
634 VkDescriptorImageInfo vk_descriptor_image_info = {vk_sampler, vk_image_view, vk_image_layout};
635 VkDescriptorGetInfoEXT vk_descriptor_get_info{
636 VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, nullptr, vk_descriptor_type};
637 VkDeviceSize descriptor_size = 0;
638 switch (vk_descriptor_type) {
639 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
640 vk_descriptor_get_info.data.pCombinedImageSampler = &vk_descriptor_image_info;
641 descriptor_size = vk_descriptor_buffer_properties.combinedImageSamplerDescriptorSize;
642 break;
643
644 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
645 vk_descriptor_get_info.data.pStorageImage = &vk_descriptor_image_info;
646 descriptor_size = vk_descriptor_buffer_properties.storageImageDescriptorSize;
647 break;
648
649 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
650 vk_descriptor_get_info.data.pInputAttachmentImage = &vk_descriptor_image_info;
651 descriptor_size = vk_descriptor_buffer_properties.inputAttachmentDescriptorSize;
652 break;
653
654 default:
656 }
657
658 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
660 device.vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
661}
662
664{
665 /* Buffers have already been updated. only need to discard the buffers. */
666 buffers.clear();
667 descriptor_buffer_data = nullptr;
670}
671
673
674} // namespace blender::gpu
#define BLI_assert_unreachable()
Definition BLI_assert.h:93
#define BLI_assert(a)
Definition BLI_assert.h:46
constexpr int64_t size() const
constexpr int64_t start() const
int64_t size() const
Definition BLI_set.hh:587
bool add(const Key &key)
Definition BLI_set.hh:248
VKTexture * get(int binding) const
static VKBackend & get()
Definition vk_backend.hh:91
VkDeviceAddress device_address_get() const
Definition vk_buffer.hh:113
VkBuffer vk_handle() const
Definition vk_buffer.hh:101
bool create(size_t size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage vma_memory_usage, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
Definition vk_buffer.cc:27
void * mapped_memory_get() const
Definition vk_buffer.hh:134
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
VKDescriptorBufferLayout descriptor_buffer_layout_get(VkDescriptorSetLayout vk_descriptor_set_layout)
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
VKDescriptorSetLayouts & descriptor_set_layouts_get()
Definition vk_device.hh:326
VkDevice vk_handle() const
Definition vk_device.hh:311
const VKExtensions & extensions_get() const
Definition vk_device.hh:371
PFN_vkGetDescriptorEXT vkGetDescriptor
Definition vk_device.hh:251
const VkPhysicalDeviceDescriptorBufferPropertiesEXT & physical_device_descriptor_buffer_properties_get() const
Definition vk_device.hh:286
struct blender::gpu::VKDevice::@152120360333013146246346216002113345357100126073 functions
const Span< VKResourceBinding > resource_bindings_get() const
VkDeviceAddress device_address_get() const
VkBufferView vk_buffer_view_get() const
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
void object_label(GLenum type, GLuint object, const char *name)
Definition gl_debug.cc:329
static Context * unwrap(GPUContext *ctx)
VkImageAspectFlags to_vk_image_aspect_flag_bits(const TextureFormat format)
Definition vk_common.cc:14
VKDescriptorSet::Location location