diff options
| author | Nathan V. Morrical <natemorrical@gmail.com> | 2021-06-04 17:18:14 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-04 16:18:14 -0700 |
| commit | 1617c2d4d7145435f34619d8d6706c5845b898c0 (patch) | |
| tree | 46187a6ac9cae538d20593eb10ab319acf21973f /prelude | |
| parent | 95a90d7fda3097d085cde1fea5213667277e729b (diff) | |
Enable tracing rays with OptiX backend (#1871)
* OptiX ray payload can now be read from and written to using the two payload register pointer method
* changing op to more descriptive name
* small tweak to allow for dumping out intermediate source for cuda targets
* initial trace ray call compiling
* hit attributes now work for float and int types, and vectors thereof
* Hitgroups using structs and arrays now work with optix
Co-authored-by: T. Foley <tfoleyNV@users.noreply.github.com>
Diffstat (limited to 'prelude')
| -rw-r--r-- | prelude/slang-cuda-prelude.h | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/prelude/slang-cuda-prelude.h b/prelude/slang-cuda-prelude.h index a6c4f70dc..91094a75e 100644 --- a/prelude/slang-cuda-prelude.h +++ b/prelude/slang-cuda-prelude.h @@ -1615,26 +1615,63 @@ struct UniformState; // ---------------------- OptiX Ray Payload -------------------------------------- #ifdef SLANG_CUDA_ENABLE_OPTIX +struct RayDesc +{ + float3 Origin; + float TMin; + float3 Direction; + float TMax; +}; + static __forceinline__ __device__ void *unpackOptiXRayPayloadPointer(uint32_t i0, uint32_t i1) { - const uint64_t uptr = static_cast<uint64_t>(i0) << 32 | i1; - void* ptr = reinterpret_cast<void*>(uptr); - return ptr; + const uint64_t uptr = static_cast<uint64_t>(i0) << 32 | i1; + void* ptr = reinterpret_cast<void*>(uptr); + return ptr; } static __forceinline__ __device__ void packOptiXRayPayloadPointer(void* ptr, uint32_t& i0, uint32_t& i1) { - const uint64_t uptr = reinterpret_cast<uint64_t>(ptr); - i0 = uptr >> 32; - i1 = uptr & 0x00000000ffffffff; + const uint64_t uptr = reinterpret_cast<uint64_t>(ptr); + i0 = uptr >> 32; + i1 = uptr & 0x00000000ffffffff; } static __forceinline__ __device__ void *getOptiXRayPayloadPtr() { - const uint32_t u0 = optixGetPayload_0(); - const uint32_t u1 = optixGetPayload_1(); - return unpackOptiXRayPayloadPointer(u0, u1); + const uint32_t u0 = optixGetPayload_0(); + const uint32_t u1 = optixGetPayload_1(); + return unpackOptiXRayPayloadPointer(u0, u1); +} + +template<typename T> +__forceinline__ __device__ void *traceOptiXRay( + OptixTraversableHandle AccelerationStructure, + uint32_t RayFlags, + uint32_t InstanceInclusionMask, + uint32_t RayContributionToHitGroupIndex, + uint32_t MultiplierForGeometryContributionToHitGroupIndex, + uint32_t MissShaderIndex, + RayDesc Ray, + T *Payload +) { + uint32_t r0, r1; + packOptiXRayPayloadPointer((void*)Payload, r0, r1); + optixTrace( + AccelerationStructure, + Ray.Origin, + Ray.Direction, + Ray.TMin, + Ray.TMax, + 0.f, /* Time for motion blur, currently unsupported in slang */ + InstanceInclusionMask, + RayFlags, + RayContributionToHitGroupIndex, + MultiplierForGeometryContributionToHitGroupIndex, + MissShaderIndex, + r0, r1 + ); } #endif |
