Skip to content

v3.0_2026-01-29-rc4

Choose a tag to compare

@god-jester god-jester released this 30 Jan 08:26
4f35280

For players (stability-focused)

This release is primarily about stability. If you were frustrated by crashes or random UI glitches, this build should feel noticeably steadier.

  • Tested extensively on system update 21.2.0 (and 17.0.1) targeting 1080p ResHack and full GUI usage.
    • PLEASE replace your config.toml with the one in the release!
  • Emulator users: PLEASE enable 6GB/8GB RAM hack
    • 1440/2160 output targets (4K) are not yet stable again while I focus on Switch hardware stability; they will be stable again for v3.0 final release
  • Fixed a GPU/CPU sync hazard that caused random triangles/striping and occasional crashes when switching tabs or docking the overlay.
  • Reduced overlay memory pressure and added hard caps to prevent runaway allocations.
  • Made font loading and the UI atlas more reliable and smaller, reducing stalls and memory spikes.
  • Touch input now sends proper press/release events and clears hover correctly.

Known Issues (fixes landing Soon™):

  • 1440/2160 (4K) are not stable yet (stick to ~1400p max!)
  • Cannot collect challenge rift reward cache
  • Killing a Rift Guardian with certain options/cheats enabled may crash
  • Permanent scrollbar on GUI window despite nothing to scroll

Technical breakdown (ImGui RendererHasTextures path + stability)

  1. ImGui texture support is explicitly enabled via ImGuiBackendFlags_RendererHasTextures in source/program/gui2/imgui_overlay.cpp and source/third_party/imgui_backend/imgui_impl_nvn.cpp, and the backend now processes ImDrawData->Textures each frame via TextureSupport::ProcessTextures.
  2. source/third_party/imgui_backend/imgui_impl_nvn_textures.cpp implements the texture lifecycle: descriptor pools sized from NVN device limits, aligned memory pools via MemoryPoolMaker::createPoolAligned, free-list reuse, and delayed destruction (UnusedFrames vs FramesInFlight) to avoid in-flight GPU use.
  3. ImTextureID now carries the native NVN TextureHandle (ImU64) instead of a pointer, eliminating handle lifetime hazards when textures are recycled (imgui_impl_nvn_textures.cpp, imgui_impl_nvn.cpp).
  4. GPU/CPU hazard fix: vertex/index/UBO buffers are triple-buffered (FramesInFlight = 3) and selected per frame to avoid overwriting in-flight data; buffer caps guard against excessive allocations (source/third_party/imgui_backend/imgui_impl_nvn.hpp, source/third_party/imgui_backend/imgui_impl_nvn.cpp).
  5. Font atlas stability improvements: atlas uses Alpha8 and is stored as R8 with swizzle to avoid RGBA expansion; glyph ranges and oversampling are trimmed; max texture dimension capped to 4096; font build is deferred until the shell is initialized, with bounded waits for shared system fonts (source/program/gui2/imgui_overlay.cpp, source/third_party/imgui_backend/imgui_impl_nvn.cpp, source/third_party/imgui_backend/imgui_impl_nvn_textures.cpp).
  6. Allocator hardening: system allocator helpers added; config/layout buffers and ImGui allocations route through the system allocator when available, with fallback to nn::ro::LookupSymbol for malloc/free. Aligned allocation helpers reduce heap mismatches (source/program/system_allocator.hpp, source/program/nn_malloc.cpp, source/program/config.cpp, source/program/gui2/ui/overlay.cpp, source/program/gui2/imgui_overlay.cpp).
  7. Crash diagnostics: a user exception handler writes register/stack/module/memory info to sd:/config/d3hack-nx/user_exception.txt, and ErrorManager dumps are written to sd:/config/d3hack-nx/error_manager_dump.txt (source/program/exception_handler.cpp, source/program/d3/hooks/debug.hpp).
  8. Resolution path tweaks: NVN texture clamp hooks are disabled in the res hack (dynamic scale + memory preferred) and heap thresholds were tuned to reduce allocation failures at higher output sizes (source/program/d3/hooks/resolution.hpp, source/program/d3/patches.hpp).
  9. Other changes: touch press/hover release fix in the overlay (source/program/gui2/imgui_overlay.cpp), Chinese config strings updated (data/strings_zh.toml).