github kuraeow/ultratears v0.3.0
UltraTears 0.3.0

latest releases: v0.4.0, v0.3.1
12 days ago
  • Steam Deck / AMD: the Depths are fixed. The ground, the cave walls and Link's lighting are back.
  • Gyro aiming: no more drift, and it now works on the Steam Deck too, with your Steam Input layout untouched.
  • Faster: the game's code runs faster (registers kept in host registers), better thread scheduling, faster loading, no pause when saving, fewer GPU stalls; roughly 10-15 % more fps in busy places.
  • AMD: flickering fog fixed by shader translator fixes.
  • Launcher: updates are checked at every start.

This is a big update: the game is rebuilt almost from the start, about 30-40 minutes. Update when you are ready to wait that long; saves stay. Accept it in the launcher (0.2.0's launcher checks once a day), or by hand: extract the new zip over your game folder (Steam Deck / Linux: replace UltraTears.AppImage; copied over from Windows, turn on Allow executing file as program in its Properties, Permissions tab, in Desktop Mode), start the launcher and click Update the game.

Known issues: busy places like Lookout Landing are still slower than the rest of the game; rare flickering circles near Link.

Downloads

File For
UltraTears-0.3.0-windows-x86_64.zip (~150 MB) Windows; it can also build the game for a Steam Deck
UltraTears.AppImage (~210 MB) Linux and the Steam Deck

Follow the README to install.

Full list of changes

Steam Deck and AMD graphics

  • The Depths draw properly on AMD (Steam Deck, Radeon on Linux, the Windows build under Proton): the ground and the cave walls were missing and Link was dark. The terrain's patch tables were bound as if they were a 64 KiB uniform buffer wherever the graphics driver's uniform and storage alignments are the same, which is the case on AMD and Mesa.
  • Flickering fog on AMD: the shader translator now gives Maxwell's results where Vulkan leaves a result undefined (bit fields past bit 31, local variables read before they are written), and three more fixes: the vertex position is invariant across the passes that draw the same geometry, the depth compared against a 16-bit shadow map is rounded to 16 bits as on the Switch, and unwritten vertex outputs start at (0, 0, 0, 1).
  • Gyro aiming on the Steam Deck: the Deck's own gyro is read from its controller while buttons and sticks keep coming through Steam Input, so your Steam layout stays as it is. Nothing to set up.
  • Fewer GPU stalls: render passes no longer wait for all earlier GPU work, and image layouts change only when they must (in the Depths about 30 % fewer barriers a frame and nearly 90 % fewer layout changes). AMD drivers pay for these more than NVIDIA's.

Speed and smoothness

  • The game's code runs faster: inside a function the Switch CPU's registers and flags now live in C local variables, so the compiler keeps them in host registers. Checked against the previous translation on 1000 game functions from the same random states: no difference.
  • About 630 functions (459 of them in the SDK) were built without optimisation by mistake; they are optimised now.
  • Thread scheduling: a higher-priority thread now takes a virtual core at system calls and indirect calls instead of waiting for the holder to sleep; Windows uses SRW locks and condition variables; short sleeps are exact; 848 busy-wait loops of the game give their core to a waiting thread after 50 microseconds.
  • Loading: the game's zstd-compressed files decode with the system's libzstd, several times faster; saving writes to the disk on a thread of its own, so the game no longer stops for 95-135 ms on each save.
  • Command recording: the uniform-buffer capture at each submission no longer compares every range with every pending GPU write; recording threads keep the memory pool they used last. In busy places such as Lookout Landing that is roughly 10-15 % more frames a second.
  • Smaller things: memory barriers without a full fence where the game asks for a one-sided one, a clock without 128-bit divisions, fewer reallocations while recording, environment lookups cached on Linux too, the render pass kept when the game sets the same targets again.

Fixes

  • Gyro aiming drift (aim creeping to one side and then the other with the controller still): the gyro's zero-rate bias is now measured from your own controller whenever it is still, in the first seconds, and taken off; the tilt correction uses the gravity your controller actually reads. Samples are timed by the sensor.
  • After StartSixAxisSensor the gyro no longer hands out samples from before it.
  • Equipment could stay locked for a moment after loading a save at real-time frame steps.
  • Cube-map flags are set only on cube textures and arrays drawn to, not on every square texture array (on AMD this changed the ground textures' layout); depth sampled without a comparison reads one texel, as on the Switch.

Launcher

  • Updates are checked at every start, in the background; with no answer from GitHub nothing is shown.
  • Pre-releases are not offered as updates.
  • An update with the same version number is still offered as an update.
  • The game language's default reads "As in the system".

Known issues

  • Busy places such as Lookout Landing are still slower than the rest of the game: the game's own work and the recording of the GPU's commands take about the same time each frame. This is what the next version works on.
  • Rarely, white or red circles flicker at some distance from Link; not understood yet.

UltraTears is not affiliated with or endorsed by Nintendo. You need your own legally obtained copy of the game.

Don't miss a new ultratears release

NewReleases is sending notifications on new releases.