Blender V4.5
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 if (!state_manager.is_dirty &&
29 !assign_if_different(vk_descriptor_set_layout_, shader.vk_descriptor_set_layout_get()) &&
30 shader.push_constants.layout_get().storage_type_get() !=
32 {
33 return;
34 }
35 state_manager.is_dirty = false;
36
37 VKDevice &device = VKBackend::get().device;
38 VkDescriptorSetLayout vk_descriptor_set_layout = shader.vk_descriptor_set_layout_get();
40 if (device.extensions_get().descriptor_buffer) {
41 updator = &descriptor_buffers;
42 }
44 device, context, shader, vk_descriptor_set_layout, r_pipeline_data);
45 updator->bind_shader_resources(device, state_manager, shader, access_info);
46}
47
49{
50 VKDevice &device = VKBackend::get().device;
51 if (device.extensions_get().descriptor_buffer) {
52 descriptor_buffers.upload_descriptor_sets();
53 }
54 else {
55 descriptor_sets.upload_descriptor_sets();
56 }
57 vk_descriptor_set_layout_ = VK_NULL_HANDLE;
58}
59
60/* -------------------------------------------------------------------- */
63
64void VKDescriptorSetUpdator::bind_image_resource(const VKStateManager &state_manager,
65 const VKResourceBinding &resource_binding,
67{
68 VKTexture &texture = *state_manager.images_.get(resource_binding.binding);
70 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
71 VK_NULL_HANDLE,
72 texture.image_view_get(resource_binding.arrayed, VKImageViewFlags::NO_SWIZZLING).vk_handle(),
73 VK_IMAGE_LAYOUT_GENERAL,
74 resource_binding.location);
75 /* Update access info. */
76 uint32_t layer_base = 0;
77 uint32_t layer_count = VK_REMAINING_ARRAY_LAYERS;
78 if (resource_binding.arrayed == VKImageViewArrayed::ARRAYED && texture.is_texture_view()) {
79 IndexRange layer_range = texture.layer_range();
80 layer_base = layer_range.start();
81 layer_count = layer_range.size();
82 }
83 access_info.images.append({texture.vk_image_handle(),
84 resource_binding.access_mask,
85 to_vk_image_aspect_flag_bits(texture.device_format_get()),
86 layer_base,
87 layer_count});
88}
89
90void VKDescriptorSetUpdator::bind_texture_resource(const VKDevice &device,
91 const VKStateManager &state_manager,
92 const VKResourceBinding &resource_binding,
94{
95 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(resource_binding.binding);
96 if (!elem_ptr) {
97 /* Unbound resource. */
99 return;
100 }
101 const BindSpaceTextures::Elem &elem = *elem_ptr;
102 switch (elem.resource_type) {
104 VKVertexBuffer &vertex_buffer = *static_cast<VKVertexBuffer *>(elem.resource);
105 vertex_buffer.ensure_updated();
106 bind_texel_buffer(vertex_buffer, resource_binding.location);
107 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
108 break;
109 }
111 VKTexture *texture = static_cast<VKTexture *>(elem.resource);
112 if (texture->type_ == GPU_TEXTURE_BUFFER) {
113 /* Texture buffers are no textures, but wrap around vertex buffers and need to be
114 * bound as texel buffers. */
115 /* TODO: Investigate if this can be improved in the API. */
116 VKVertexBuffer &vertex_buffer = *texture->source_buffer_;
117 vertex_buffer.ensure_updated();
118 bind_texel_buffer(vertex_buffer, resource_binding.location);
119 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
120 }
121 else {
122 const VKSampler &sampler = device.samplers().get(elem.sampler);
123 bind_image(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
124 sampler.vk_handle(),
125 texture->image_view_get(resource_binding.arrayed, VKImageViewFlags::DEFAULT)
126 .vk_handle(),
127 VK_IMAGE_LAYOUT_GENERAL,
128 resource_binding.location);
129 access_info.images.append({texture->vk_image_handle(),
130 resource_binding.access_mask,
131 to_vk_image_aspect_flag_bits(texture->device_format_get()),
132 0,
133 VK_REMAINING_ARRAY_LAYERS});
134 }
135 break;
136 }
139 }
140 }
141}
142
143void VKDescriptorSetUpdator::bind_input_attachment_resource(
144 const VKDevice &device,
145 const VKStateManager &state_manager,
146 const VKResourceBinding &resource_binding,
148{
149 const bool supports_local_read = device.extensions_get().dynamic_rendering_local_read;
150 if (supports_local_read) {
151 VKTexture *texture = static_cast<VKTexture *>(
152 state_manager.images_.get(resource_binding.binding));
154 bind_image(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
155 VK_NULL_HANDLE,
156 texture->image_view_get(resource_binding.arrayed, VKImageViewFlags::NO_SWIZZLING)
157 .vk_handle(),
158 VK_IMAGE_LAYOUT_RENDERING_LOCAL_READ_KHR,
159 resource_binding.location);
160 VkImage vk_image = texture->vk_image_handle();
161 if (vk_image != VK_NULL_HANDLE) {
162 access_info.images.append({texture->vk_image_handle(),
163 resource_binding.access_mask,
164 to_vk_image_aspect_flag_bits(texture->device_format_get()),
165 0,
166 VK_REMAINING_ARRAY_LAYERS});
167 }
168 }
169 else {
170 bool supports_dynamic_rendering = device.extensions_get().dynamic_rendering;
171 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(
172 resource_binding.binding);
173 if (!elem_ptr) {
174 /* Unbound resource. */
176 return;
177 }
178 const BindSpaceTextures::Elem &elem = *elem_ptr;
179 VKTexture *texture = static_cast<VKTexture *>(elem.resource);
181 BLI_assert(elem.resource_type == BindSpaceTextures::Type::Texture);
182 if (supports_dynamic_rendering) {
183 const VKSampler &sampler = device.samplers().get(elem.sampler);
185 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
186 sampler.vk_handle(),
187 texture->image_view_get(resource_binding.arrayed, VKImageViewFlags::DEFAULT).vk_handle(),
188 VK_IMAGE_LAYOUT_GENERAL,
189 resource_binding.location);
190 VkImage vk_image = texture->vk_image_handle();
191 if (vk_image != VK_NULL_HANDLE) {
192 access_info.images.append({vk_image,
193 resource_binding.access_mask,
194 to_vk_image_aspect_flag_bits(texture->device_format_get()),
195 0,
196 VK_REMAINING_ARRAY_LAYERS});
197 }
198 }
199 else {
200 /* Fall back to render-passes / sub-passes. */
201 bind_image(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
202 VK_NULL_HANDLE,
203 texture->image_view_get(resource_binding.arrayed, VKImageViewFlags::NO_SWIZZLING)
204 .vk_handle(),
205 VK_IMAGE_LAYOUT_GENERAL,
206 resource_binding.location);
207 VkImage vk_image = texture->vk_image_handle();
208 if (vk_image != VK_NULL_HANDLE) {
209 access_info.images.append({vk_image,
210 resource_binding.access_mask,
211 to_vk_image_aspect_flag_bits(texture->device_format_get()),
212 0,
213 VK_REMAINING_ARRAY_LAYERS});
214 }
215 }
216 }
217}
218
219void VKDescriptorSetUpdator::bind_storage_buffer_resource(
220 const VKStateManager &state_manager,
221 const VKResourceBinding &resource_binding,
223{
224 const BindSpaceStorageBuffers::Elem &elem = state_manager.storage_buffers_.get(
225 resource_binding.binding);
226 VkBuffer vk_buffer = VK_NULL_HANDLE;
227 VkDeviceSize vk_device_size = 0;
228 VkDeviceAddress vk_device_address = 0;
229 switch (elem.resource_type) {
231 VKIndexBuffer *index_buffer = static_cast<VKIndexBuffer *>(elem.resource);
232 index_buffer->ensure_updated();
233 vk_buffer = index_buffer->vk_handle();
234 vk_device_size = index_buffer->size_get();
235 vk_device_address = index_buffer->device_address_get();
236 break;
237 }
239 VKVertexBuffer *vertex_buffer = static_cast<VKVertexBuffer *>(elem.resource);
240 vertex_buffer->ensure_updated();
241 vk_buffer = vertex_buffer->vk_handle();
242 vk_device_size = vertex_buffer->size_used_get();
243 vk_device_address = vertex_buffer->device_address_get();
244 break;
245 }
247 VKUniformBuffer *uniform_buffer = static_cast<VKUniformBuffer *>(elem.resource);
248 uniform_buffer->ensure_updated();
249 vk_buffer = uniform_buffer->vk_handle();
250 vk_device_size = uniform_buffer->size_in_bytes();
251 vk_device_address = uniform_buffer->device_address_get();
252 break;
253 }
255 VKStorageBuffer *storage_buffer = static_cast<VKStorageBuffer *>(elem.resource);
256 storage_buffer->ensure_allocated();
257 vk_buffer = storage_buffer->vk_handle();
258 vk_device_size = storage_buffer->size_in_bytes();
259 vk_device_address = storage_buffer->device_address_get();
260 break;
261 }
263 VKBuffer *buffer = static_cast<VKBuffer *>(elem.resource);
264 vk_buffer = buffer->vk_handle();
265 vk_device_size = buffer->size_in_bytes();
266 vk_device_address = buffer->device_address_get();
267 break;
268 }
271 }
272 }
273
274 bind_buffer(VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
275 vk_buffer,
276 vk_device_address,
277 elem.offset,
278 vk_device_size - elem.offset,
279 resource_binding.location);
280 if (vk_buffer != VK_NULL_HANDLE) {
281 access_info.buffers.append({vk_buffer, resource_binding.access_mask});
282 }
283}
284
285void VKDescriptorSetUpdator::bind_uniform_buffer_resource(
286 const VKStateManager &state_manager,
287 const VKResourceBinding &resource_binding,
289{
290 VKUniformBuffer &uniform_buffer = *state_manager.uniform_buffers_.get(resource_binding.binding);
291 uniform_buffer.ensure_updated();
292 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
293 uniform_buffer.vk_handle(),
294 uniform_buffer.device_address_get(),
295 0,
296 uniform_buffer.size_in_bytes(),
297 resource_binding.location);
298 access_info.buffers.append({uniform_buffer.vk_handle(), resource_binding.access_mask});
299}
300
301void VKDescriptorSetUpdator::bind_push_constants(VKPushConstants &push_constants,
303{
304 if (push_constants.layout_get().storage_type_get() !=
306 {
307 return;
308 }
309 push_constants.update_uniform_buffer();
310 const VKUniformBuffer &uniform_buffer = *push_constants.uniform_buffer_get().get();
311 bind_buffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
312 uniform_buffer.vk_handle(),
313 uniform_buffer.device_address_get(),
314 0,
315 uniform_buffer.size_in_bytes(),
316 push_constants.layout_get().descriptor_set_location_get());
317 access_info.buffers.append({uniform_buffer.vk_handle(), VK_ACCESS_UNIFORM_READ_BIT});
318}
319
321 const VKStateManager &state_manager,
324{
325 const VKShaderInterface &shader_interface = shader.interface_get();
326 for (const VKResourceBinding &resource_binding : shader_interface.resource_bindings_get()) {
327 if (resource_binding.binding == -1) {
328 continue;
329 }
330
331 switch (resource_binding.bind_type) {
333 bind_uniform_buffer_resource(state_manager, resource_binding, access_info);
334 break;
335
337 bind_storage_buffer_resource(state_manager, resource_binding, access_info);
338 break;
339
341 bind_texture_resource(device, state_manager, resource_binding, access_info);
342 break;
343
345 bind_image_resource(state_manager, resource_binding, access_info);
346 break;
347
349 bind_input_attachment_resource(device, state_manager, resource_binding, access_info);
350 break;
351 }
352 }
353
354 /* Bind uniform push constants to descriptor set. */
355 bind_push_constants(shader.push_constants, access_info);
356}
357
359
360/* -------------------------------------------------------------------- */
363
365 VKDevice & /*device*/,
366 VKContext &context,
368 VkDescriptorSetLayout vk_descriptor_set_layout,
369 render_graph::VKPipelineData &r_pipeline_data)
370{
371 /* Use descriptor pools/sets. */
372 vk_descriptor_set = context.descriptor_pools_get().allocate(vk_descriptor_set_layout);
373 BLI_assert(vk_descriptor_set != VK_NULL_HANDLE);
375 r_pipeline_data.vk_descriptor_set = vk_descriptor_set;
376}
377
378void VKDescriptorSetPoolUpdator::bind_buffer(VkDescriptorType vk_descriptor_type,
379 VkBuffer vk_buffer,
380 VkDeviceAddress /*vk_device_address*/,
381 VkDeviceSize buffer_offset,
382 VkDeviceSize size_in_bytes,
384{
385 vk_descriptor_buffer_infos_.append({vk_buffer, buffer_offset, size_in_bytes});
386 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
387 nullptr,
389 location,
390 0,
391 1,
392 vk_descriptor_type,
393 nullptr,
394 nullptr,
395 nullptr});
396}
397
399 const VKDescriptorSet::Location location)
400{
401 vertex_buffer.ensure_buffer_view();
402 vk_buffer_views_.append(vertex_buffer.vk_buffer_view_get());
403 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
404 nullptr,
406 location,
407 0,
408 1,
409 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
410 nullptr,
411 nullptr,
412 nullptr});
413}
414
415void VKDescriptorSetPoolUpdator::bind_image(VkDescriptorType vk_descriptor_type,
416 VkSampler vk_sampler,
417 VkImageView vk_image_view,
418 VkImageLayout vk_image_layout,
420{
421 vk_descriptor_image_infos_.append({vk_sampler, vk_image_view, vk_image_layout});
422 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
423 nullptr,
425 location,
426 0,
427 1,
428 vk_descriptor_type,
429 nullptr,
430 nullptr,
431 nullptr});
432}
433
435{
436 if (vk_write_descriptor_sets_.is_empty()) {
437 return;
438 }
439
440 /* Finalize pointers that could have changed due to reallocations. */
441 int buffer_index = 0;
442 int buffer_view_index = 0;
443 int image_index = 0;
444 for (VkWriteDescriptorSet &vk_write_descriptor_set : vk_write_descriptor_sets_) {
445 switch (vk_write_descriptor_set.descriptorType) {
446 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
447 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
448 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
449 vk_write_descriptor_set.pImageInfo = &vk_descriptor_image_infos_[image_index++];
450 break;
451
452 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
453 vk_write_descriptor_set.pTexelBufferView = &vk_buffer_views_[buffer_view_index++];
454 break;
455
456 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
457 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
458 vk_write_descriptor_set.pBufferInfo = &vk_descriptor_buffer_infos_[buffer_index++];
459 break;
460
461 default:
463 break;
464 }
465 }
466
467#if 0
468 /* Uncomment this for rebalancing VKDescriptorPools::POOL_SIZE_* */
469 {
470 int storage_buffer_count = 0;
471 int storage_image_count = 0;
472 int combined_image_sampler_count = 0;
473 int uniform_buffer_count = 0;
474 int uniform_texel_buffer_count = 0;
475 int input_attachment_count = 0;
476 Set<VkDescriptorSet> descriptor_set_count;
477
478 for (VkWriteDescriptorSet &vk_write_descriptor_set : vk_write_descriptor_sets_) {
479 descriptor_set_count.add(vk_write_descriptor_set.dstSet);
480 switch (vk_write_descriptor_set.descriptorType) {
481 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
482 combined_image_sampler_count += 1;
483 break;
484 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
485 storage_image_count += 1;
486 break;
487 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
488 uniform_texel_buffer_count += 1;
489 break;
490 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
491 uniform_buffer_count += 1;
492 break;
493 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
494 storage_buffer_count += 1;
495 break;
496 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
497 input_attachment_count += 1;
498 break;
499 default:
501 }
502 }
503 std::cout << __func__ << ": "
504 << "descriptor_set=" << descriptor_set_count.size()
505 << ", combined_image_sampler=" << combined_image_sampler_count
506 << ", storage_image=" << storage_image_count
507 << ", uniform_texel_buffer=" << uniform_texel_buffer_count
508 << ", uniform_buffer=" << uniform_buffer_count
509 << ", storage_buffer=" << storage_buffer_count
510 << ", input_attachment=" << input_attachment_count << "\n";
511 }
512#endif
513
514 /* Update the descriptor set on the device. */
515 const VKDevice &device = VKBackend::get().device;
516 vkUpdateDescriptorSets(device.vk_handle(),
517 vk_write_descriptor_sets_.size(),
518 vk_write_descriptor_sets_.data(),
519 0,
520 nullptr);
521
522 vk_descriptor_image_infos_.clear();
523 vk_descriptor_buffer_infos_.clear();
524 vk_buffer_views_.clear();
525 vk_write_descriptor_sets_.clear();
526}
527
529
530/* -------------------------------------------------------------------- */
533
535 VKDevice &device,
536 VKContext & /*context*/,
537 VKShader & /*shader*/,
538 VkDescriptorSetLayout vk_descriptor_set_layout,
539 render_graph::VKPipelineData &r_pipeline_data)
540{
541 /* Use descriptor buffer. */
544 vk_descriptor_set_layout);
545
546 /* Ensure if there is still place left in the current buffer. */
547 if (buffers.is_empty() ||
548 layout.size > buffers.last().get()->size_in_bytes() - descriptor_set_head)
549 {
550 const VkDeviceSize default_buffer_size = 8 * 1024 * 1024;
551 buffers.append(std::make_unique<VKBuffer>());
552 VKBuffer *buffer = buffers.last().get();
553 buffer->create(default_buffer_size,
554 VK_BUFFER_USAGE_SAMPLER_DESCRIPTOR_BUFFER_BIT_EXT |
555 VK_BUFFER_USAGE_RESOURCE_DESCRIPTOR_BUFFER_BIT_EXT,
556 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
557 0,
558 VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT,
559 0.8f);
560 debug::object_label(buffer->vk_handle(), "DescriptorBuffer");
561 descriptor_buffer_data = static_cast<uint8_t *>(buffer->mapped_memory_get());
566 }
567
569
570 /* Update the current descriptor buffer and its offset to point to the active descriptor set. */
572
575}
576
577void VKDescriptorBufferUpdator::bind_buffer(VkDescriptorType vk_descriptor_type,
578 VkBuffer /*vk_buffer*/,
579 VkDeviceAddress vk_device_address,
580 VkDeviceSize buffer_offset,
581 VkDeviceSize size_in_bytes,
583{
584 BLI_assert(vk_device_address != 0);
585 VKDevice &device = VKBackend::get().device;
586 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
588 VkDescriptorAddressInfoEXT descriptor_address_info = {
589 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
590 nullptr,
591 vk_device_address + buffer_offset,
592 size_in_bytes};
593
594 VkDescriptorGetInfoEXT vk_descriptor_get_info{
595 VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, nullptr, vk_descriptor_type};
596 VkDeviceSize descriptor_size = 0;
597 switch (vk_descriptor_type) {
598 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
599 vk_descriptor_get_info.data.pUniformBuffer = &descriptor_address_info;
600 descriptor_size = vk_descriptor_buffer_properties.uniformBufferDescriptorSize;
601 break;
602
603 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
604 vk_descriptor_get_info.data.pStorageBuffer = &descriptor_address_info;
605 descriptor_size = vk_descriptor_buffer_properties.storageBufferDescriptorSize;
606 break;
607
608 default:
610 }
611
612 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
614 device.vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
615}
616
618 const VKDescriptorSet::Location location)
619{
620 VkDeviceAddress vk_device_address = vertex_buffer.device_address_get();
621 BLI_assert(vk_device_address != 0);
622 VKDevice &device = VKBackend::get().device;
623 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
625 VkDescriptorAddressInfoEXT descriptor_address_info = {
626 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
627 nullptr,
628 vk_device_address,
629 vertex_buffer.size_used_get(),
630 vertex_buffer.to_vk_format()};
631
632 VkDescriptorGetInfoEXT vk_descriptor_get_info{
633 VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, nullptr, VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER};
634 vk_descriptor_get_info.data.pUniformTexelBuffer = &descriptor_address_info;
635 VkDeviceSize descriptor_size = vk_descriptor_buffer_properties.uniformTexelBufferDescriptorSize;
636
637 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
639 device.vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
640}
641
642void VKDescriptorBufferUpdator::bind_image(VkDescriptorType vk_descriptor_type,
643 VkSampler vk_sampler,
644 VkImageView vk_image_view,
645 VkImageLayout vk_image_layout,
647{
648 VKDevice &device = VKBackend::get().device;
649 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
651 VkDescriptorImageInfo vk_descriptor_image_info = {vk_sampler, vk_image_view, vk_image_layout};
652 VkDescriptorGetInfoEXT vk_descriptor_get_info{
653 VK_STRUCTURE_TYPE_DESCRIPTOR_GET_INFO_EXT, nullptr, vk_descriptor_type};
654 VkDeviceSize descriptor_size = 0;
655 switch (vk_descriptor_type) {
656 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
657 vk_descriptor_get_info.data.pCombinedImageSampler = &vk_descriptor_image_info;
658 descriptor_size = vk_descriptor_buffer_properties.combinedImageSamplerDescriptorSize;
659 break;
660
661 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
662 vk_descriptor_get_info.data.pStorageImage = &vk_descriptor_image_info;
663 descriptor_size = vk_descriptor_buffer_properties.storageImageDescriptorSize;
664 break;
665
666 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
667 vk_descriptor_get_info.data.pInputAttachmentImage = &vk_descriptor_image_info;
668 descriptor_size = vk_descriptor_buffer_properties.inputAttachmentDescriptorSize;
669 break;
670
671 default:
673 }
674
675 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
677 device.vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
678}
679
681{
682 /* Buffers have already been updated. only need to discard the buffers. */
683 buffers.clear();
684 descriptor_buffer_data = nullptr;
687}
688
690
691} // 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:114
bool create(size_t size, VkBufferUsageFlags buffer_usage, VkMemoryPropertyFlags required_flags, VkMemoryPropertyFlags preferred_flags, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
Definition vk_buffer.cc:23
VkBuffer vk_handle() const
Definition vk_buffer.hh:102
void * mapped_memory_get() const
Definition vk_buffer.hh:135
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:351
VkDevice vk_handle() const
Definition vk_device.hh:336
const VKExtensions & extensions_get() const
Definition vk_device.hh:396
PFN_vkGetDescriptorEXT vkGetDescriptor
Definition vk_device.hh:276
struct blender::gpu::VKDevice::@357253123303341036353224041006002133032155310370 functions
const VkPhysicalDeviceDescriptorBufferPropertiesEXT & physical_device_descriptor_buffer_properties_get() const
Definition vk_device.hh:311
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 eGPUTextureFormat format)
Definition vk_common.cc:14
bool assign_if_different(T &old_value, T new_value)
VKDescriptorSet::Location location