From 3bc45e037f2eb40a90bb4ac4fa4196d060fa3dd4 Mon Sep 17 00:00:00 2001 From: Sviatoslav Peleshko Date: Wed, 15 Feb 2023 17:15:42 +0200 Subject: [PATCH] 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 Reviewed-by: Lionel Landwerlin Part-of: (cherry picked from commit 4bf38f5652b1910f388482473d808a6f8fe5a2d8) --- .pick_status.json | 2 +- src/intel/vulkan/genX_acceleration_structure.c | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index c471e6e4b8a..f9493ea243a 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -1687,7 +1687,7 @@ "description": "anv: Handle all fields in VkAccelerationStructureBuildRangeInfoKHR", "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 243c03bbb45..b971d5b1767 100644 --- a/src/intel/vulkan/genX_acceleration_structure.c +++ b/src/intel/vulkan/genX_acceleration_structure.c @@ -525,7 +525,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), @@ -553,14 +555,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; } @@ -568,7 +574,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; @@ -824,7 +831,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;