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;
