radv: Add accel struct queries for maintenance1
Implements the new VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR and VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR query types. The documentation is a bit lacking for now but the fist type probably refers to the instance count and the second type refers to the acceleration structure size which we already store in radv_acceleration_structure. To support size queries, this commit adds a size member to the acceleration structure header. Signed-off-by: Konstantin Seurer <konstantin.seurer@gmail.com> Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16430>
This commit is contained in:
parent
d5dd0df65f
commit
5d56c2cfc0
|
@ -211,6 +211,12 @@ radv_WriteAccelerationStructuresPropertiesKHR(
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||||
value = header->serialization_size;
|
value = header->serialization_size;
|
||||||
break;
|
break;
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR:
|
||||||
|
value = header->instance_count;
|
||||||
|
break;
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
|
||||||
|
value = accel->size;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable("Unhandled acceleration structure query");
|
unreachable("Unhandled acceleration structure query");
|
||||||
}
|
}
|
||||||
|
@ -755,6 +761,8 @@ build_bvh(struct radv_device *device, const VkAccelerationStructureBuildGeometry
|
||||||
sizeof(uint64_t) * header->instance_count,
|
sizeof(uint64_t) * header->instance_count,
|
||||||
128);
|
128);
|
||||||
|
|
||||||
|
header->size = accel->size;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
device->ws->buffer_unmap(accel->bo);
|
device->ws->buffer_unmap(accel->bo);
|
||||||
return result;
|
return result;
|
||||||
|
@ -2281,6 +2289,8 @@ radv_CmdBuildAccelerationStructuresKHR(
|
||||||
sizeof(uint64_t) * header.instance_count,
|
sizeof(uint64_t) * header.instance_count,
|
||||||
128);
|
128);
|
||||||
|
|
||||||
|
header.size = accel_struct->size;
|
||||||
|
|
||||||
radv_update_buffer_cp(cmd_buffer,
|
radv_update_buffer_cp(cmd_buffer,
|
||||||
radv_buffer_get_va(accel_struct->bo) + accel_struct->mem_offset + base,
|
radv_buffer_get_va(accel_struct->bo) + accel_struct->mem_offset + base,
|
||||||
(const char *)&header + base, sizeof(header) - base);
|
(const char *)&header + base, sizeof(header) - base);
|
||||||
|
|
|
@ -54,6 +54,7 @@ struct radv_accel_struct_header {
|
||||||
uint32_t copy_dispatch_size[3];
|
uint32_t copy_dispatch_size[3];
|
||||||
uint64_t instance_offset;
|
uint64_t instance_offset;
|
||||||
uint64_t instance_count;
|
uint64_t instance_count;
|
||||||
|
uint64_t size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct radv_bvh_triangle_node {
|
struct radv_bvh_triangle_node {
|
||||||
|
|
|
@ -934,6 +934,8 @@ radv_CreateQueryPool(VkDevice _device, const VkQueryPoolCreateInfo *pCreateInfo,
|
||||||
case VK_QUERY_TYPE_TIMESTAMP:
|
case VK_QUERY_TYPE_TIMESTAMP:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
|
||||||
pool->stride = 8;
|
pool->stride = 8;
|
||||||
break;
|
break;
|
||||||
case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
|
case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
|
||||||
|
@ -1000,7 +1002,9 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first
|
||||||
switch (pool->type) {
|
switch (pool->type) {
|
||||||
case VK_QUERY_TYPE_TIMESTAMP:
|
case VK_QUERY_TYPE_TIMESTAMP:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: {
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: {
|
||||||
uint64_t const *src64 = (uint64_t const *)src;
|
uint64_t const *src64 = (uint64_t const *)src;
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
|
|
||||||
|
@ -1203,6 +1207,8 @@ radv_query_result_size(const struct radv_query_pool *pool, VkQueryResultFlags fl
|
||||||
case VK_QUERY_TYPE_TIMESTAMP:
|
case VK_QUERY_TYPE_TIMESTAMP:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
|
||||||
case VK_QUERY_TYPE_OCCLUSION:
|
case VK_QUERY_TYPE_OCCLUSION:
|
||||||
values += 1;
|
values += 1;
|
||||||
break;
|
break;
|
||||||
|
@ -1290,6 +1296,8 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo
|
||||||
case VK_QUERY_TYPE_TIMESTAMP:
|
case VK_QUERY_TYPE_TIMESTAMP:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
|
||||||
if (flags & VK_QUERY_RESULT_WAIT_BIT) {
|
if (flags & VK_QUERY_RESULT_WAIT_BIT) {
|
||||||
for (unsigned i = 0; i < queryCount; ++i, dest_va += stride) {
|
for (unsigned i = 0; i < queryCount; ++i, dest_va += stride) {
|
||||||
unsigned query = firstQuery + i;
|
unsigned query = firstQuery + i;
|
||||||
|
@ -1343,6 +1351,8 @@ query_clear_value(VkQueryType type)
|
||||||
case VK_QUERY_TYPE_TIMESTAMP:
|
case VK_QUERY_TYPE_TIMESTAMP:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR:
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR:
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
|
||||||
return (uint32_t)TIMESTAMP_NOT_READY;
|
return (uint32_t)TIMESTAMP_NOT_READY;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1755,6 +1765,12 @@ radv_CmdWriteAccelerationStructuresPropertiesKHR(
|
||||||
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
|
||||||
va += offsetof(struct radv_accel_struct_header, serialization_size);
|
va += offsetof(struct radv_accel_struct_header, serialization_size);
|
||||||
break;
|
break;
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR:
|
||||||
|
va += offsetof(struct radv_accel_struct_header, instance_count);
|
||||||
|
break;
|
||||||
|
case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
|
||||||
|
va += offsetof(struct radv_accel_struct_header, size);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
unreachable("Unhandle accel struct query type.");
|
unreachable("Unhandle accel struct query type.");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue