From d844fa4defac4d2ce620d4fd0b00597faa6ff2a4 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 25 Nov 2022 17:47:31 +0200 Subject: [PATCH] anv: implement new queries for VK_KHR_ray_tracing_maintenance1 Signed-off-by: Lionel Landwerlin Reviewed-by: Ivan Briano Part-of: --- src/intel/vulkan/genX_query.c | 74 +++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 11 deletions(-) diff --git a/src/intel/vulkan/genX_query.c b/src/intel/vulkan/genX_query.c index f70b6d5ec27..7544d022ad0 100644 --- a/src/intel/vulkan/genX_query.c +++ b/src/intel/vulkan/genX_query.c @@ -161,9 +161,16 @@ VkResult genX(CreateQueryPool)( break; #if GFX_VERx10 >= 125 case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: - case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: - uint64s_per_slot = 1 + 1 /* availability + size */; + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: + uint64s_per_slot = 1 + 1 /* availability + size (PostbuildInfoCurrentSize, PostbuildInfoCompactedSize) */; break; + + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR: + uint64s_per_slot = 1 + 2 /* availability + size (PostbuildInfoSerializationDesc) */; + break; + break; + #endif default: assert(!"Invalid query type"); @@ -457,6 +464,8 @@ VkResult genX(GetQueryPoolResults)( #if GFX_VERx10 >= 125 pool->type == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR || pool->type == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR || + pool->type == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR || + pool->type == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR || #endif pool->type == VK_QUERY_TYPE_OCCLUSION || pool->type == VK_QUERY_TYPE_PIPELINE_STATISTICS || @@ -557,9 +566,25 @@ VkResult genX(GetQueryPoolResults)( } #if GFX_VERx10 >= 125 + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_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: { + uint64_t *slot = query_slot(pool, firstQuery + i); + if (write_results) + cpu_write_query_result(pData, flags, idx, slot[1]); + idx++; + break; + } + + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR: { + uint64_t *slot = query_slot(pool, firstQuery + i); + if (write_results) + cpu_write_query_result(pData, flags, idx, slot[2]); + idx++; + break; + } #endif + case VK_QUERY_TYPE_TIMESTAMP: { uint64_t *slot = query_slot(pool, firstQuery + i); if (write_results) @@ -746,6 +771,8 @@ void genX(CmdResetQueryPool)( #if GFX_VERx10 >= 125 case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR: #endif for (uint32_t i = 0; i < queryCount; i++) { emit_query_pc_availability(cmd_buffer, @@ -1497,14 +1524,24 @@ void genX(CmdCopyQueryPoolResults)( break; case VK_QUERY_TYPE_TIMESTAMP: -#if GFX_VERx10 >= 125 - case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: - case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: -#endif result = mi_mem64(anv_address_add(query_addr, 8)); gpu_write_query_result(&b, dest_addr, flags, idx++, result); break; +#if GFX_VERx10 >= 125 + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: + result = mi_mem64(anv_address_add(query_addr, 8)); + gpu_write_query_result(&b, dest_addr, flags, idx++, result); + break; + + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR: + result = mi_mem64(anv_address_add(query_addr, 16)); + gpu_write_query_result(&b, dest_addr, flags, idx++, result); + break; +#endif + case VK_QUERY_TYPE_PERFORMANCE_QUERY_KHR: unreachable("Copy KHR performance query results not implemented"); break; @@ -1540,7 +1577,9 @@ genX(CmdWriteAccelerationStructuresPropertiesKHR)( ANV_FROM_HANDLE(anv_query_pool, pool, queryPool); assert(queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR || - queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR); + queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR || + queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR || + queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR); struct mi_builder b; mi_builder_init(&b, cmd_buffer->device->info, &cmd_buffer->batch); @@ -1550,15 +1589,28 @@ genX(CmdWriteAccelerationStructuresPropertiesKHR)( struct anv_address query_addr = anv_address_add(anv_query_address(pool, firstQuery + i), 8); - if (queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR) { + switch (queryType) { + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: genX(grl_postbuild_info_compacted_size)(cmd_buffer, anv_address_physical(accel->address), anv_address_physical(query_addr)); - } else { - assert(queryType == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR); + break; + + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: + genX(grl_postbuild_info_current_size)(cmd_buffer, + anv_address_physical(accel->address), + anv_address_physical(query_addr)); + break; + + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR: genX(grl_postbuild_info_serialized_size)(cmd_buffer, anv_address_physical(accel->address), anv_address_physical(query_addr)); + break; + + default: + unreachable("unhandled query type"); } }