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;
