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

Author: Sviatoslav Peleshko <[email protected]>
Date:   Wed Feb 15 17:15:42 2023 +0200

anv: Handle all fields in VkAccelerationStructureBuildRangeInfoKHR

Add handling of primitiveOffset and firstVertex.

Fixes: f3ddfd81 ("anv: Build BVHs on the GPU with GRL")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8296
Signed-off-by: Sviatoslav Peleshko <[email protected]>
Reviewed-by: Lionel Landwerlin <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21342>

---

 src/intel/vulkan/genX_acceleration_structure.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/intel/vulkan/genX_acceleration_structure.c 
b/src/intel/vulkan/genX_acceleration_structure.c
index 1de11c0cf0f..caf8b1ed6c4 100644
--- a/src/intel/vulkan/genX_acceleration_structure.c
+++ b/src/intel/vulkan/genX_acceleration_structure.c
@@ -469,7 +469,9 @@ vk_to_grl_VertexFormat(VkFormat format)
 static struct Geo
 vk_to_grl_Geo(const VkAccelerationStructureGeometryKHR *pGeometry,
               uint32_t prim_count,
-              uint32_t transform_offset)
+              uint32_t transform_offset,
+              uint32_t primitive_offset,
+              uint32_t first_vertex)
 {
    struct Geo geo = {
       .Flags = vk_to_grl_GeometryFlags(pGeometry->flags),
@@ -497,14 +499,18 @@ vk_to_grl_Geo(const VkAccelerationStructureGeometryKHR 
*pGeometry,
          geo.Desc.Triangles.IndexCount = 0;
          geo.Desc.Triangles.VertexCount = prim_count * 3;
          geo.Desc.Triangles.IndexFormat = INDEX_FORMAT_NONE;
+         geo.Desc.Triangles.pVertexBuffer += primitive_offset;
       } else {
          geo.Desc.Triangles.IndexCount = prim_count * 3;
          geo.Desc.Triangles.VertexCount = vk_tri->maxVertex;
          geo.Desc.Triangles.IndexFormat =
             vk_to_grl_IndexFormat(vk_tri->indexType);
+         geo.Desc.Triangles.pIndexBuffer += primitive_offset;
       }
+
       geo.Desc.Triangles.VertexFormat =
          vk_to_grl_VertexFormat(vk_tri->vertexFormat);
+      geo.Desc.Triangles.pVertexBuffer += vk_tri->vertexStride * first_vertex;
       break;
    }
 
@@ -512,7 +518,8 @@ vk_to_grl_Geo(const VkAccelerationStructureGeometryKHR 
*pGeometry,
       const VkAccelerationStructureGeometryAabbsDataKHR *vk_aabbs =
          &pGeometry->geometry.aabbs;
       geo.Type = GEOMETRY_TYPE_PROCEDURAL;
-      geo.Desc.Procedural.pAABBs_GPUVA = vk_aabbs->data.deviceAddress;
+      geo.Desc.Procedural.pAABBs_GPUVA =
+         vk_aabbs->data.deviceAddress + primitive_offset;
       geo.Desc.Procedural.AABBByteStride = vk_aabbs->stride;
       geo.Desc.Procedural.AABBCount = prim_count;
       break;
@@ -768,7 +775,9 @@ cmd_build_acceleration_structures(
          const VkAccelerationStructureGeometryKHR *pGeometry = 
get_geometry(pInfo, g);
          uint32_t prim_count = pBuildRangeInfos[g].primitiveCount;
          geos[g] = vk_to_grl_Geo(pGeometry, prim_count,
-                                 pBuildRangeInfos[g].transformOffset);
+                                 pBuildRangeInfos[g].transformOffset,
+                                 pBuildRangeInfos[g].primitiveOffset,
+                                 pBuildRangeInfos[g].firstVertex);
 
          prefixes[g] = prefix_sum;
          prefix_sum += prim_count;

Reply via email to