Mesa (main): radv: Add accel struct queries for maintenance1

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jun 8 20:56:26 UTC 2022


Module: Mesa
Branch: main
Commit: 5d56c2cfc0a36da5a3ba7fba344799655d74e992
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5d56c2cfc0a36da5a3ba7fba344799655d74e992

Author: Konstantin Seurer <konstantin.seurer at gmail.com>
Date:   Tue May 10 16:21:46 2022 +0200

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 at gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16430>

---

 src/amd/vulkan/radv_acceleration_structure.c | 10 ++++++++++
 src/amd/vulkan/radv_acceleration_structure.h |  1 +
 src/amd/vulkan/radv_query.c                  | 18 +++++++++++++++++-
 3 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/amd/vulkan/radv_acceleration_structure.c b/src/amd/vulkan/radv_acceleration_structure.c
index 4394ead136b..0ab407ba289 100644
--- a/src/amd/vulkan/radv_acceleration_structure.c
+++ b/src/amd/vulkan/radv_acceleration_structure.c
@@ -211,6 +211,12 @@ radv_WriteAccelerationStructuresPropertiesKHR(
          case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
             value = header->serialization_size;
             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:
             unreachable("Unhandled acceleration structure query");
          }
@@ -755,6 +761,8 @@ build_bvh(struct radv_device *device, const VkAccelerationStructureBuildGeometry
                                         sizeof(uint64_t) * header->instance_count,
                                      128);
 
+   header->size = accel->size;
+
 fail:
    device->ws->buffer_unmap(accel->bo);
    return result;
@@ -2281,6 +2289,8 @@ radv_CmdBuildAccelerationStructuresKHR(
                                           sizeof(uint64_t) * header.instance_count,
                                        128);
 
+      header.size = accel_struct->size;
+
       radv_update_buffer_cp(cmd_buffer,
                             radv_buffer_get_va(accel_struct->bo) + accel_struct->mem_offset + base,
                             (const char *)&header + base, sizeof(header) - base);
diff --git a/src/amd/vulkan/radv_acceleration_structure.h b/src/amd/vulkan/radv_acceleration_structure.h
index 4953abbdced..2bc3ac0b80c 100644
--- a/src/amd/vulkan/radv_acceleration_structure.h
+++ b/src/amd/vulkan/radv_acceleration_structure.h
@@ -54,6 +54,7 @@ struct radv_accel_struct_header {
    uint32_t copy_dispatch_size[3];
    uint64_t instance_offset;
    uint64_t instance_count;
+   uint64_t size;
 };
 
 struct radv_bvh_triangle_node {
diff --git a/src/amd/vulkan/radv_query.c b/src/amd/vulkan/radv_query.c
index 074ab33be5b..5a6030b84c1 100644
--- a/src/amd/vulkan/radv_query.c
+++ b/src/amd/vulkan/radv_query.c
@@ -934,6 +934,8 @@ radv_CreateQueryPool(VkDevice _device, const VkQueryPoolCreateInfo *pCreateInfo,
    case VK_QUERY_TYPE_TIMESTAMP:
    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_BOTTOM_LEVEL_POINTERS_KHR:
+   case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
       pool->stride = 8;
       break;
    case VK_QUERY_TYPE_TRANSFORM_FEEDBACK_STREAM_EXT:
@@ -1000,7 +1002,9 @@ radv_GetQueryPoolResults(VkDevice _device, VkQueryPool queryPool, uint32_t first
       switch (pool->type) {
       case VK_QUERY_TYPE_TIMESTAMP:
       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 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_ACCELERATION_STRUCTURE_COMPACTED_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:
       values += 1;
       break;
@@ -1290,6 +1296,8 @@ radv_CmdCopyQueryPoolResults(VkCommandBuffer commandBuffer, VkQueryPool queryPoo
    case VK_QUERY_TYPE_TIMESTAMP:
    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_BOTTOM_LEVEL_POINTERS_KHR:
+   case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
       if (flags & VK_QUERY_RESULT_WAIT_BIT) {
          for (unsigned i = 0; i < queryCount; ++i, dest_va += stride) {
             unsigned query = firstQuery + i;
@@ -1343,6 +1351,8 @@ query_clear_value(VkQueryType type)
    case VK_QUERY_TYPE_TIMESTAMP:
    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_BOTTOM_LEVEL_POINTERS_KHR:
+   case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR:
       return (uint32_t)TIMESTAMP_NOT_READY;
    default:
       return 0;
@@ -1755,6 +1765,12 @@ radv_CmdWriteAccelerationStructuresPropertiesKHR(
       case VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR:
          va += offsetof(struct radv_accel_struct_header, serialization_size);
          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:
          unreachable("Unhandle accel struct query type.");
       }



More information about the mesa-commit mailing list