Progress Report June 2020

Written by GoldenX86 and Morph on July 01 2020

Hello fellow yuz-ers! We hope you are doing well. Once again, we’re here to tell you about some of the exciting changes that were implemented last month in both yuzu Mainline and Early Access.

In this episode, we have lots of fixes and optimizations, a feature many have been requesting, and as always, some hints of what the future will bring.

Bug fixes and improvements

How should we start? Oh, I know! With Morph fixing another Kirby issue of course! By reserving 4 image bindings in the fragment stage, instead of just one as before, he was able to fix several shader compilation errors that affected both GLSL and GLASM in Kirby Star Allies. Check out the results below, Poyo!

Here you can see the bug affecting an attack (Kirby Star Allies)

And here affecting terrain (Kirby Star Allies)

Rodrigo fixed a bug that previously manifested as random black flickering by marking vertex buffers as dirty after a cache invalidation. This issue primarily affected Animal Crossing: New Horizons, but the bugfix should affect a lot of other games as well. Feel free to share any other games you discover that benefit from this!

Now that doesn't look nice, does it? (Animal Crossing: New Horizons)

A very elusive bug in Super Mario Odyssey, dubbed the “triangle glitch,” had been tormenting us for ages. Rodrigo managed to solve the issue, but only in OpenGL with Nvidia GPUs due to the exclusive NV_vertex_buffer_unified_memory extension. However, due to both a yuzu and driver bug, we’re unable to use this extension on Turing based GPUs (RTX 2000 and GTX 1600 series) for the moment.

Dark and glitchy (Super Mario Odyssey)

We are working on a universal implementation in Vulkan that requires the VK_EXT_extended_dynamic_state extension, but it is not yet available in all the GPU vendors’ drivers. At the time of writing, only the Intel Mesa ANV Linux driver and the latest Nvidia Vulkan Beta driver support it.

A rare bug was affecting Xenoblade Chronicles 2, causing fantastic vertex explosions on time-of-day transitions. Rodrigo managed to solve the issue by improving the shader cache.

Exactly the same spot (Xenoblade Chronicles 2)

By implementing RendererInfo into yuzu’s audio emulation, ogniK solved the softlocks affecting the credit sequence in Animal Crossing: New Horizons and the softlocks in several areas of The Legend of Zelda: Link's Awakening. Now you can enjoy both games without the fear of getting stuck, and even listen to some newly working sound effects!

