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 <sviatoslav.peleshko@globallogic.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21342>
(cherry picked from commit 4bf38f5652)
This commit is contained in:
Sviatoslav Peleshko 2023-02-15 17:15:42 +02:00 committed by Dylan Baker
parent 6a63ffb5ce
commit 3bc45e037f
2 changed files with 13 additions and 4 deletions

View file

@ -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"
},

View file

@ -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;