radv: implement vkWrite{Resource,Sampler}DescriptorsEXT()

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39483>
This commit is contained in:
Samuel Pitoiset 2025-06-26 12:58:29 +02:00 committed by Marge Bot
parent 7da95418a5
commit 7e63a2050b
4 changed files with 109 additions and 5 deletions

View file

@ -610,7 +610,7 @@ radv_update_descriptor_sets_impl(struct radv_device *device, struct radv_cmd_buf
break;
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
if (binding_layout->has_ycbcr_sampler) {
radv_write_image_descriptor_ycbcr(device, ptr, writeset->pImageInfo + j);
radv_write_image_descriptor_ycbcr(device, ptr, writeset->pImageInfo + j, true);
} else {
radv_write_combined_image_sampler_descriptor(device, ptr, writeset->descriptorType,
writeset->pImageInfo + j,

View file

@ -160,7 +160,7 @@ radv_update_descriptor_set_with_template_impl(struct radv_device *device, struct
break;
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: {
if (templ->entry[i].has_ycbcr_sampler) {
radv_write_image_descriptor_ycbcr(device, pDst, (struct VkDescriptorImageInfo *)pSrc);
radv_write_image_descriptor_ycbcr(device, pDst, (struct VkDescriptorImageInfo *)pSrc, true);
} else {
radv_write_combined_image_sampler_descriptor(device, pDst, templ->entry[i].descriptor_type,
(struct VkDescriptorImageInfo *)pSrc,

View file

@ -113,7 +113,7 @@ radv_GetDescriptorEXT(VkDevice _device, const VkDescriptorGetInfoEXT *pDescripto
VK_FROM_HANDLE(radv_sampler, sampler, pDescriptorInfo->data.pCombinedImageSampler->sampler);
if (sampler->vk.ycbcr_conversion) {
radv_write_image_descriptor_ycbcr(device, pDescriptor, pDescriptorInfo->data.pCombinedImageSampler);
radv_write_image_descriptor_ycbcr(device, pDescriptor, pDescriptorInfo->data.pCombinedImageSampler, true);
} else {
radv_write_image_descriptor(pDescriptor, radv_get_sampled_image_desc_size(pdev), pDescriptorInfo->type,
pDescriptorInfo->data.pCombinedImageSampler);
@ -171,3 +171,104 @@ radv_GetDescriptorEXT(VkDevice _device, const VkDescriptorGetInfoEXT *pDescripto
UNREACHABLE("invalid descriptor type");
}
}
/* VK_EXT_descriptor_heap */
VKAPI_ATTR VkResult VKAPI_CALL
radv_WriteSamplerDescriptorsEXT(VkDevice _device, uint32_t samplerCount, const VkSamplerCreateInfo *pSamplers,
const VkHostAddressRangeEXT *pDescriptors)
{
VK_FROM_HANDLE(radv_device, device, _device);
for (uint32_t i = 0; i < samplerCount; i++) {
const VkHostAddressRangeEXT *host_addr_range = &pDescriptors[i];
struct radv_sampler sampler;
radv_sampler_init(device, &sampler, &pSamplers[i]);
radv_write_sampler_descriptor(host_addr_range->address, radv_sampler_to_handle(&sampler));
radv_sampler_finish(device, &sampler);
}
return VK_SUCCESS;
}
VKAPI_ATTR VkResult VKAPI_CALL
radv_WriteResourceDescriptorsEXT(VkDevice _device, uint32_t resourceCount,
const VkResourceDescriptorInfoEXT *pResources,
const VkHostAddressRangeEXT *pDescriptors)
{
VK_FROM_HANDLE(radv_device, device, _device);
const struct radv_physical_device *pdev = radv_device_physical(device);
for (uint32_t i = 0; i < resourceCount; i++) {
const VkResourceDescriptorInfoEXT *resource = &pResources[i];
const VkHostAddressRangeEXT *host_addr_range = &pDescriptors[i];
switch (resource->type) {
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE: {
const VkImageDescriptorInfoEXT *desc_info = resource->data.pImage;
const uint32_t size = resource->type == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE
? RADV_STORAGE_IMAGE_DESC_SIZE
: radv_get_sampled_image_desc_size(pdev);
if (desc_info) {
struct radv_image_view iview;
radv_image_view_init(&iview, device, desc_info->pView,
&(struct radv_image_view_extra_create_info){.from_client = true});
const VkDescriptorImageInfo desc_image_info = {
.imageView = radv_image_view_to_handle(&iview),
.imageLayout = desc_info->layout,
};
const VkSamplerYcbcrConversionInfo *ycbcr_conversion =
vk_find_struct_const(desc_info->pView->pNext, SAMPLER_YCBCR_CONVERSION_INFO);
if (ycbcr_conversion) {
radv_write_image_descriptor_ycbcr(device, host_addr_range->address, &desc_image_info, false);
} else {
radv_write_image_descriptor(host_addr_range->address, size, resource->type, &desc_image_info);
}
radv_image_view_finish(&iview);
} else {
memset(host_addr_range->address, 0, size);
}
break;
}
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: {
const VkDeviceAddressRangeEXT *addr_range = resource->data.pAddressRange;
radv_write_buffer_descriptor(device, host_addr_range->address, addr_range ? addr_range->address : 0,
addr_range ? addr_range->size : 0);
break;
}
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: {
const VkTexelBufferDescriptorInfoEXT *desc_info = resource->data.pTexelBuffer;
if (desc_info && desc_info->addressRange.address) {
radv_make_texel_buffer_descriptor(device, desc_info->addressRange.address, desc_info->format,
desc_info->addressRange.size, host_addr_range->address);
} else {
memset(host_addr_range->address, 0, RADV_BUFFER_DESC_SIZE);
}
break;
}
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: {
const VkDeviceAddressRangeEXT *addr_range = resource->data.pAddressRange;
radv_write_accel_struct_descriptor(device, host_addr_range->address, addr_range ? addr_range->address : 0);
break;
}
default:
UNREACHABLE("invalid descriptor type");
}
}
return VK_SUCCESS;
}

View file

@ -137,7 +137,8 @@ radv_write_image_descriptor(unsigned *dst, unsigned size, VkDescriptorType descr
}
static ALWAYS_INLINE void
radv_write_image_descriptor_ycbcr(struct radv_device *device, unsigned *dst, const VkDescriptorImageInfo *image_info)
radv_write_image_descriptor_ycbcr(struct radv_device *device, unsigned *dst, const VkDescriptorImageInfo *image_info,
bool use_combined_image_sampler)
{
const struct radv_physical_device *pdev = radv_device_physical(device);
struct radv_image_view *iview = NULL;
@ -151,7 +152,9 @@ radv_write_image_descriptor_ycbcr(struct radv_device *device, unsigned *dst, con
}
const uint32_t plane_count = vk_format_get_plane_count(iview->vk.format);
const uint32_t stride = radv_get_combined_image_sampler_desc_size(pdev) / 4;
const uint32_t desc_size = use_combined_image_sampler ? radv_get_combined_image_sampler_desc_size(pdev)
: radv_get_sampled_image_desc_size(pdev);
const uint32_t stride = desc_size / 4;
for (uint32_t i = 0; i < plane_count; i++) {
memcpy(dst, iview->descriptor.plane_descriptors[i], 32);