30 shader.push_constants.layout_get().storage_type_get() !=
38 VkDescriptorSetLayout vk_descriptor_set_layout =
shader.vk_descriptor_set_layout_get();
44 device, context,
shader, vk_descriptor_set_layout, r_pipeline_data);
57 vk_descriptor_set_layout_ = VK_NULL_HANDLE;
64void VKDescriptorSetUpdator::bind_image_resource(
const VKStateManager &state_manager,
70 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
73 VK_IMAGE_LAYOUT_GENERAL,
76 uint32_t layer_base = 0;
77 uint32_t layer_count = VK_REMAINING_ARRAY_LAYERS;
80 layer_base = layer_range.
start();
81 layer_count = layer_range.
size();
90void VKDescriptorSetUpdator::bind_texture_resource(
const VKDevice &device,
95 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(resource_binding.binding);
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();
107 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
111 VKTexture *
texture =
static_cast<VKTexture *
>(elem.resource);
116 VKVertexBuffer &vertex_buffer = *
texture->source_buffer_;
117 vertex_buffer.ensure_updated();
119 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
122 const VKSampler &sampler = device.samplers().get(elem.sampler);
123 bind_image(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
127 VK_IMAGE_LAYOUT_GENERAL,
128 resource_binding.location);
129 access_info.images.append({
texture->vk_image_handle(),
130 resource_binding.access_mask,
133 VK_REMAINING_ARRAY_LAYERS});
143void VKDescriptorSetUpdator::bind_input_attachment_resource(
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,
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,
166 VK_REMAINING_ARRAY_LAYERS});
170 bool supports_dynamic_rendering = device.extensions_get().dynamic_rendering;
171 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(
172 resource_binding.binding);
178 const BindSpaceTextures::Elem &elem = *elem_ptr;
179 VKTexture *
texture =
static_cast<VKTexture *
>(elem.resource);
182 if (supports_dynamic_rendering) {
183 const VKSampler &sampler = device.samplers().get(elem.sampler);
185 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
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,
196 VK_REMAINING_ARRAY_LAYERS});
201 bind_image(VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT,
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,
213 VK_REMAINING_ARRAY_LAYERS});
219void VKDescriptorSetUpdator::bind_storage_buffer_resource(
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();
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();
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();
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();
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();
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});
285void VKDescriptorSetUpdator::bind_uniform_buffer_resource(
290 VKUniformBuffer &uniform_buffer = *state_manager.uniform_buffers_.get(resource_binding.binding);
291 uniform_buffer.ensure_updated();
293 uniform_buffer.vk_handle(),
294 uniform_buffer.device_address_get(),
296 uniform_buffer.size_in_bytes(),
297 resource_binding.location);
298 access_info.buffers.append({uniform_buffer.vk_handle(), resource_binding.access_mask});
301void VKDescriptorSetUpdator::bind_push_constants(
VKPushConstants &push_constants,
304 if (push_constants.layout_get().storage_type_get() !=
309 push_constants.update_uniform_buffer();
310 const VKUniformBuffer &uniform_buffer = *push_constants.uniform_buffer_get().get();
312 uniform_buffer.vk_handle(),
313 uniform_buffer.device_address_get(),
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});
327 if (resource_binding.binding == -1) {
331 switch (resource_binding.bind_type) {
333 bind_uniform_buffer_resource(state_manager, resource_binding, access_info);
337 bind_storage_buffer_resource(state_manager, resource_binding, access_info);
341 bind_texture_resource(device, state_manager, resource_binding, access_info);
345 bind_image_resource(state_manager, resource_binding, access_info);
349 bind_input_attachment_resource(device, state_manager, resource_binding, access_info);
355 bind_push_constants(
shader.push_constants, access_info);
368 VkDescriptorSetLayout vk_descriptor_set_layout,
372 vk_descriptor_set = context.descriptor_pools_get().allocate(vk_descriptor_set_layout);
381 VkDeviceSize buffer_offset,
382 VkDeviceSize size_in_bytes,
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,
403 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
409 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
416 VkSampler vk_sampler,
417 VkImageView vk_image_view,
418 VkImageLayout vk_image_layout,
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,
436 if (vk_write_descriptor_sets_.is_empty()) {
441 int buffer_index = 0;
442 int buffer_view_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++];
452 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
453 vk_write_descriptor_set.pTexelBufferView = &vk_buffer_views_[buffer_view_index++];
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++];
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;
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;
484 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
485 storage_image_count += 1;
487 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
488 uniform_texel_buffer_count += 1;
490 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
491 uniform_buffer_count += 1;
493 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
494 storage_buffer_count += 1;
496 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
497 input_attachment_count += 1;
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";
516 vkUpdateDescriptorSets(device.
vk_handle(),
517 vk_write_descriptor_sets_.size(),
518 vk_write_descriptor_sets_.data(),
522 vk_descriptor_image_infos_.clear();
523 vk_descriptor_buffer_infos_.clear();
524 vk_buffer_views_.clear();
525 vk_write_descriptor_sets_.clear();
538 VkDescriptorSetLayout vk_descriptor_set_layout,
544 vk_descriptor_set_layout);
550 const VkDeviceSize default_buffer_size = 8 * 1024 * 1024;
551 buffers.append(std::make_unique<VKBuffer>());
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,
558 VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT,
579 VkDeviceAddress vk_device_address,
580 VkDeviceSize buffer_offset,
581 VkDeviceSize size_in_bytes,
586 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
588 VkDescriptorAddressInfoEXT descriptor_address_info = {
589 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
591 vk_device_address + buffer_offset,
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;
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;
612 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
614 device.
vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
623 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
625 VkDescriptorAddressInfoEXT descriptor_address_info = {
626 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
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;
637 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
639 device.
vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
643 VkSampler vk_sampler,
644 VkImageView vk_image_view,
645 VkImageLayout vk_image_layout,
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;
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;
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;
675 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
677 device.
vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
#define BLI_assert_unreachable()
constexpr int64_t size() const
constexpr int64_t start() const
VKTexture * get(int binding) const
VkDeviceAddress device_address_get() const
bool create(size_t size, VkBufferUsageFlags buffer_usage, VkMemoryPropertyFlags required_flags, VkMemoryPropertyFlags preferred_flags, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
VkBuffer vk_handle() const
void * mapped_memory_get() const
void allocate_new_descriptor_set(VKDevice &device, VKContext &context, VKShader &shader, VkDescriptorSetLayout vk_descriptor_set_layout, render_graph::VKPipelineData &r_pipeline_data) override
uint8_t * descriptor_buffer_data
VKDescriptorBufferLayout layout
VkDeviceSize descriptor_set_head
VkDeviceAddress descriptor_buffer_device_address
VkDeviceSize descriptor_buffer_offset
void bind_texel_buffer(VKVertexBuffer &vertex_buffer, VKDescriptorSet::Location location) override
Vector< std::unique_ptr< VKBuffer > > buffers
VkDeviceSize descriptor_set_tail
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 upload_descriptor_sets() override
VKDescriptorBufferLayout descriptor_buffer_layout_get(VkDescriptorSetLayout vk_descriptor_set_layout)
void upload_descriptor_sets() 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
VkDescriptorSet vk_descriptor_set
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 upload_descriptor_sets()
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()
VkDevice vk_handle() const
const VKExtensions & extensions_get() const
PFN_vkGetDescriptorEXT vkGetDescriptor
struct blender::gpu::VKDevice::@357253123303341036353224041006002133032155310370 functions
const VkPhysicalDeviceDescriptorBufferPropertiesEXT & physical_device_descriptor_buffer_properties_get() const
const Span< VKResourceBinding > resource_bindings_get() const
VkDeviceAddress device_address_get() const
VkBufferView vk_buffer_view_get() const
void ensure_buffer_view()
size_t size_used_get() const
TEX_TEMPLATE DataVec texture(T, FltCoord, float=0.0f) RET
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)
VKImageViewArrayed arrayed
VkAccessFlags access_mask
VKDescriptorSet::Location location
VkDeviceAddress descriptor_buffer_device_address
VkDeviceSize descriptor_buffer_offset
VkDescriptorSet vk_descriptor_set
Vector< VKImageAccess > images