Nothing to report! (Animal Crossing: New Horizons & The Legend of Zelda: Link's Awakening)

Also thanks to ogniK, Animal Crossing: New Horizons no longer needs the crash-fix patch we were distributing in our compatibility article for the game. This was done by improving the emulation of the Tegra X1 GPU drivers. As a bonus, this also fixed T-posing on the later updates in Super Smash Bros. Ultimate!

Not all games are native to the Nintendo Switch, with a portion of its library consisting of ported games from other consoles or the PC. Up until now, yuzu failed to run PC game ports that were originally developed for Direct3D (a Windows graphics API), even though they ran perfectly fine in NVN (a Switch exclusive graphics API). However, Rodrigo found a way to translate this behavior to yuzu’s OpenGL and Vulkan implementations, resulting in tons of western games going in-game. This change was also accompanied by a shader cache invalidation.

 Would you kindly? (BioShock Remastered)

Would you kindly? (BioShock Remastered)

By implementing a missing texture format, Rodrigo fixed dark surface glitches that appear in Xenoblade Chronicles Definitive Edition.

This is the Monado's power!

(Xenoblade Chronicles Definitive Edition)

Intel used to have a bug in their OpenGL driver causing many games using Compute Shaders to crash or render effects incorrectly. This forced us to disable them on any supported Intel GPU, which introduced adverse effects in many games. One game of note is Super Smash Bros. Ultimate, wherein compute shaders are used to render character model animations and without them, character models will be in a T-pose.

Additionally, Intel’s OpenGL Geometry Shader implementation (unlike AMD’s and Nvidia’s one) lacks an OpenGL extension called GL_ARB_shader_viewport_layer_array. This forces us to re-evaluate yuzu’s implementation of it.

By re-enabling Compute Shaders and changing the way yuzu handles Geometry Shaders, Morph closed a big box of issues that previously affected only our Intel GPU users.

Gone are the rainbows on Intel (Octopath Traveler)


No more T-posing (Super Smash Bros. Ultimate)

Volca stubbed an input instruction allowing Minecraft: Nintendo Switch Edition to go in-game.

 Don't dig too deep! (Minecraft: Nintendo Switch Edition)

Don't dig too deep! (Minecraft: Nintendo Switch Edition)

Not all games have to be in 3D. Morph replaced the default texture filtering behaviour to achieve crisp graphics in 2D games like Undertale.

Crisp, just the way I like it

Now on to our final bug fix of last month. Old AMD GPUs from 2012 lack the OpenGL GL_EXT_texture_shadow_lod extension, leading to shaders that failed to build in The Legend of Zelda: Breath of the Wild. As described here, by using the textureGrad function, Morph achieved similar results, improving compatibility with such old devices.

Vulkan improvements

OCTOPATH TRAVELER got some Vulkan love thanks to Rodrigo. By implementing a missing image format and storage texels and atomic image operations, the game can now reach in-game status in Vulkan, and with some very beautiful visuals!

 This is how nostalgia makes us remember the SNES era (OCTOPATH TRAVELER)

This is how nostalgia makes us remember the SNES era (OCTOPATH TRAVELER)

Rodrigo also worked on multiple performance optimizations for the Vulkan API. This results in lower frametimes and higher framerates on average.

User Interface changes

An old misconception our users had with yuzu had to do with the Internal Resolution option in the graphics settings. This was carried over from Citra’s UI, but it wasn’t coded to do anything in yuzu. So, lots of users set it up at higher values expecting an image quality increase that could never happen. Morph decided it was time to remove it for good, and so he did.

 Until we meet again, Internal Resolution!

Until we meet again, Internal Resolution!

Thanks to users requesting it, Volca added Open Mods, FAQ, and Quickstart shortcuts to yuzu’s interface. This is a great way for users to find helpful information on how to use the emulator — you just need to click on Help!

 Just an easier way. Thanks Volca!

Just an easier way. Thanks Volca!

Continuing with UI changes, Kewlan added a mute audio hotkey. They also fixed a bug with the fullscreen hotkey, where the default hotkey would still function even when changed.

Dreams and reality

Project Maribel Hearn has been released, and is available in Mainline too! Native 32-bit Switch games are now starting to work, with some of them even being fully playable! This means that games like New Super Mario Bros. U Deluxe and Captain Toad: Treasure Tracker work almost perfectly and with great performance, while games like Mario Kart 8 Deluxe still need more work.

This has been a highly requested feature for a very long time, but implementing it required a major rewrite of the kernel, and official support for ARMv7 was needed in Dynarmic, our ARM JIT recompiler. This took a tremendous amount of work from several of our developers, including, but not limited to: Merry, Lioncache, Blinkhawk, bunnei, Rodrigo, Tobi, ogniK, Morph, and many others. Special mention goes to Merry and Lioncache: they are the soul of this project, and without them we couldn’t have even started it. Several of their pull requests are “too technical” to be included in the progress reports, but it should be known that Merry and Lioncache are the main code contributors at the heart of yuzu.

You may not have noticed that four months ago, bunnei and Tobi laid down the initial framework towards 32-bit support in yuzu.

They accomplished this by refactoring the ARM interface to support 32-bit and 64-bit JIT backends, implementing a 32-bit ARM interface based on Citra’s ARMv6 dynarmic backend by adding CP15 coprocessor support, and implementing several 32-bit SVCs such as GetThreadPriority32, WaitSynchronization32, and many more.

While rewriting the kernel for Prometheus, Blinkhawk and bunnei saw an excellent opportunity to include support for 32-bit ARMv7 CPU instructions and services. With this spark of motivation, they worked with Merry and Lioncache to make the dream of 32-bit support a reality, by ramping up the implementation of various ARMv7 instructions such as VPADD, VCVT, and VSHL in Dynarmic, and 32-bit SVCs such as CreateTransferMemory32, MapSharedMemory32, and CreateThread32 in yuzu. There are many other ARMv7 instructions and SVCs that we cannot cover here, but the culmination of this work allowed us to get the very first 32-bit games up and running!

 Good performance even on low-end hardware!

Good performance even on low-end hardware!

Additionally, the merge of this work into the Master branch also means that Multicore support is now working in Mainline! Thanks Blinkhawk for all your hard work on this! Please refer to our previous May progress report and the dedicated Project Prometheus article to read more about this crucial new feature.

Future projects

With Multicore finally in Master, some of the ideas we have “in the oven” can start to take shape. Project Apollo is starting to be nice and sound. And finally, I’ve heard bunnei is up to something, again.

That’s all for now, folks! We hope to see you in our July progress report! Special thanks to gidoly for providing screenshots.


Please consider supporting us on Patreon!
If you would like to contribute to this project, check out our GitHub!