From 4335d006a7cf4cbadb910609f416275ae9730312 Mon Sep 17 00:00:00 2001 From: Konstantin Seurer Date: Fri, 12 Apr 2024 11:51:21 +0200 Subject: [PATCH] lavapipe: Implement ray_tracing_maintenance1 queries Fixes: 1f729d9 ("lavapipe: Implement KHR_ray_tracing_maintenance1") Reviewed-by: Mike Blumenkrantz Part-of: --- src/gallium/frontends/lavapipe/lvp_execute.c | 25 ++++++++++++++------ src/gallium/frontends/lavapipe/lvp_private.h | 2 ++ src/gallium/frontends/lavapipe/lvp_query.c | 17 ++++++++----- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index a47465de9ef..eb8ba509a11 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -4475,15 +4475,26 @@ handle_write_acceleration_structures_properties(struct vk_cmd_queue_entry *cmd, for (uint32_t i = 0; i < write->acceleration_structure_count; i++) { VK_FROM_HANDLE(vk_acceleration_structure, accel_struct, write->acceleration_structures[i]); - if (write->query_type == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR) { + switch ((uint32_t)pool->base_type) { + case LVP_QUERY_ACCELERATION_STRUCTURE_COMPACTED_SIZE: dst[i] = accel_struct->size; - continue; + break; + case LVP_QUERY_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE: { + struct lvp_bvh_header *header = (void *)(uintptr_t)vk_acceleration_structure_get_va(accel_struct); + dst[i] = header->serialization_size; + break; + } + case LVP_QUERY_ACCELERATION_STRUCTURE_SIZE: + dst[i] = accel_struct->size; + break; + case LVP_QUERY_ACCELERATION_STRUCTURE_INSTANCE_COUNT: { + struct lvp_bvh_header *header = (void *)(uintptr_t)vk_acceleration_structure_get_va(accel_struct); + dst[i] = header->instance_count; + break; + } + default: + unreachable("Unsupported query type"); } - - assert (write->query_type == VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR); - - struct lvp_bvh_header *header = (void *)(uintptr_t)vk_acceleration_structure_get_va(accel_struct); - dst[i] = header->serialization_size; } } diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index 6a968dbef2a..5bbf294a5af 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -628,6 +628,8 @@ struct lvp_buffer_view { #define LVP_QUERY_ACCELERATION_STRUCTURE_COMPACTED_SIZE (PIPE_QUERY_TYPES) #define LVP_QUERY_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE (PIPE_QUERY_TYPES + 1) +#define LVP_QUERY_ACCELERATION_STRUCTURE_SIZE (PIPE_QUERY_TYPES + 2) +#define LVP_QUERY_ACCELERATION_STRUCTURE_INSTANCE_COUNT (PIPE_QUERY_TYPES + 3) struct lvp_query_pool { struct vk_object_base base; diff --git a/src/gallium/frontends/lavapipe/lvp_query.c b/src/gallium/frontends/lavapipe/lvp_query.c index af445b034eb..ef85dfe72eb 100644 --- a/src/gallium/frontends/lavapipe/lvp_query.c +++ b/src/gallium/frontends/lavapipe/lvp_query.c @@ -59,6 +59,14 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_CreateQueryPool( query_size = sizeof(uint64_t); pipeq = LVP_QUERY_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE; break; + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR: + query_size = sizeof(uint64_t); + pipeq = LVP_QUERY_ACCELERATION_STRUCTURE_SIZE; + break; + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR: + query_size = sizeof(uint64_t); + pipeq = LVP_QUERY_ACCELERATION_STRUCTURE_INSTANCE_COUNT; + break; default: return VK_ERROR_FEATURE_NOT_PRESENT; } @@ -96,8 +104,7 @@ VKAPI_ATTR void VKAPI_CALL lvp_DestroyQueryPool( if (!pool) return; - if (pool->base_type != LVP_QUERY_ACCELERATION_STRUCTURE_COMPACTED_SIZE && - pool->base_type != LVP_QUERY_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE) { + if (pool->base_type < PIPE_QUERY_TYPES) { for (unsigned i = 0; i < pool->count; i++) if (pool->queries[i]) device->queue.ctx->destroy_query(device->queue.ctx, pool->queries[i]); @@ -127,8 +134,7 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetQueryPoolResults( union pipe_query_result result; bool ready = false; - if (pool->base_type == LVP_QUERY_ACCELERATION_STRUCTURE_COMPACTED_SIZE || - pool->base_type == LVP_QUERY_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE) { + if (pool->base_type >= PIPE_QUERY_TYPES) { if (flags & VK_QUERY_RESULT_64_BIT) { uint64_t *dst = (uint64_t *)dest; uint64_t *src = (uint64_t *)pool->data; @@ -221,8 +227,7 @@ VKAPI_ATTR void VKAPI_CALL lvp_ResetQueryPool( LVP_FROM_HANDLE(lvp_device, device, _device); LVP_FROM_HANDLE(lvp_query_pool, pool, queryPool); - if (pool->base_type == LVP_QUERY_ACCELERATION_STRUCTURE_COMPACTED_SIZE || - pool->base_type == LVP_QUERY_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE) + if (pool->base_type >= PIPE_QUERY_TYPES) return; for (uint32_t i = 0; i < queryCount; i++) {