radv: Add acceleration structure descriptor set support.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11078>
This commit is contained in:

committed by
Marge Bot

parent
0dad88b469
commit
a4b3ce5d56
@@ -225,6 +225,7 @@ radv_dump_descriptor_set(struct radv_device *device, struct radv_descriptor_set
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||
case VK_DESCRIPTOR_TYPE_MUTABLE_VALVE:
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
/* todo */
|
||||
break;
|
||||
default:
|
||||
|
@@ -251,6 +251,10 @@ radv_CreateDescriptorSetLayout(VkDevice _device, const VkDescriptorSetLayoutCrea
|
||||
set_layout->binding[b].size = descriptor_count;
|
||||
descriptor_count = 1;
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
set_layout->binding[b].size = 16;
|
||||
alignment = 16;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -412,6 +416,10 @@ radv_GetDescriptorSetLayoutSupport(VkDevice device,
|
||||
supported = false;
|
||||
}
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
descriptor_size = 16;
|
||||
descriptor_alignment = 16;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -731,6 +739,7 @@ radv_CreateDescriptorPool(VkDevice _device, const VkDescriptorPoolCreateInfo *pC
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
/* 32 as we may need to align for images */
|
||||
bo_size += 32 * pCreateInfo->pPoolSizes[i].descriptorCount;
|
||||
break;
|
||||
@@ -1089,6 +1098,14 @@ write_sampler_descriptor(struct radv_device *device, unsigned *dst,
|
||||
memcpy(dst, sampler->state, 16);
|
||||
}
|
||||
|
||||
static void
|
||||
write_accel_struct(void *ptr, VkAccelerationStructureKHR _accel_struct)
|
||||
{
|
||||
RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, _accel_struct);
|
||||
uint64_t va = radv_accel_struct_get_va(accel_struct);
|
||||
memcpy(ptr, &va, sizeof(va));
|
||||
}
|
||||
|
||||
void
|
||||
radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer,
|
||||
VkDescriptorSet dstSetOverride, uint32_t descriptorWriteCount,
|
||||
@@ -1113,6 +1130,7 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *
|
||||
binding_layout->immutable_samplers_offset &&
|
||||
!binding_layout->immutable_samplers_equal;
|
||||
const uint32_t *samplers = radv_immutable_samplers(set->header.layout, binding_layout);
|
||||
const VkWriteDescriptorSetAccelerationStructureKHR *accel_structs = NULL;
|
||||
|
||||
ptr += binding_layout->offset / 4;
|
||||
|
||||
@@ -1120,6 +1138,9 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *
|
||||
write_block_descriptor(device, cmd_buffer, (uint8_t *)ptr + writeset->dstArrayElement,
|
||||
writeset);
|
||||
continue;
|
||||
} else if (writeset->descriptorType == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) {
|
||||
accel_structs =
|
||||
vk_find_struct_const(writeset->pNext, WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR);
|
||||
}
|
||||
|
||||
ptr += binding_layout->size * writeset->dstArrayElement / 4;
|
||||
@@ -1172,6 +1193,9 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *
|
||||
memcpy(ptr, samplers + 4 * idx, 16);
|
||||
}
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
write_accel_struct(ptr, accel_structs->pAccelerationStructures[j]);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1238,7 +1262,8 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *
|
||||
src_ptr += src_binding_layout->size / 4;
|
||||
dst_ptr += dst_binding_layout->size / 4;
|
||||
|
||||
if (src_binding_layout->type != VK_DESCRIPTOR_TYPE_SAMPLER) {
|
||||
if (src_binding_layout->type != VK_DESCRIPTOR_TYPE_SAMPLER &&
|
||||
src_binding_layout->type != VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) {
|
||||
/* Sampler descriptors don't have a buffer list. */
|
||||
dst_buffer_list[j] = src_buffer_list[j];
|
||||
}
|
||||
@@ -1433,6 +1458,9 @@ radv_update_descriptor_set_with_template(struct radv_device *device,
|
||||
else if (templ->entry[i].immutable_samplers)
|
||||
memcpy(pDst, templ->entry[i].immutable_samplers + 4 * j, 16);
|
||||
break;
|
||||
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
write_accel_struct(pDst, *(const VkAccelerationStructureKHR *)pSrc);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
Reference in New Issue
Block a user