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() !=
35 vk_descriptor_set_layout_ = shader_descriptor_set_layout;
39 VkDescriptorSetLayout vk_descriptor_set_layout =
shader.vk_descriptor_set_layout_get();
45 device, context,
shader, vk_descriptor_set_layout, r_pipeline_data);
58 vk_descriptor_set_layout_ = VK_NULL_HANDLE;
65void VKDescriptorSetUpdator::bind_image_resource(
const VKStateManager &state_manager,
71 VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
74 VK_IMAGE_LAYOUT_GENERAL,
78 if (
texture.is_texture_view()) {
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())};
92void VKDescriptorSetUpdator::bind_texture_resource(
const VKDevice &device,
97 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(resource_binding.binding);
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();
109 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
113 VKTexture *
texture =
static_cast<VKTexture *
>(elem.resource);
118 VKVertexBuffer &vertex_buffer = *
texture->source_buffer_;
119 vertex_buffer.ensure_updated();
121 access_info.buffers.append({vertex_buffer.vk_handle(), resource_binding.access_mask});
124 const VKSampler &sampler = device.samplers().get(elem.sampler);
125 bind_image(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
129 VK_IMAGE_LAYOUT_GENERAL,
130 resource_binding.location);
131 access_info.images.append({
texture->vk_image_handle(),
132 resource_binding.access_mask,
144void VKDescriptorSetUpdator::bind_input_attachment_resource(
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,
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,
170 const BindSpaceTextures::Elem *elem_ptr = state_manager.textures_.get(
171 resource_binding.binding);
177 const BindSpaceTextures::Elem &elem = *elem_ptr;
178 VKTexture *
texture =
static_cast<VKTexture *
>(elem.resource);
181 const VKSampler &sampler = device.samplers().get(elem.sampler);
183 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER,
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,
198void VKDescriptorSetUpdator::bind_storage_buffer_resource(
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();
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();
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();
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();
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();
258 resource_binding.location);
259 if (vk_buffer != VK_NULL_HANDLE) {
260 access_info.buffers.append({vk_buffer, resource_binding.access_mask});
264void VKDescriptorSetUpdator::bind_uniform_buffer_resource(
269 VKUniformBuffer &uniform_buffer = *state_manager.uniform_buffers_.get(resource_binding.binding);
270 uniform_buffer.ensure_updated();
272 uniform_buffer.vk_handle(),
273 uniform_buffer.device_address_get(),
275 uniform_buffer.size_in_bytes(),
276 resource_binding.location);
277 access_info.buffers.append({uniform_buffer.vk_handle(), resource_binding.access_mask});
280void VKDescriptorSetUpdator::bind_push_constants(
VKPushConstants &push_constants,
283 if (push_constants.layout_get().storage_type_get() !=
288 push_constants.update_uniform_buffer();
289 const VKUniformBuffer &uniform_buffer = *push_constants.uniform_buffer_get().get();
291 uniform_buffer.vk_handle(),
292 uniform_buffer.device_address_get(),
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});
306 if (resource_binding.binding == -1) {
310 switch (resource_binding.bind_type) {
312 bind_uniform_buffer_resource(state_manager, resource_binding, access_info);
316 bind_storage_buffer_resource(state_manager, resource_binding, access_info);
320 bind_texture_resource(device, state_manager, resource_binding, access_info);
324 bind_image_resource(state_manager, resource_binding, access_info);
328 bind_input_attachment_resource(device, state_manager, resource_binding, access_info);
334 bind_push_constants(
shader.push_constants, access_info);
347 VkDescriptorSetLayout vk_descriptor_set_layout,
351 vk_descriptor_set = context.descriptor_pools_get().allocate(vk_descriptor_set_layout);
360 VkDeviceSize buffer_offset,
361 VkDeviceSize size_in_bytes,
364 if (vk_buffer == VK_NULL_HANDLE) {
365 vk_descriptor_buffer_infos_.append({VK_NULL_HANDLE, 0, VK_WHOLE_SIZE});
368 vk_descriptor_buffer_infos_.append({vk_buffer, buffer_offset, size_in_bytes});
370 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
387 vk_write_descriptor_sets_.append({VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,
393 VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER,
400 VkSampler vk_sampler,
401 VkImageView vk_image_view,
402 VkImageLayout vk_image_layout,
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,
420 if (vk_write_descriptor_sets_.is_empty()) {
425 int buffer_index = 0;
426 int buffer_view_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++];
436 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
437 vk_write_descriptor_set.pTexelBufferView = &vk_buffer_views_[buffer_view_index++];
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++];
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;
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;
468 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
469 storage_image_count += 1;
471 case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
472 uniform_texel_buffer_count += 1;
474 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
475 uniform_buffer_count += 1;
477 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
478 storage_buffer_count += 1;
480 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
481 input_attachment_count += 1;
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";
500 vkUpdateDescriptorSets(device.
vk_handle(),
501 vk_write_descriptor_sets_.size(),
502 vk_write_descriptor_sets_.data(),
506 vk_descriptor_image_infos_.clear();
507 vk_descriptor_buffer_infos_.clear();
508 vk_buffer_views_.clear();
509 vk_write_descriptor_sets_.clear();
522 VkDescriptorSetLayout vk_descriptor_set_layout,
528 vk_descriptor_set_layout);
534 const VkDeviceSize default_buffer_size = 8 * 1024 * 1024;
535 buffers.append(std::make_unique<VKBuffer>());
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,
562 VkDeviceAddress vk_device_address,
563 VkDeviceSize buffer_offset,
564 VkDeviceSize size_in_bytes,
569 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
571 VkDescriptorAddressInfoEXT descriptor_address_info = {
572 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
574 vk_device_address + buffer_offset,
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;
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;
595 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
597 device.
vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
606 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &vk_descriptor_buffer_properties =
608 VkDescriptorAddressInfoEXT descriptor_address_info = {
609 VK_STRUCTURE_TYPE_DESCRIPTOR_ADDRESS_INFO_EXT,
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;
620 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
622 device.
vk_handle(), &vk_descriptor_get_info, descriptor_size, descriptor_ptr);
626 VkSampler vk_sampler,
627 VkImageView vk_image_view,
628 VkImageLayout vk_image_layout,
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;
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;
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;
658 uint8_t *descriptor_ptr = get_descriptor_binding_ptr(location);
660 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
VkBuffer vk_handle() const
bool create(size_t size, VkBufferUsageFlags buffer_usage, VmaMemoryUsage vma_memory_usage, VmaAllocationCreateFlags vma_allocation_flags, float priority, bool export_memory=false)
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
const VkPhysicalDeviceDescriptorBufferPropertiesEXT & physical_device_descriptor_buffer_properties_get() const
struct blender::gpu::VKDevice::@152120360333013146246346216002113345357100126073 functions
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 TextureFormat format)
VKImageViewArrayed arrayed
VkAccessFlags access_mask
VKDescriptorSet::Location location
VkDeviceAddress descriptor_buffer_device_address
VkDeviceSize descriptor_buffer_offset
VkDescriptorSet vk_descriptor_set
Vector< VKImageAccess > images