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_UNIFORM_BUFFER_DYNAMIC:
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||||
case VK_DESCRIPTOR_TYPE_MUTABLE_VALVE:
|
case VK_DESCRIPTOR_TYPE_MUTABLE_VALVE:
|
||||||
|
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||||
/* todo */
|
/* todo */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@@ -251,6 +251,10 @@ radv_CreateDescriptorSetLayout(VkDevice _device, const VkDescriptorSetLayoutCrea
|
|||||||
set_layout->binding[b].size = descriptor_count;
|
set_layout->binding[b].size = descriptor_count;
|
||||||
descriptor_count = 1;
|
descriptor_count = 1;
|
||||||
break;
|
break;
|
||||||
|
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||||
|
set_layout->binding[b].size = 16;
|
||||||
|
alignment = 16;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -412,6 +416,10 @@ radv_GetDescriptorSetLayoutSupport(VkDevice device,
|
|||||||
supported = false;
|
supported = false;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||||
|
descriptor_size = 16;
|
||||||
|
descriptor_alignment = 16;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -731,6 +739,7 @@ radv_CreateDescriptorPool(VkDevice _device, const VkDescriptorPoolCreateInfo *pC
|
|||||||
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
||||||
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
||||||
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
||||||
|
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||||
/* 32 as we may need to align for images */
|
/* 32 as we may need to align for images */
|
||||||
bo_size += 32 * pCreateInfo->pPoolSizes[i].descriptorCount;
|
bo_size += 32 * pCreateInfo->pPoolSizes[i].descriptorCount;
|
||||||
break;
|
break;
|
||||||
@@ -1089,6 +1098,14 @@ write_sampler_descriptor(struct radv_device *device, unsigned *dst,
|
|||||||
memcpy(dst, sampler->state, 16);
|
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
|
void
|
||||||
radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer,
|
radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *cmd_buffer,
|
||||||
VkDescriptorSet dstSetOverride, uint32_t descriptorWriteCount,
|
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_offset &&
|
||||||
!binding_layout->immutable_samplers_equal;
|
!binding_layout->immutable_samplers_equal;
|
||||||
const uint32_t *samplers = radv_immutable_samplers(set->header.layout, binding_layout);
|
const uint32_t *samplers = radv_immutable_samplers(set->header.layout, binding_layout);
|
||||||
|
const VkWriteDescriptorSetAccelerationStructureKHR *accel_structs = NULL;
|
||||||
|
|
||||||
ptr += binding_layout->offset / 4;
|
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,
|
write_block_descriptor(device, cmd_buffer, (uint8_t *)ptr + writeset->dstArrayElement,
|
||||||
writeset);
|
writeset);
|
||||||
continue;
|
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;
|
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);
|
memcpy(ptr, samplers + 4 * idx, 16);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||||
|
write_accel_struct(ptr, accel_structs->pAccelerationStructures[j]);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1238,7 +1262,8 @@ radv_update_descriptor_sets(struct radv_device *device, struct radv_cmd_buffer *
|
|||||||
src_ptr += src_binding_layout->size / 4;
|
src_ptr += src_binding_layout->size / 4;
|
||||||
dst_ptr += dst_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. */
|
/* Sampler descriptors don't have a buffer list. */
|
||||||
dst_buffer_list[j] = src_buffer_list[j];
|
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)
|
else if (templ->entry[i].immutable_samplers)
|
||||||
memcpy(pDst, templ->entry[i].immutable_samplers + 4 * j, 16);
|
memcpy(pDst, templ->entry[i].immutable_samplers + 4 * j, 16);
|
||||||
break;
|
break;
|
||||||
|
case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||||
|
write_accel_struct(pDst, *(const VkAccelerationStructureKHR *)pSrc);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user