diff --git a/src/amd/vulkan/meson.build b/src/amd/vulkan/meson.build index be78a40f9c5..e8c0ffe207a 100644 --- a/src/amd/vulkan/meson.build +++ b/src/amd/vulkan/meson.build @@ -112,6 +112,7 @@ libradv_files = files( 'radv_device.h', 'radv_device_memory.c', 'radv_device_memory.h', + 'radv_descriptors.c', 'radv_descriptors.h', 'radv_descriptor_pool.c', 'radv_descriptor_pool.h', diff --git a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c index ea77ebd8c6f..c0a603c9536 100644 --- a/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c +++ b/src/amd/vulkan/nir/radv_nir_apply_pipeline_layout.c @@ -8,6 +8,7 @@ #include "nir.h" #include "nir_builder.h" #include "radv_descriptor_set.h" +#include "radv_descriptors.h" #include "radv_device.h" #include "radv_nir.h" #include "radv_physical_device.h" diff --git a/src/amd/vulkan/radv_descriptor_pool.c b/src/amd/vulkan/radv_descriptor_pool.c index c9a6886e354..930a7f72ad9 100644 --- a/src/amd/vulkan/radv_descriptor_pool.c +++ b/src/amd/vulkan/radv_descriptor_pool.c @@ -8,6 +8,7 @@ #include "radv_descriptor_pool.h" #include "radv_buffer.h" #include "radv_descriptor_set.h" +#include "radv_descriptors.h" #include "radv_device.h" #include "radv_entrypoints.h" #include "radv_physical_device.h" diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c index 350e65c6e3b..34fb00be17a 100644 --- a/src/amd/vulkan/radv_descriptor_set.c +++ b/src/amd/vulkan/radv_descriptor_set.c @@ -4,117 +4,15 @@ * * SPDX-License-Identifier: MIT */ -#include -#include -#include -#include -#include "ac_descriptors.h" -#include "radv_buffer.h" -#include "radv_buffer_view.h" -#include "radv_cmd_buffer.h" -#include "radv_descriptor_pool.h" #include "radv_descriptor_set.h" #include "radv_descriptors.h" +#include "radv_cmd_buffer.h" +#include "radv_descriptor_pool.h" #include "radv_entrypoints.h" -#include "radv_image.h" -#include "radv_image_view.h" -#include "radv_rmv.h" #include "radv_sampler.h" #include "sid.h" -#include "vk_acceleration_structure.h" #include "vk_descriptors.h" -#include "vk_format.h" -#include "vk_log.h" -#include "vk_util.h" -#include "vk_ycbcr_conversion.h" - -static_assert(RADV_SAMPLER_DESC_SIZE == 16 && RADV_BUFFER_DESC_SIZE == 16 && RADV_ACCEL_STRUCT_DESC_SIZE == 16, - "Sampler/buffer/acceleration structure descriptor sizes must match."); - -unsigned -radv_descriptor_type_buffer_count(VkDescriptorType type) -{ - switch (type) { - case VK_DESCRIPTOR_TYPE_SAMPLER: - case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: - case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: - return 0; - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: - case VK_DESCRIPTOR_TYPE_MUTABLE_EXT: - return 3; - default: - return 1; - } -} - -static uint32_t -radv_descriptor_alignment(VkDescriptorType type) -{ - switch (type) { - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - case VK_DESCRIPTOR_TYPE_SAMPLER: - case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: - case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: - return 16; - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: - case VK_DESCRIPTOR_TYPE_MUTABLE_EXT: - return 32; - default: - return 1; - } -} - -bool -radv_mutable_descriptor_type_size_alignment(const struct radv_device *device, - const VkMutableDescriptorTypeListEXT *list, uint64_t *out_size, - uint64_t *out_align) -{ - const struct radv_physical_device *pdev = radv_device_physical(device); - uint32_t max_size = 0; - uint32_t max_align = 0; - - for (uint32_t i = 0; i < list->descriptorTypeCount; i++) { - uint32_t size = 0; - uint32_t align = radv_descriptor_alignment(list->pDescriptorTypes[i]); - - switch (list->pDescriptorTypes[i]) { - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: - case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: - size = RADV_BUFFER_DESC_SIZE; - break; - case VK_DESCRIPTOR_TYPE_SAMPLER: - size = RADV_SAMPLER_DESC_SIZE; - break; - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - size = RADV_STORAGE_IMAGE_DESC_SIZE; - break; - case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: - size = radv_get_sampled_image_desc_size(pdev); - break; - default: - return false; - } - - max_size = MAX2(max_size, size); - max_align = MAX2(max_align, align); - } - - *out_size = max_size; - *out_align = max_align; - return true; -} VKAPI_ATTR VkResult VKAPI_CALL radv_CreateDescriptorSetLayout(VkDevice _device, const VkDescriptorSetLayoutCreateInfo *pCreateInfo, @@ -867,94 +765,3 @@ radv_cmd_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buff radv_update_descriptor_sets_impl(device, cmd_buffer, dstSetOverride, descriptorWriteCount, pDescriptorWrites, descriptorCopyCount, pDescriptorCopies); } - -/* VK_EXT_descriptor_buffer */ -VKAPI_ATTR void VKAPI_CALL -radv_GetDescriptorSetLayoutSizeEXT(VkDevice device, VkDescriptorSetLayout layout, VkDeviceSize *pLayoutSizeInBytes) -{ - VK_FROM_HANDLE(radv_descriptor_set_layout, set_layout, layout); - *pLayoutSizeInBytes = set_layout->size; -} - -VKAPI_ATTR void VKAPI_CALL -radv_GetDescriptorSetLayoutBindingOffsetEXT(VkDevice device, VkDescriptorSetLayout layout, uint32_t binding, - VkDeviceSize *pOffset) -{ - VK_FROM_HANDLE(radv_descriptor_set_layout, set_layout, layout); - *pOffset = set_layout->binding[binding].offset; -} - -VKAPI_ATTR void VKAPI_CALL -radv_GetDescriptorEXT(VkDevice _device, const VkDescriptorGetInfoEXT *pDescriptorInfo, size_t dataSize, - void *pDescriptor) -{ - VK_FROM_HANDLE(radv_device, device, _device); - const struct radv_physical_device *pdev = radv_device_physical(device); - - switch (pDescriptorInfo->type) { - case VK_DESCRIPTOR_TYPE_SAMPLER: { - radv_write_sampler_descriptor(pDescriptor, *pDescriptorInfo->data.pSampler); - break; - case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { - if (pDescriptorInfo->data.pCombinedImageSampler) { - VK_FROM_HANDLE(radv_sampler, sampler, pDescriptorInfo->data.pCombinedImageSampler->sampler); - - if (sampler->vk.ycbcr_conversion) { - radv_write_image_descriptor_ycbcr(pDescriptor, pDescriptorInfo->data.pCombinedImageSampler); - } else { - radv_write_image_descriptor(pDescriptor, 64, pDescriptorInfo->type, - pDescriptorInfo->data.pCombinedImageSampler); - radv_write_sampler_descriptor((uint32_t *)pDescriptor + 20, - pDescriptorInfo->data.pCombinedImageSampler->sampler); - } - } else { - memset(pDescriptor, 0, RADV_COMBINED_IMAGE_SAMPLER_DESC_SIZE); - } - break; - } - case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: - case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: { - const VkDescriptorImageInfo *image_info = pDescriptorInfo->type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT - ? pDescriptorInfo->data.pInputAttachmentImage - : pDescriptorInfo->data.pSampledImage; - - radv_write_image_descriptor(pDescriptor, radv_get_sampled_image_desc_size(pdev), pDescriptorInfo->type, - image_info); - break; - } - case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: - radv_write_image_descriptor(pDescriptor, RADV_STORAGE_IMAGE_DESC_SIZE, pDescriptorInfo->type, - pDescriptorInfo->data.pStorageImage); - break; - case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: { - const VkDescriptorAddressInfoEXT *addr_info = pDescriptorInfo->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER - ? pDescriptorInfo->data.pUniformBuffer - : pDescriptorInfo->data.pStorageBuffer; - - radv_write_buffer_descriptor(device, pDescriptor, addr_info ? addr_info->address : 0, - addr_info ? addr_info->range : 0); - break; - } - case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: - case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { - const VkDescriptorAddressInfoEXT *addr_info = pDescriptorInfo->type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER - ? pDescriptorInfo->data.pUniformTexelBuffer - : pDescriptorInfo->data.pStorageTexelBuffer; - - if (addr_info && addr_info->address) { - radv_make_texel_buffer_descriptor(device, addr_info->address, addr_info->format, addr_info->range, - pDescriptor); - } else { - memset(pDescriptor, 0, RADV_BUFFER_DESC_SIZE); - } - break; - } - case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: - radv_write_accel_struct_descriptor(device, pDescriptor, pDescriptorInfo->data.accelerationStructure); - break; - } - default: - unreachable("invalid descriptor type"); - } -} diff --git a/src/amd/vulkan/radv_descriptor_set.h b/src/amd/vulkan/radv_descriptor_set.h index 3cbede60282..d7147339bb0 100644 --- a/src/amd/vulkan/radv_descriptor_set.h +++ b/src/amd/vulkan/radv_descriptor_set.h @@ -16,6 +16,10 @@ #include +struct radv_cmd_buffer; +struct radv_descriptor_pool; +struct radv_device; + struct radv_descriptor_set_binding_layout { VkDescriptorType type; @@ -122,23 +126,12 @@ radv_immutable_ycbcr_samplers(const struct radv_descriptor_set_layout *set, unsi return (const struct vk_ycbcr_conversion_state *)((const char *)set + offsets[binding_index]); } -struct radv_device; -struct radv_cmd_buffer; - void radv_cmd_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer, VkDescriptorSet overrideSet, uint32_t descriptorWriteCount, const VkWriteDescriptorSet *pDescriptorWrites, uint32_t descriptorCopyCount, const VkCopyDescriptorSet *pDescriptorCopies); -struct radv_descriptor_pool; - void radv_descriptor_set_destroy(struct radv_device *device, struct radv_descriptor_pool *pool, struct radv_descriptor_set *set, bool free_bo); -unsigned radv_descriptor_type_buffer_count(VkDescriptorType type); - -bool radv_mutable_descriptor_type_size_alignment(const struct radv_device *device, - const VkMutableDescriptorTypeListEXT *list, uint64_t *out_size, - uint64_t *out_align); - #endif /* RADV_DESCRIPTOR_SET_H */ diff --git a/src/amd/vulkan/radv_descriptors.c b/src/amd/vulkan/radv_descriptors.c new file mode 100644 index 00000000000..e2dbd8ae83b --- /dev/null +++ b/src/amd/vulkan/radv_descriptors.c @@ -0,0 +1,192 @@ +/* + * Copyright © 2016 Red Hat. + * Copyright © 2016 Bas Nieuwenhuizen + * + * SPDX-License-Identifier: MIT + */ + +#include "radv_descriptors.h" +#include "radv_buffer.h" +#include "radv_buffer_view.h" +#include "radv_cmd_buffer.h" +#include "radv_entrypoints.h" +#include "radv_image_view.h" +#include "radv_sampler.h" + +static_assert(RADV_SAMPLER_DESC_SIZE == 16 && RADV_BUFFER_DESC_SIZE == 16 && RADV_ACCEL_STRUCT_DESC_SIZE == 16, + "Sampler/buffer/acceleration structure descriptor sizes must match."); + +unsigned +radv_descriptor_type_buffer_count(VkDescriptorType type) +{ + switch (type) { + case VK_DESCRIPTOR_TYPE_SAMPLER: + case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: + return 0; + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + case VK_DESCRIPTOR_TYPE_MUTABLE_EXT: + return 3; + default: + return 1; + } +} + +uint32_t +radv_descriptor_alignment(VkDescriptorType type) +{ + switch (type) { + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_SAMPLER: + case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK: + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: + return 16; + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: + case VK_DESCRIPTOR_TYPE_MUTABLE_EXT: + return 32; + default: + return 1; + } +} + +bool +radv_mutable_descriptor_type_size_alignment(const struct radv_device *device, + const VkMutableDescriptorTypeListEXT *list, uint64_t *out_size, + uint64_t *out_align) +{ + const struct radv_physical_device *pdev = radv_device_physical(device); + uint32_t max_size = 0; + uint32_t max_align = 0; + + for (uint32_t i = 0; i < list->descriptorTypeCount; i++) { + uint32_t size = 0; + uint32_t align = radv_descriptor_alignment(list->pDescriptorTypes[i]); + + switch (list->pDescriptorTypes[i]) { + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: + size = RADV_BUFFER_DESC_SIZE; + break; + case VK_DESCRIPTOR_TYPE_SAMPLER: + size = RADV_SAMPLER_DESC_SIZE; + break; + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + size = RADV_STORAGE_IMAGE_DESC_SIZE; + break; + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: + size = radv_get_sampled_image_desc_size(pdev); + break; + default: + return false; + } + + max_size = MAX2(max_size, size); + max_align = MAX2(max_align, align); + } + + *out_size = max_size; + *out_align = max_align; + return true; +} + +/* VK_EXT_descriptor_buffer */ +VKAPI_ATTR void VKAPI_CALL +radv_GetDescriptorSetLayoutSizeEXT(VkDevice device, VkDescriptorSetLayout layout, VkDeviceSize *pLayoutSizeInBytes) +{ + VK_FROM_HANDLE(radv_descriptor_set_layout, set_layout, layout); + *pLayoutSizeInBytes = set_layout->size; +} + +VKAPI_ATTR void VKAPI_CALL +radv_GetDescriptorSetLayoutBindingOffsetEXT(VkDevice device, VkDescriptorSetLayout layout, uint32_t binding, + VkDeviceSize *pOffset) +{ + VK_FROM_HANDLE(radv_descriptor_set_layout, set_layout, layout); + *pOffset = set_layout->binding[binding].offset; +} + +VKAPI_ATTR void VKAPI_CALL +radv_GetDescriptorEXT(VkDevice _device, const VkDescriptorGetInfoEXT *pDescriptorInfo, size_t dataSize, + void *pDescriptor) +{ + VK_FROM_HANDLE(radv_device, device, _device); + const struct radv_physical_device *pdev = radv_device_physical(device); + + switch (pDescriptorInfo->type) { + case VK_DESCRIPTOR_TYPE_SAMPLER: { + radv_write_sampler_descriptor(pDescriptor, *pDescriptorInfo->data.pSampler); + break; + case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { + if (pDescriptorInfo->data.pCombinedImageSampler) { + VK_FROM_HANDLE(radv_sampler, sampler, pDescriptorInfo->data.pCombinedImageSampler->sampler); + + if (sampler->vk.ycbcr_conversion) { + radv_write_image_descriptor_ycbcr(pDescriptor, pDescriptorInfo->data.pCombinedImageSampler); + } else { + radv_write_image_descriptor(pDescriptor, 64, pDescriptorInfo->type, + pDescriptorInfo->data.pCombinedImageSampler); + radv_write_sampler_descriptor((uint32_t *)pDescriptor + 20, + pDescriptorInfo->data.pCombinedImageSampler->sampler); + } + } else { + memset(pDescriptor, 0, RADV_COMBINED_IMAGE_SAMPLER_DESC_SIZE); + } + break; + } + case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: + case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE: { + const VkDescriptorImageInfo *image_info = pDescriptorInfo->type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT + ? pDescriptorInfo->data.pInputAttachmentImage + : pDescriptorInfo->data.pSampledImage; + + radv_write_image_descriptor(pDescriptor, radv_get_sampled_image_desc_size(pdev), pDescriptorInfo->type, + image_info); + break; + } + case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: + radv_write_image_descriptor(pDescriptor, RADV_STORAGE_IMAGE_DESC_SIZE, pDescriptorInfo->type, + pDescriptorInfo->data.pStorageImage); + break; + case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: { + const VkDescriptorAddressInfoEXT *addr_info = pDescriptorInfo->type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER + ? pDescriptorInfo->data.pUniformBuffer + : pDescriptorInfo->data.pStorageBuffer; + + radv_write_buffer_descriptor(device, pDescriptor, addr_info ? addr_info->address : 0, + addr_info ? addr_info->range : 0); + break; + } + case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: + case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { + const VkDescriptorAddressInfoEXT *addr_info = pDescriptorInfo->type == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER + ? pDescriptorInfo->data.pUniformTexelBuffer + : pDescriptorInfo->data.pStorageTexelBuffer; + + if (addr_info && addr_info->address) { + radv_make_texel_buffer_descriptor(device, addr_info->address, addr_info->format, addr_info->range, + pDescriptor); + } else { + memset(pDescriptor, 0, RADV_BUFFER_DESC_SIZE); + } + break; + } + case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: + radv_write_accel_struct_descriptor(device, pDescriptor, pDescriptorInfo->data.accelerationStructure); + break; + } + default: + unreachable("invalid descriptor type"); + } +} diff --git a/src/amd/vulkan/radv_descriptors.h b/src/amd/vulkan/radv_descriptors.h index fe579d26cd8..546de0cb333 100644 --- a/src/amd/vulkan/radv_descriptors.h +++ b/src/amd/vulkan/radv_descriptors.h @@ -16,6 +16,14 @@ #include +unsigned radv_descriptor_type_buffer_count(VkDescriptorType type); + +uint32_t radv_descriptor_alignment(VkDescriptorType type); + +bool radv_mutable_descriptor_type_size_alignment(const struct radv_device *device, + const VkMutableDescriptorTypeListEXT *list, uint64_t *out_size, + uint64_t *out_align); + static ALWAYS_INLINE void radv_write_texel_buffer_descriptor(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer, unsigned *dst, struct radeon_winsys_bo **buffer_list, const VkBufferView _buffer_view) diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index 4077aaed7fa..31ac14b7a74 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -18,6 +18,7 @@ #include "util/u_atomic.h" #include "radv_cs.h" #include "radv_debug.h" +#include "radv_descriptors.h" #include "radv_pipeline_rt.h" #include "radv_rmv.h" #include "radv_shader.h"