Skip to content

3.2.0.ceba893

Pre-release
Pre-release

Choose a tag to compare

@RichardGe RichardGe released this 21 Oct 07:04

HIPRT 3.2.0

Previous release: 3.1.0 (5 January 2026). This release covers 9 months of upstream work.


Breaking changes

  • hiprtFrameSRT layout changed — a shear field is inserted between scale and translation; the struct grows from 48 to 64 bytes and its alignment from 16 to 64. Applications must be recompiled.
  • HIPRT_API_VERSION is now 3002. A binary built against 3.1.x is rejected by hiprtCreateContext with hiprtErrorInvalidApiVersion instead of silently mismatching the new frame layout.
  • Traversal and stack types (hiprtPrivateStack, hiprtGeomTraversalClosest, …) are now template aliases instead of opaque classes. All public names are preserved, but forward declarations no longer work and the exposed size/alignment constants are gone.
  • The HIPRT_ASSERT macro is replaced by the hiprtAssert() inline function.
  • hiprt::ptr() is removed from hiprt_math.h, replaced by hiprt::component() (see Bug fixes).
  • Most API structs now have default member initializers, including the build inputs, the function table, the stack buffers and both frame types.

Performance

  • Triangle normals are decoded once after the traversal loop instead of for every candidate hit (RTIP 3.1).
  • Transform functions are now actually unrolled.

New features

  • Instance transforms can be read back from device code: hiprtGetObjectToWorldFrameSRT, hiprtGetWorldToObjectFrameSRT, hiprtGetObjectToWorldFrameMatrix, hiprtGetWorldToObjectFrameMatrix, each with a two-level and a multi-level (MLAS) overload.
  • SRT frames support shear, exposed as hiprtFrameSRT::shear.
  • Medusa support: gfx1170, gfx1171, gfx115E.
  • CUDA 13 support; bundled hipRTC and comgr DLLs updated from 6.4 to 7.1; hipRTC 7.8 and newer can now be loaded.
  • HIP and hipRTC libraries are now preferred from the SDK named by HIP_PATH / ROCM_PATH over whatever the platform loader finds first. On Windows this stops the display driver's copy in System32 from shadowing the SDK the application was built against. With neither variable set, the search order is unchanged.

Bug fixes

  • Undefined behaviour in dynamic vector component access — (&v.x)[i] let compilers assume no aliasing with v.y via TBAA and drop stores to other members. Replaced throughout the builder by a member-pointer accessor.
  • Illegal memory access when packing a triangle pair that cannot be paired; the pairing test is now order-independent.
  • Refit wrote vertices into build slots instead of reusing the packet's descriptor slots, corrupting nodes on update (gfx1201).
  • BVH collapse now uses acquire/release ordering, and Morton code pointer arithmetic is corrected.
  • Scene storage size was double-counted for batch-eligible scenes with custom BVH import, inflating the allocation.
  • compactScenes copied only half of each instance record (wrong element stride), corrupting compacted scenes.
  • The compiler is now initialised against the HIPRT context rather than whatever context was current, fixing multi-GPU setups.
  • Kernel cache file names are sanitised; devices whose name contains a path separator, such as AMD Instinct MI250X / MI250, no longer fail to write the cache. Existing caches stay valid.
  • Only the file name is passed to orortcCreateProgram; an absolute module path made comgr fail silently on Windows.
  • The offload target is named explicitly when compiling kernels, instead of relying on the ambient context — should fix hipErrorInvalidImage on toolchains whose default target set excludes the running device.
  • GPU architecture numbers are parsed as hexadecimal, so steppings with a letter (gfx115E) are no longer truncated.
  • 64-bit lane masks are built with 64-bit shifts, and gfx950 is correctly detected as a wavefront-64 target; both broke warp-level logic on wave64 hardware.
  • Temporary build buffers are checked for alignment and report hiprtErrorInvalidParameter.

Build and tooling

  • CMake: fixed kernel output paths on multi-config generators, all files exported by the compile scripts are tracked as outputs so a missing one triggers a rebuild, and Python is only required when kernels are actually compiled. Incorporates public PRs #53 and #61.
  • The precompilation script asks clang which gfx targets it supports instead of inferring them from the SDK version.

Internal

Large-scale modernisation of the codebase — RTIP namespaces, Pimpl removal, node and triangle-packet refactoring, const and [[nodiscard]] propagation, formatting unification. No intended behaviour change.