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

Author: Konstantin Seurer <[email protected]>
Date:   Fri Jan 20 19:30:20 2023 +0100

radv: Use compact encoding

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20818>

---

 src/amd/vulkan/radv_acceleration_structure.c | 53 +++++++++++++++++++++++++---
 src/amd/vulkan/radv_private.h                |  1 +
 2 files changed, 50 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/radv_acceleration_structure.c 
b/src/amd/vulkan/radv_acceleration_structure.c
index e1310c2f854..1914d63f9ea 100644
--- a/src/amd/vulkan/radv_acceleration_structure.c
+++ b/src/amd/vulkan/radv_acceleration_structure.c
@@ -67,6 +67,10 @@ static const uint32_t encode_spv[] = {
 #include "bvh/encode.spv.h"
 };
 
+static const uint32_t encode_compact_spv[] = {
+#include "bvh/encode_compact.spv.h"
+};
+
 #define KEY_ID_PAIR_SIZE 8
 
 enum internal_build_type {
@@ -298,6 +302,8 @@ radv_device_finish_accel_struct_build_state(struct 
radv_device *device)
                         &state->alloc);
    radv_DestroyPipeline(radv_device_to_handle(device), 
state->accel_struct_build.encode_pipeline,
                         &state->alloc);
+   radv_DestroyPipeline(radv_device_to_handle(device),
+                        state->accel_struct_build.encode_compact_pipeline, 
&state->alloc);
    radv_DestroyPipeline(radv_device_to_handle(device), 
state->accel_struct_build.morton_pipeline,
                         &state->alloc);
    radv_DestroyPipelineLayout(radv_device_to_handle(device),
@@ -565,6 +571,13 @@ radv_device_init_accel_struct_build_state(struct 
radv_device *device)
    if (result != VK_SUCCESS)
       goto exit;
 
+   result = create_build_pipeline_spv(
+      device, encode_compact_spv, sizeof(encode_compact_spv), sizeof(struct 
encode_args),
+      &device->meta_state.accel_struct_build.encode_compact_pipeline,
+      &device->meta_state.accel_struct_build.encode_p_layout);
+   if (result != VK_SUCCESS)
+      goto exit;
+
    result =
       create_build_pipeline_spv(device, morton_spv, sizeof(morton_spv), 
sizeof(struct morton_args),
                                 
&device->meta_state.accel_struct_build.morton_pipeline,
@@ -885,12 +898,18 @@ ploc_build_internal(VkCommandBuffer commandBuffer, 
uint32_t infoCount,
 static void
 encode_nodes(VkCommandBuffer commandBuffer, uint32_t infoCount,
              const VkAccelerationStructureBuildGeometryInfoKHR *pInfos,
-             struct bvh_state *bvh_states)
+             struct bvh_state *bvh_states, bool compact)
 {
    RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
-   radv_CmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE,
-                        
cmd_buffer->device->meta_state.accel_struct_build.encode_pipeline);
+   radv_CmdBindPipeline(
+      commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE,
+      compact ? 
cmd_buffer->device->meta_state.accel_struct_build.encode_compact_pipeline
+              : 
cmd_buffer->device->meta_state.accel_struct_build.encode_pipeline);
+
    for (uint32_t i = 0; i < infoCount; ++i) {
+      if (compact != bvh_states[i].config.compact)
+         continue;
+
       RADV_FROM_HANDLE(vk_acceleration_structure, accel_struct, 
pInfos[i].dstAccelerationStructure);
 
       VkGeometryTypeKHR geometry_type = VK_GEOMETRY_TYPE_TRIANGLES_KHR;
@@ -902,6 +921,31 @@ encode_nodes(VkCommandBuffer commandBuffer, uint32_t 
infoCount,
          geometry_type = pInfos[i].pGeometries ? 
pInfos[i].pGeometries[0].geometryType
                                                : 
pInfos[i].ppGeometries[0]->geometryType;
 
+      if (bvh_states[i].config.compact) {
+         uint32_t leaf_node_size = 0;
+         switch (geometry_type) {
+         case VK_GEOMETRY_TYPE_TRIANGLES_KHR:
+            leaf_node_size = sizeof(struct radv_bvh_triangle_node);
+            break;
+         case VK_GEOMETRY_TYPE_AABBS_KHR:
+            leaf_node_size = sizeof(struct radv_bvh_aabb_node);
+            break;
+         case VK_GEOMETRY_TYPE_INSTANCES_KHR:
+            leaf_node_size = sizeof(struct radv_bvh_instance_node);
+            break;
+         default:
+            unreachable("");
+         }
+
+         uint32_t dst_offset =
+            sizeof(struct radv_bvh_box32_node) + bvh_states[i].leaf_node_count 
* leaf_node_size;
+         radv_update_buffer_cp(cmd_buffer,
+                               pInfos[i].scratchData.deviceAddress +
+                                  bvh_states[i].scratch.header_offset +
+                                  offsetof(struct radv_ir_header, 
dst_node_offset),
+                               &dst_offset, sizeof(uint32_t));
+      }
+
       const struct encode_args args = {
          .intermediate_bvh = pInfos[i].scratchData.deviceAddress + 
bvh_states[i].scratch.ir_offset,
          .output_bvh =
@@ -995,7 +1039,8 @@ radv_CmdBuildAccelerationStructuresKHR(
 
    cmd_buffer->state.flush_bits |= flush_bits;
 
-   encode_nodes(commandBuffer, infoCount, pInfos, bvh_states);
+   encode_nodes(commandBuffer, infoCount, pInfos, bvh_states, false);
+   encode_nodes(commandBuffer, infoCount, pInfos, bvh_states, true);
 
    for (uint32_t i = 0; i < infoCount; ++i) {
       RADV_FROM_HANDLE(vk_acceleration_structure, accel_struct, 
pInfos[i].dstAccelerationStructure);
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 56a37cc9a2d..d4a6aed3fd6 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -698,6 +698,7 @@ struct radv_meta_state {
       VkPipeline ploc_extended_pipeline;
       VkPipelineLayout encode_p_layout;
       VkPipeline encode_pipeline;
+      VkPipeline encode_compact_pipeline;
       VkPipelineLayout copy_p_layout;
       VkPipeline copy_pipeline;
 

Reply via email to