Skip to content

Commit c03932b

Browse files
committed
sycl: hoist timeSegment computation in motion blur mesh paths
For motion-blur triangle and quad meshes, each vertex(i, time) call independently recomputes timeSegment(time, ftime), which involves a floating-point divide, multiply, floor, and clamp. Since all vertices of the same primitive are sampled at identical ray.time(), the segment index and fractional time are the same for every vertex in the batch. Compute timeSegment once per primitive and call the indexed vertex(i, itime) overload with a manual lerp for all three (triangle) or four (quad) vertices. This eliminates 2-3 redundant timeSegment computations per procedural motion-blur primitive hit.
1 parent e059c38 commit c03932b

1 file changed

Lines changed: 9 additions & 7 deletions

File tree

kernels/sycl/rthwif_embree.cpp

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,10 @@ __forceinline bool intersect_primitive(intel_ray_query_t& query, Ray& ray, Scene
384384
{
385385
const TriangleMesh* triangle_mesh = (const TriangleMesh*) geom;
386386
const TriangleMesh::Triangle triangle = triangle_mesh->triangle(primID);
387-
Vec3fa v0 = triangle_mesh->vertex(triangle.v[0], ray.time());
388-
Vec3fa v1 = triangle_mesh->vertex(triangle.v[1], ray.time());
389-
Vec3fa v2 = triangle_mesh->vertex(triangle.v[2], ray.time());
387+
float ftime; const size_t itime = triangle_mesh->timeSegment(ray.time(), ftime);
388+
const Vec3fa v0 = lerp(triangle_mesh->vertex(triangle.v[0], itime+0), triangle_mesh->vertex(triangle.v[0], itime+1), ftime);
389+
const Vec3fa v1 = lerp(triangle_mesh->vertex(triangle.v[1], itime+0), triangle_mesh->vertex(triangle.v[1], itime+1), ftime);
390+
const Vec3fa v2 = lerp(triangle_mesh->vertex(triangle.v[2], itime+0), triangle_mesh->vertex(triangle.v[2], itime+1), ftime);
390391
return TriangleIntersector().intersect(ray,v0,v1,v2,Intersect1Epilog1_HWIF<Ray>(ray, context, geomID, primID, filter));
391392
} else
392393
#endif
@@ -396,10 +397,11 @@ __forceinline bool intersect_primitive(intel_ray_query_t& query, Ray& ray, Scene
396397
{
397398
const QuadMesh* quad_mesh = (const QuadMesh*) geom;
398399
const QuadMesh::Quad quad = quad_mesh->quad(primID);
399-
Vec3fa v0 = quad_mesh->vertex(quad.v[0], ray.time());
400-
Vec3fa v1 = quad_mesh->vertex(quad.v[1], ray.time());
401-
Vec3fa v2 = quad_mesh->vertex(quad.v[2], ray.time());
402-
Vec3fa v3 = quad_mesh->vertex(quad.v[3], ray.time());
400+
float ftime; const size_t itime = quad_mesh->timeSegment(ray.time(), ftime);
401+
const Vec3fa v0 = lerp(quad_mesh->vertex(quad.v[0], itime+0), quad_mesh->vertex(quad.v[0], itime+1), ftime);
402+
const Vec3fa v1 = lerp(quad_mesh->vertex(quad.v[1], itime+0), quad_mesh->vertex(quad.v[1], itime+1), ftime);
403+
const Vec3fa v2 = lerp(quad_mesh->vertex(quad.v[2], itime+0), quad_mesh->vertex(quad.v[2], itime+1), ftime);
404+
const Vec3fa v3 = lerp(quad_mesh->vertex(quad.v[3], itime+0), quad_mesh->vertex(quad.v[3], itime+1), ftime);
403405
bool ishit0 = TriangleIntersector().intersect(ray,v0,v1,v3,Intersect1Epilog1_HWIF<Ray>(ray, context, geomID, primID, filter));
404406
bool ishit1 = TriangleIntersector().intersect(ray,v2,v3,v1,[&](float &u, float &v, Vec3f& Ng) { u = 1.f - u; v = 1.f - v; }, Intersect1Epilog1_HWIF<Ray>(ray, context, geomID, primID, filter));
405407
return ishit0 || ishit1;

0 commit comments

Comments
 (0)