mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-10-02 02:43:44 +00:00
feat(ugc): ray_backend=hiprt traces on the GPU with HIPRT and Orochi (optional build)
HIPRT (MIT) behind the CMake option DLU_HIPRT (off): its headers come from its SDK (HIPRT_ROOT, else ROCm's /opt/rocm) and are copied next to the servers; its library is loaded when first used (hiprtew), as HIP or CUDA are by Orochi (MIT, fetched pinned by hash; CUDA when its toolkit is found). The trace kernels (nearest hit skipping the triangle a ray leaves, any hit) are compiled the first time and kept in cache/hiprt. One GPU context for the process (hiprt_device picks the GPU); the workers take turns on it. When HIPRT, the GPU or a scene's upload fails, Embree is used instead, and the UGC server logs why at start. For a GPU the rays go in batches (UgcRays::Scene gets batch queries; the CPU backends answer them a ray at a time): - hidden faces: with a batch backend the paths are traced side by side, a bounce at a time (the path code split into Start, Scatter and Bounce, the one by one tracing unchanged); the same paths with the same random numbers, so the same triangles are decided (tested with builtin side by side) - the occlusion bake and the denoised icons' traced occlusion always ask in batches (the same rays, the same results) Its symbols are hidden: the servers export theirs (-rdynamic), and HIPRT's library, which has an Orochi of its own, would otherwise call ours. Check: configure with -DDLU_HIPRT=ON on a machine with ROCm (or HIPRT's SDK) and an AMD RDNA or NVIDIA GPU; UgcServer --make-model x.lxfml out hiprt; the UGC tests (hits, hidden faces and occlusion against builtin); a build without it leaves everything as before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -2215,6 +2215,24 @@ TEST(UgcRays, BackendsFindTheSameHits) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST(UgcHsr, SideBySideDecidesTheSameAsOneByOne) {
|
||||
// The paths traced side by side (as for a GPU) are the same paths, so the same triangles stay; ground plane too
|
||||
for (const bool ground : { false, true }) {
|
||||
UgcHsr::Options options;
|
||||
options.seed = 5;
|
||||
options.samples = 2;
|
||||
options.groundPlane = ground;
|
||||
const auto mesh = Clutter();
|
||||
uint64_t points = 0, paths = 0, sidePoints = 0, sidePaths = 0;
|
||||
const auto oneByOne = UgcHsr::Visible(mesh, options, &points, &paths);
|
||||
options.sideBySide = true;
|
||||
EXPECT_EQ(UgcHsr::Visible(mesh, options, &sidePoints, &sidePaths), oneByOne) << ground;
|
||||
EXPECT_EQ(sidePoints, points);
|
||||
EXPECT_GE(sidePaths, paths); // it traces a round's other paths too once one escaped
|
||||
EXPECT_EQ(UgcHsr::Visible(Room(true), options), UgcHsr::Visible(Room(true), UgcHsr::Options{ .groundPlane = ground, .samples = 2, .seed = 5 }));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(UgcRays, OtherBackendsMakeTheSameModels) {
|
||||
// The hidden faces and the occlusion with each backend. The paths bounce, so a hit found a rounding further away
|
||||
// sends a path on from a slightly different point: the rare triangle decided by a path that only just gets out
|
||||
|
||||
Reference in New Issue
Block a user