Module: Mesa
Branch: staging/22.3
Commit: fa4947e696d7d6cf0514f5081adc60fb760ffe38
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=fa4947e696d7d6cf0514f5081adc60fb760ffe38

Author: Sviatoslav Peleshko <[email protected]>
Date:   Thu Feb  9 17:56:32 2023 +0200

anv: Handle VkAccelerationStructureBuildRangeInfoKHR::transformOffset

Previously it was not actually handled. This meant that all geometries
with the same transform buffer were using the same (first) transformation
matrix.

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

---

 .pick_status.json                              | 2 +-
 src/intel/vulkan/genX_acceleration_structure.c | 9 +++++++--
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 4d145b9e875..cb06e464f48 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -310,7 +310,7 @@
         "description": "anv: Handle 
VkAccelerationStructureBuildRangeInfoKHR::transformOffset",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "main_sha": null,
         "because_sha": "f3ddfd81b4deaa8033d598527e0cbc255e60addc"
     },
diff --git a/src/intel/vulkan/genX_acceleration_structure.c 
b/src/intel/vulkan/genX_acceleration_structure.c
index 15f4fdbcefa..91a7cc247ab 100644
--- a/src/intel/vulkan/genX_acceleration_structure.c
+++ b/src/intel/vulkan/genX_acceleration_structure.c
@@ -523,7 +523,8 @@ vk_to_grl_VertexFormat(VkFormat format)
 
 static struct Geo
 vk_to_grl_Geo(const VkAccelerationStructureGeometryKHR *pGeometry,
-              uint32_t prim_count)
+              uint32_t prim_count,
+              uint32_t transform_offset)
 {
    struct Geo geo = {
       .Flags = vk_to_grl_GeometryFlags(pGeometry->flags),
@@ -544,6 +545,9 @@ vk_to_grl_Geo(const VkAccelerationStructureGeometryKHR 
*pGeometry,
          vk_tri->vertexData.deviceAddress;
       geo.Desc.Triangles.VertexBufferByteStride = vk_tri->vertexStride;
 
+      if (geo.Desc.Triangles.pTransformBuffer)
+         geo.Desc.Triangles.pTransformBuffer += transform_offset;
+
       if (vk_tri->indexType == VK_INDEX_TYPE_NONE_KHR) {
          geo.Desc.Triangles.IndexCount = 0;
          geo.Desc.Triangles.VertexCount = prim_count * 3;
@@ -818,7 +822,8 @@ cmd_build_acceleration_structures(
       for (unsigned g = 0; g < bs->num_geometries; g++) {
          const VkAccelerationStructureGeometryKHR *pGeometry = 
get_geometry(pInfo, g);
          uint32_t prim_count = pBuildRangeInfos[g].primitiveCount;
-         geos[g] = vk_to_grl_Geo(pGeometry, prim_count);
+         geos[g] = vk_to_grl_Geo(pGeometry, prim_count,
+                                 pBuildRangeInfos[g].transformOffset);
 
          prefixes[g] = prefix_sum;
          prefix_sum += prim_count;

Reply via email to