lavapipe: Implement ray_tracing_maintenance1 queries

Fixes: 1f729d9 ("lavapipe: Implement KHR_ray_tracing_maintenance1")
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/28716>
This commit is contained in:
Konstantin Seurer
2024-04-12 11:51:21 +02:00
committed by Marge Bot
parent a26f96ed3d
commit 4335d006a7
3 changed files with 31 additions and 13 deletions
+18 -7
View File
@@ -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;
}
}
@@ -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;
+11 -6
View File
@@ -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++) {