From 9b2ddd2c5ecd6b60752db3bb6d507611c8b6d9d8 Mon Sep 17 00:00:00 2001 From: Sviatoslav Peleshko Date: Thu, 9 Feb 2023 17:56:32 +0200 Subject: [PATCH] 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 Reviewed-by: Lionel Landwerlin Part-of: --- src/intel/vulkan/genX_acceleration_structure.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/intel/vulkan/genX_acceleration_structure.c b/src/intel/vulkan/genX_acceleration_structure.c index aa0a4a454c3..243c03bbb45 100644 --- a/src/intel/vulkan/genX_acceleration_structure.c +++ b/src/intel/vulkan/genX_acceleration_structure.c @@ -524,7 +524,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), @@ -545,6 +546,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; @@ -819,7 +823,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;