diff options
author | Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> | 2021-09-03 03:07:45 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2021-10-01 13:43:28 +0000 |
commit | 6def6ba04e4152979328d60bc67fbdaf7d9aa951 (patch) | |
tree | 2dc836e4d5c3516acd6e4b27fad1935d280826a6 /src/amd/vulkan/radv_query.c | |
parent | 817b4a9acad71def1e974c1e5d3bb0d5c61fec1b (diff) |
radv: Add acceleration structure queries.
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12840>
Diffstat (limited to 'src/amd/vulkan/radv_query.c')
-rw-r--r-- | src/amd/vulkan/radv_query.c | 74 |
1 files changed, 71 insertions, 3 deletions
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c index 971a82cb473..a34713900c6 100644 --- a/src/amd/vulkan/radv_query.c +++ b/src/amd/vulkan/radv_query.c @@ -30,6 +30,7 @@ #include "nir/nir_builder.h" #include "util/u_atomic.h" +#include "radv_acceleration_structure.h" #include "radv_cs.h" #include "radv_meta.h" #include "radv_private.h" @@ -963,6 +964,8 @@ radv_CreateQueryPool(VkDevice _device, const VkQueryPoolCreateInfo *pCreateInfo, pool->stride = pipelinestat_block_size * 2; break; case VK_QUERY_TYPE_TIMESTAMP: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: pool->stride = 8; break; case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT: @@ -1029,7 +1032,9 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first uint32_t available; 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_SERIALIZATION_SIZE_KHR: { uint64_t const *src64 = (uint64_t const *)src; uint64_t value; @@ -1269,6 +1274,8 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo pool->pipeline_stats_mask, pool->availability_offset + 4 * firstQuery); break; case VK_QUERY_TYPE_TIMESTAMP: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: if (flags & VK_QUERY_RESULT_WAIT_BIT) { for (unsigned i = 0; i < queryCount; ++i, dest_va += stride) { unsigned query = firstQuery + i; @@ -1315,13 +1322,26 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo } } +static uint32_t +query_clear_value(VkQueryType type) +{ + switch (type) { + case VK_QUERY_TYPE_TIMESTAMP: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: + return (uint32_t)TIMESTAMP_NOT_READY; + default: + return 0; + } +} + void radv_CmdResetQueryPool(VkCommandBuffer commandBuffer, VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount) { RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); RADV_FROM_HANDLE(radv_query_pool, pool, queryPool); - uint32_t value = pool->type == VK_QUERY_TYPE_TIMESTAMP ? (uint32_t)TIMESTAMP_NOT_READY : 0; + uint32_t value = query_clear_value(pool->type); uint32_t flush_bits = 0; /* Make sure to sync all previous work if the given command buffer has @@ -1351,7 +1371,7 @@ radv_ResetQueryPool(VkDevice _device, VkQueryPool queryPool, uint32_t firstQuery { RADV_FROM_HANDLE(radv_query_pool, pool, queryPool); - uint32_t value = pool->type == VK_QUERY_TYPE_TIMESTAMP ? (uint32_t)TIMESTAMP_NOT_READY : 0; + uint32_t value = query_clear_value(pool->type); uint32_t *data = (uint32_t *)(pool->ptr + firstQuery * pool->stride); uint32_t *data_end = (uint32_t *)(pool->ptr + (firstQuery + queryCount) * pool->stride); @@ -1674,3 +1694,51 @@ radv_CmdWriteTimestamp(VkCommandBuffer commandBuffer, VkPipelineStageFlagBits pi assert(cmd_buffer->cs->cdw <= cdw_max); } + +void +radv_CmdWriteAccelerationStructuresPropertiesKHR( + VkCommandBuffer commandBuffer, uint32_t accelerationStructureCount, + const VkAccelerationStructureKHR *pAccelerationStructures, VkQueryType queryType, + VkQueryPool queryPool, uint32_t firstQuery) +{ + RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); + RADV_FROM_HANDLE(radv_query_pool, pool, queryPool); + struct radeon_cmdbuf *cs = cmd_buffer->cs; + uint64_t pool_va = radv_buffer_get_va(pool->bo); + uint64_t query_va = pool_va + pool->stride * firstQuery; + + radv_cs_add_buffer(cmd_buffer->device->ws, cs, pool->bo); + + emit_query_flush(cmd_buffer, pool); + + ASSERTED unsigned cdw_max = + radeon_check_space(cmd_buffer->device->ws, cs, 6 * accelerationStructureCount); + + for (uint32_t i = 0; i < accelerationStructureCount; ++i) { + RADV_FROM_HANDLE(radv_acceleration_structure, accel_struct, pAccelerationStructures[i]); + uint64_t va = radv_accel_struct_get_va(accel_struct); + + switch (queryType) { + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR: + va += offsetof(struct radv_accel_struct_header, compacted_size); + break; + case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR: + va += offsetof(struct radv_accel_struct_header, serialization_size); + break; + default: + unreachable("Unhandle accel struct query type."); + } + + radeon_emit(cs, PKT3(PKT3_COPY_DATA, 4, 0)); + radeon_emit(cs, COPY_DATA_SRC_SEL(COPY_DATA_SRC_MEM) | COPY_DATA_DST_SEL(COPY_DATA_DST_MEM) | + COPY_DATA_COUNT_SEL | COPY_DATA_WR_CONFIRM); + radeon_emit(cs, va); + radeon_emit(cs, va >> 32); + radeon_emit(cs, query_va); + radeon_emit(cs, query_va >> 32); + + query_va += pool->stride; + } + + assert(cmd_buffer->cs->cdw <= cdw_max); +} |