yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/index.html

881 lines
42 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang=" en-us "class="has-navbar-fixed-top">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,minimum-scale=1,initial-scale=1">
<meta name="theme-color" content="#404040">
<meta property="og:title" content="Progress Report September 2021 &middot; yuzu" />
<meta property="og:site_name" content="yuzu" />
<meta property="og:url" content="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/" />
<meta property="og:description" content="Hi yuz-ers! Welcome to the latest entry of our monthly progress reports. We have even more GPU rendering fixes, TAS support, 8 player mayhem, input and UI
changes, some preliminary work for future big changes, and more!" />
<meta name="description" content="Hi yuz-ers! Welcome to the latest entry of our monthly progress reports. We have even more GPU rendering fixes, TAS support, 8 player mayhem, input and UI
changes, some preliminary work for future big changes, and more!" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/banner.png" />
<link rel="icon" href="https://yuzu-mirror.github.io/favicon.ico" />
<link rel="shortcut icon" href="https://yuzu-mirror.github.io/favicon.ico" type="image/x-icon" />
<link rel="canonical" href="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/">
<title>Progress Report September 2021 - yuzu</title>
<link href="https://fonts.googleapis.com/css?family=Ubuntu|Dosis" rel="stylesheet">
<link href="https://use.fontawesome.com/releases/v6.4.0/css/all.css" rel="stylesheet">
<link rel="stylesheet" href="https://yuzu-mirror.github.io/scss/style.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/baguettebox.js/1.11.1/baguetteBox.min.css" type="text/css" />
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-112443698-1"></script>
<script type="text/javascript">
window.dataLayer = window.dataLayer || [];
function gtag() { dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'UA-112443698-1');
</script>
</head>
<body>
<nav class="navbar is-dark is-size-6 is-fixed-top" role="navigation" aria-label="main navigation">
<div class="container">
<div class="navbar-brand">
<a class="navbar-item" href="https://yuzu-mirror.github.io">
<svg xmlns="http://www.w3.org/2000/svg" class="navbar-logo" viewBox="0 0 515.83 163.11"><defs><style>.cls-1{fill:#fff;}.cls-2{fill:#ff3c28;}.cls-3{fill:#0ab9e6;}</style></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path class="cls-1" d="M515.83,23.23v73c0,14.5-2.24,25.24-6.84,32.82-5.92,10.15-16.2,15.32-30.53,15.32s-24.62-5.23-30.58-15.57c-4.56-7.64-6.79-18.42-6.79-32.92V23.23a4.51,4.51,0,0,1,4.51-4.51h2.28a4.51,4.51,0,0,1,4.51,4.51v72.5c0,33.53,14.88,37.4,26.07,37.4,12.14,0,26.08-4.17,26.08-36.71V23.23a4.51,4.51,0,0,1,4.51-4.51h2.27A4.51,4.51,0,0,1,515.83,23.23Z"/><path class="cls-1" d="M421.34,144.4H353.45c-2.35,0-4.72-1.88-4.72-6.08a8.32,8.32,0,0,1,1.33-4.49L410.39,29.36H360.8a4.51,4.51,0,0,1-4.51-4.5V23.28a4.51,4.51,0,0,1,4.48-4.51h.81c58.68-.11,59.11,0,59.66.07a5.19,5.19,0,0,1,4,5.8,8.74,8.74,0,0,1-1.32,3.75L363.33,133.17h58a4.51,4.51,0,0,1,4.51,4.51v2.21A4.51,4.51,0,0,1,421.34,144.4Z"/><path class="cls-1" d="M248.45,23.23v82.06c0,26-11.8,38.44-37.12,39.09h-.12a4.51,4.51,0,0,1-4.51-4.51V137.5a4.51,4.51,0,0,1,4.48-4.5c18.49-.15,26-8.23,26-27.9v-2.37a32.34,32.34,0,0,1-3.34,3.28c-6.39,5.5-14.5,8.29-24.07,8.29-22.86,0-35-12.41-35-35.89V23.23a4.52,4.52,0,0,1,4.51-4.51h2.22a4.52,4.52,0,0,1,4.5,4.51v55c0,7.6,1.82,14.22,5,18.18,3.57,4.56,9.17,6.49,18.75,6.49,10.13,0,17.32-3.76,22-11.5,3.61-5.92,5.43-13.66,5.43-23V23.23a4.52,4.52,0,0,1,4.51-4.51h2.22A4.52,4.52,0,0,1,248.45,23.23Z"/><path class="cls-1" d="M338.12,23.23v73c0,14.5-2.24,25.24-6.84,32.82-5.92,10.15-16.2,15.32-30.53,15.32s-24.62-5.23-30.58-15.57c-4.56-7.64-6.79-18.42-6.79-32.92V23.23a4.51,4.51,0,0,1,4.51-4.51h2.28a4.51,4.51,0,0,1,4.51,4.51v72.5c0,33.53,14.88,37.4,26.07,37.4,12.14,0,26.08-4.17,26.08-36.71V23.23a4.51,4.51,0,0,1,4.51-4.51h2.27A4.51,4.51,0,0,1,338.12,23.23Z"/><g id="g823"><g id="right"><g id="g827"><g id="g833"><path id="path835" class="cls-2" d="M81.56,32.62V163.11a65.25,65.25,0,0,0,0-130.49M94.3,46.91a52.54,52.54,0,0,1,0,101.91V46.91"/></g></g></g><g id="left"><g id="g839"><g id="g845"><path id="path847" class="cls-3" d="M65.24,0a65.25,65.25,0,0,0,0,130.49ZM52.5,14.29V116.2A52.52,52.52,0,0,1,28.12,28.12,52.16,52.16,0,0,1,52.5,14.29"/></g></g></g></g></g></g></svg>
</a>
<div class="burger navbar-burger is-dark" data-target="navMenu">
<span></span>
<span></span>
<span></span>
</div>
</div>
<div class="navbar-menu" id="navMenu">
<div class="navbar-start">
<a class="navbar-item px-lg" href="/entry">
Blog
</a>
<a class="navbar-item px-lg" href="/downloads">
Download
</a>
<a class="navbar-item px-lg" href="/wiki/faq">
FAQs
</a>
<a class="navbar-item px-lg" href="/game">
Compatibility
</a>
<a class="navbar-item px-lg" href="/screenshots">
Screenshots
</a>
<a class="navbar-item px-lg" href="https://www.patreon.com/yuzuteam">
Patreon
</a>
<a class="navbar-item px-lg" href="https://profile.yuzu-mirror.github.io">
Profile
</a>
<a class="navbar-item px-lg is-hidden-desktop" href="https://discord.gg/u77vRWY" target="_blank">
<i class="fab fa-discord mr-sm"></i> Discord
</a>
<a class="navbar-item px-lg is-hidden-desktop" href="https://twitter.com/yuzuemu" target="_blank">
<i class="fab fa-twitter mr-sm"></i> Twitter
</a>
<a class="navbar-item px-lg is-hidden-desktop" href="https://github.com/yuzu-mirror/yuzu" target="_blank">
<i class="fab fa-github mr-sm"></i> GitHub
</a>
</div>
<div class="navbar-end">
<a class="navbar-item px-lg is-hidden-touch" href="https://discord.gg/u77vRWY" target="_blank">
<span class="icon">
<i class="fab fa-2x fa-discord"></i>
</span>
</a>
<a class="navbar-item px-lg is-hidden-touch" href="https://twitter.com/yuzuemu" target="_blank">
<span class="icon">
<i class="fab fa-2x fa-twitter"></i>
</span>
</a>
<a class="navbar-item px-lg is-hidden-touch" href="https://github.com/yuzu-mirror/yuzu" target="_blank">
<span class="icon">
<i class="fab fa-2x fa-github"></i>
</span>
</a>
</div>
</div>
</div>
</nav>
<div class="mb-md blog-entry-header single" style="background-image: url('https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/banner_hue0475e4bf02c0a4c121f73946f7efd98_714941_1280x0_resize_q99_bgffffff_box_3.jpg');background-repeat:no-repeat;background-size:contain;background-position:center;"></div>
<div class="has-text-centered">
<div>
<span class="title px-md py-sm">Progress Report September 2021</span>
</div>
<div>
<p class="h3 px-md py-sm">
Written by <a href="https://community.citra-emu.org/u/GoldenX86/summary">GoldenX86</a>
and <a href="https://community.citra-emu.org/u/Honghoa/summary">Honghoa</a>
on October 11 2021
</p>
</div>
</div>
<div class="container">
<div class="columns is-centered">
<div class="column is-four-fifths">
<section class="section content pt-sm">
<br>
<p>Hi yuz-ers! Welcome to the latest entry of our monthly progress reports. We have even more GPU rendering fixes, TAS support, 8 player mayhem, input and UI
changes, some preliminary work for future big changes, and more!</p>
<h2 id="yet-more-amd-specific-changes-and-other-graphical-fixes">Yet more AMD specific changes and other graphical fixes</h2>
<p>Certain AMD and Intel GPUs were unable to utilize yuzu&rsquo;s unlock FPS feature with the Vulkan API, due to the lack of driver support for the <code>VK_PRESENT_MODE_MAILBOX_KHR</code> presentation mode.
They, however, support <code>VK_PRESENT_MODE_IMMEDIATE_KHR</code>, another mode that allows Vulkan to present at a higher framerate than the screen refresh rate, so
<a href="https://github.com/ameerj">epicboy</a> made the <a href="https://github.com/yuzu-emu/yuzu/pull/7003">necessary changes</a> in order to unlock the FPS on these GPUs.
Due to the nature of this presentation mode, this may cause visible tearing on the screen, so bear that in mind if you try this out.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./framerate.png" title=" And this is with just an RX 550 (Metroid Dread)">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/framerate_hufbca9929c0aee4c563e79d8b7b133cfc_1511357_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" And this is with just an RX 550 (Metroid Dread)"></a>
<p class="has-text-centered is-italic has-text-grey-light"> And this is with just an RX 550 (Metroid Dread)</p>
</div>
</div>
<p>Booting a title in Linux with the Vulkan API using the Intel Mesa driver resulted in a crash due to a device loss error.
The problem was in the synchronization between the rendering and subsequent presentation of frames.</p>
<p>Previously, yuzu would issue the Vulkan <code>Present</code> command, then wait for the frame to be rendered before continuing with the process.
While this was fine for other drivers and vendors, ANV (Intels Vulkan driver) expected to have the frame already rendered before this command, causing this error.</p>
<p>epicboy fixed the synchronization behaviour so that
<a href="https://github.com/yuzu-emu/yuzu/pull/6953">yuzu now waits until the frame is fully rendered and ready before presenting it</a>.</p>
<p>With the release of AMDs Windows driver version 21.9.1, and its equivalent AMDVLK and AMDGPU-PRO Vulkan Linux counterparts, users started noticing crashes in most games right
at boot.
We rushed once again to blame AMD for breaking another extension, as it wouldnt be the first time.
We even singled out <code>Int8Float16</code> as the culprit, providing an
<a href="https://github.com/yuzu-emu/yuzu/pull/7006">alternative path that reduced performance on all AMD GPUs running non-RADV drivers.</a></p>
<p>We were wrong.</p>
<p>Turns out, it was our fault.
epicboy found out that during the process of initializing Vulkan, the emulator
<a href="https://github.com/yuzu-emu/yuzu/pull/7027">assigned Int8Float16s values after its memory was freed.</a>
Surprisingly, this only started affecting official AMD drivers recently, after their periodical Vulkan version update.
So we had to lay down the pitchforks, <em>this time.</em>
Performance returned to normal after the introduction of this PR.</p>
<p>AMD Windows users are also familiar with certain stages in <code>Super Smash Bros. Ultimate</code> turning completely white or ghosting, akin to when applications <a href="https://i.stack.imgur.com/4Jh7t.jpg">would freeze</a> back in the Windows XP era.
Those were the good days.</p>
<p>Ahem, anyway, AMD Radeon GPUs lack support for fixed point 24-bit depth textures, or D24 for short, a relatively common texture format.
To bypass this hardware limitation, yuzu uses D32 textures instead, which can cause precision issues during the conversion process.
<a href="https://github.com/yuzu-emu/yuzu/pull/7070">By adjusting the Depth Bias and Polygon Offset of yuzus D24 emulation,</a> <a href="https://github.com/FernandoS27">Blinkhawk</a> solves the issue for good.</p>
<div class="columns is-img-preview is-bottom-marginless">
<div class="column is-bottom-paddingless">
<a href="./smashbug.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/smashbug_hu3cad3d3496a1b9e9ecfe5512ca9aa21d_2087765_800x0_resize_q90_bgffffff_box_3.jpg" alt="Fair play, please (Super Smash Bros. Ultimate)"></a>
</div>
<div class="column is-bottom-paddingless">
<a href="./smashfix.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/smashfix_hu73706acd92810e3237a0754e629ff3db_2444679_800x0_resize_q90_bgffffff_box_3.jpg" alt="Fair play, please (Super Smash Bros. Ultimate)"></a>
</div>
</div>
<p class="has-text-centered is-italic has-text-grey-light">Fair play, please (Super Smash Bros. Ultimate)</p>
<p>Yet another AMD Radeon specific issue is visible when playing <code>The Legend of Zelda: Breath of the Wild</code>.
Terrain textures were colourful and corrupted, like when a PC gamer dials up the RGB to 11.</p>
<p>This issue affected our regular suspects, GCN4 devices (Polaris, RX 400/500 series) and older, running on the Windows and Linux proprietary Vulkan drivers.
GCN5 (Vega), RDNA1, and RDNA2 devices were unaffected.
The problem resided in how we guessed the textures were being handled by the game.</p>
<p>Some information first: there are several ways to handle textures, and in this particular example we need to focus on two, <code>Cube Maps</code> and <code>Texture Arrays</code>.</p>
<p>Cube maps are a cube with its six faces filled with different textures.
The coordinate used to fetch the data, unlike the regular X and Y values, is a single <a href="https://en.wikipedia.org/wiki/Versor">versor</a> originating from the center and pointing
to the surface of the cube.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./array.png" title=" ">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/array_hu920f27f94bbf0db0eb0183e1a214ebcc_5896_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" "></a>
<p class="has-text-centered is-italic has-text-grey-light"> </p>
</div>
</div>
<p>Texture arrays on the other hand are just as the name implies, an ordered array of textures one after the other, with X and Y used for positioning information inside the
texture, and a Z axis used to determine which texture of the array is in use.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./cube.png" title=" ">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/cube_huca32371eac8086dcb2f34036394b343a_9781_559x0_resize_q90_bgffffff_box_3.jpg" alt=" "></a>
<p class="has-text-centered is-italic has-text-grey-light"> </p>
</div>
</div>
<p>TL;DR, one is a sphere and the other is a list.</p>
<p>Vulkan allows for textures to be marked for conversion into cube maps if later needed, but the sampling (reading) is determined by the texture type specified by the games shader
instructions. This type is then passed to the graphics API.
We do just this and the game decides to keep its textures as arrays, which is its own decision.
However, the AMD driver decides that the textures should be sampled as cube maps, ignoring what the texture view determined just before.</p>
<p>While this should not be a problem on its own, as coordinates can still be pulled out from the wrong texture type, the driver can end up reading the wrong texel.
This can result in happy rainbow ground in <code>The Legend of Zelda: Breath of the Wild</code>, or as dark and evil terrain in <code>Hyrule Warriors: Age of Calamity</code>.</p>
<p><a href="https://github.com/yuzu-emu/yuzu/pull/7076">By disabling Cube Compatibility on GCN4 and older devices running the official AMD proprietary drivers,</a> epicboy returned proper
sense to the devastated land of Hyrule.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./botwbug.png" title=" I prefer no RGB, thanks (The Legend of Zelda: Breath of the Wild)">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/botwbug_huf13585f4071f04c8891a3ac1ce6ee677_4878469_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" I prefer no RGB, thanks (The Legend of Zelda: Breath of the Wild)"></a>
<p class="has-text-centered is-italic has-text-grey-light"> I prefer no RGB, thanks (The Legend of Zelda: Breath of the Wild)</p>
</div>
</div>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./botwfix.png" title=" But not THAT dark! (Hyrule Warriors: Age of Calamity)">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/botwfix_huc0e07545264cae07449539ef5239ff9a_4521895_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" But not THAT dark! (Hyrule Warriors: Age of Calamity)"></a>
<p class="has-text-centered is-italic has-text-grey-light"> But not THAT dark! (Hyrule Warriors: Age of Calamity)</p>
</div>
</div>
<p>Speaking of RGB, <a href="https://yuzu-mirror.github.io/entry/yuzu-progress-report-feb-2021/#paint-me-like-one-of-your-french-bits">as discussed back in February</a>, yuzu has to use compute
shaders to convert most BGR texture formats in OpenGL to avoid mismatched colours.
While this can work fine on most current GPUs, theres a performance cost that can affect older and slower products.</p>
<p>Users of Kepler series Nvidia GPUs (usually GTX 600/700 series, with several renamed 800 and 900 series too) could experience those performance penalties while also producing
rendering corruptions.
Instead of using compute shaders to swizzle textures, epicboy figured we could just use <code>Pixel Buffer Objects</code>
<a href="https://www.khronos.org/opengl/wiki/Pixel_Buffer_Object">(or PBO for short)</a> for <a href="https://github.com/yuzu-emu/yuzu/pull/7036">all affected texture formats instead.</a>
This has many benefits: it solves Kepler BGR issues, improves performance on weak devices from any GPU vendor, and is also a required change for <code>A.R.T.</code> (the resolution
scaler in development).</p>
<div class="columns is-img-preview is-bottom-marginless">
<div class="column is-bottom-paddingless">
<a href="./keplerbug.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/keplerbug_hu0c8365c67d108db9df353d5144d10d8a_1321068_800x0_resize_q90_bgffffff_box_3.jpg" alt="A Hat in Time"></a>
</div>
<div class="column is-bottom-paddingless">
<a href="./keplerfix.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/keplerfix_hub87386c446c22fb30cf3bec7f22278e8_783110_800x0_resize_q90_bgffffff_box_3.jpg" alt="A Hat in Time"></a>
</div>
</div>
<p class="has-text-centered is-italic has-text-grey-light">A Hat in Time</p>
<p>On the subject of changes needed for the resolution scaler, Blinkhawk implemented <a href="https://github.com/yuzu-emu/yuzu/pull/7077">fixes to queries and indexed samplers.</a>
The result is fewer crashes while playing <code>Luigis Mansion 3</code> on Intel and AMD GPUs, be it on Windows or Linux.
This PR helps improve stability for <code>A.R.T.</code> as well.</p>
<p>Another issue affecting <code>Luigis Mansion 3</code> is related to its use of <a href="https://en.wikipedia.org/wiki/Tessellation_(computer_graphics)">Tessellation Shaders</a> on Vulkan.
The Vulkan specification requires the input-assembler topology to be <code>PATCH_LIST</code> in the tessellation stages. Not all games follow this, so
<a href="https://github.com/yuzu-emu/yuzu/pull/7101">manually forcing it</a> solves crashes experienced in some drivers, more specifically, as you may have guessed it, AMDs proprietary
ones. All thanks to our fishy epicboy.</p>
<p>epicboy has also <a href="https://github.com/yuzu-emu/yuzu/pull/7001">fixed some minor bugs with the <code>StencilOp</code></a>, a type of data buffer intended to help limit the size of the
rendering area.
Thanks to this, <code>WarioWare: Get It Together!</code> properly renders its models.</p>
<div class="columns is-img-preview is-bottom-marginless">
<div class="column is-bottom-paddingless">
<a href="./waabug.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/waabug_hua1ed077d95b345f6cbb6fdbe12e39cf4_571875_800x0_resize_q90_bgffffff_box_3.jpg" alt="Waa! (WarioWare: Get It Together!)"></a>
</div>
<div class="column is-bottom-paddingless">
<a href="./waafix.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/waafix_hu08765337d064faa05cba533ba112b1bc_584924_800x0_resize_q90_bgffffff_box_3.jpg" alt="Waa! (WarioWare: Get It Together!)"></a>
</div>
</div>
<p class="has-text-centered is-italic has-text-grey-light">Waa! (WarioWare: Get It Together!)</p>
<p><a href="https://github.com/vonchenplus">vonchenplus</a> added support for the legacy GLSL <code>gl_Color</code> and <code>gl_TexCoord</code> attributes into our Vulkan backend, so that any game that uses
them can render properly when using this API.</p>
<p>Both these attributes are part of a set of attributes with specific definitions and uses.
But they were deprecated in newer versions of OpenGL in favour of &ldquo;generic&rdquo; attributes that the programmer can freely define as they want, based on their needs.</p>
<p>While OpenGL is still able to run shaders that use this legacy feature for the sake of backwards compatibility, they were already considered obsolete by the time Vulkan was
created, which means that this API lacks a fallback.</p>
<p>What vonchenplus did is use generic attributes in Vulkan to emulate these features, so that they behave exactly as the legacy GLSL attributes.</p>
<p>After that, vonchenplus corrected the definition of <a href="https://github.com/yuzu-emu/yuzu/pull/6980">the values in an enum</a> used for blending textures.</p>
<p>Both these changes affect <code>DRAGON QUEST III: The Seeds of Salvation</code>, fixing the graphical bugs present in this game.</p>
<div class="columns is-img-preview is-bottom-marginless">
<div class="column is-bottom-paddingless">
<a href="./dqbug.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/dqbug_hu3c34e31a1e3dedcba56977db14e1d472_1080021_800x0_resize_q90_bgffffff_box_3.jpg" alt="DRAGON QUEST III: The Seeds of Salvation"></a>
</div>
<div class="column is-bottom-paddingless">
<a href="./dqfix.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/dqfix_hu7a76ba4e3f0a987c7e0f578a6b6249d0_991289_800x0_resize_q90_bgffffff_box_3.jpg" alt="DRAGON QUEST III: The Seeds of Salvation"></a>
</div>
</div>
<p class="has-text-centered is-italic has-text-grey-light">DRAGON QUEST III: The Seeds of Salvation</p>
<h2 id="tool-assisted-speedrun">Tool-assisted speedrun</h2>
<p><a href="https://github.com/MonsterDruide1">MonsterDruide1</a> has added <a href="https://github.com/yuzu-emu/yuzu/pull/6485">TAS support</a> to yuzu!
This means precise input commands can be recorded and replayed in-game.
The format used to store them is the one <a href="https://github.com/hamhub7/TAS-nx/tree/master/scripts">TAS-nx</a> implemented, and we have a guide on
<a href="https://yuzu-mirror.github.io/help/feature/tas/">how to enable and use this feature here.</a></p>
<p>You can access TAS configuration by going to <code>Tools &gt; Configure TAS…</code></p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./tas.png" title=" TAS Configuration window">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/tas_hu1290e8e13f946ea1cbbbbb244570b5cc_15125_414x0_resize_q90_bgffffff_box_3.jpg" alt=" TAS Configuration window"></a>
<p class="has-text-centered is-italic has-text-grey-light"> TAS Configuration window</p>
</div>
</div>
<h2 id="other-input-changes">Other input changes</h2>
<p>Lets start with a nice addition by <a href="https://github.com/german77">german77</a> that will make <code>Super Smash Bros. Ultimate</code> players happy, and Parsec users especially so.
Theres now an option to enable <a href="https://github.com/yuzu-emu/yuzu/pull/6950">8 player support</a> for XInput devices, at the cost of disabling the Web Applet. A small price to pay
for epic fights with your friends.</p>
<p>You can find the option in <code>Emulation &gt; Configure… &gt; Controls &gt; Advanced &gt; Enable XInput 8 player support (disables web applet)</code>.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./8.png" title=" yuzu Controls configuration window">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/8_huf54355b8df7c4df96bf002e7e00d5046_30961_1019x0_resize_q90_bgffffff_box_3.jpg" alt=" yuzu Controls configuration window"></a>
<p class="has-text-centered is-italic has-text-grey-light"> yuzu Controls configuration window</p>
</div>
</div>
<p><a href="https://github.com/v1993">v1993</a> later <a href="https://github.com/yuzu-emu/yuzu/pull/7042">hid the option for non-Windows OSes</a>, as this limitation doesnt apply outside the Windows
SDL builds.</p>
<p>Linux kernel drivers for Joy-Cons use a different naming convention than the ones we use on Windows.
<a href="https://github.com/yuzu-emu/yuzu/pull/6979">Properly following this convention makes the Dual Joy-Con input show up in the device list.</a> german77 thinks of the penguins.</p>
<h2 id="ui-changes">UI changes</h2>
<p>With the release of <a href="https://yuzu-mirror.github.io/entry/yuzu-hades/">Project Hades</a>, yuzu started using a full <code>Pipeline cache</code> instead of single stages of the graphics pipeline, both
in Vulkan and OpenGL.
This means parts of our UI were outdated, so <a href="https://github.com/goldenx86">your degenerate writer</a> decided to simply
<a href="https://github.com/yuzu-emu/yuzu/pull/6976">update the context menu entries</a> from Shader cache to Pipeline cache.</p>
<p>Following suit, <a href="https://github.com/Moonlacer">Moonlacer</a> helped <a href="https://github.com/yuzu-emu/yuzu/pull/6977">replace <code>Use disk shader cache</code> with <code>Use disk pipeline cache</code></a>.
¡Gracias!</p>
<p>Later on, Moonlacer <a href="https://github.com/yuzu-emu/yuzu/pull/7020">removed the toggle</a> for <code>Enable audio stretching</code> from the audio settings, as it no longer had any purpose.
As a general rule, the fewer options available, the better.</p>
<p>Morph decided to <a href="https://github.com/yuzu-emu/yuzu/pull/7102">eliminate a 2 year old feature,</a> <a href="https://yuzu-mirror.github.io/entry/yuzu-boxcat/">boxcat</a>.</p>
<p>BCAT is a network service used by the Nintendo Switch to add content to its games without needing constant updates.
Our old BCAT implementation only added some “gifts” our developers placed into games that were playable at the time. It was unable to support real use cases, like the game
updates <code>Animal Crossing: New Horizons</code> regularly pushes.</p>
<p>While the plan is to add support for this in the future, major changes to the file system emulation need to come first.</p>
<p><a href="https://github.com/behunin">behunin</a> implemented much needed <a href="https://github.com/yuzu-emu/yuzu/pull/7068">clean ups to our debug configuration window.</a>
View the results below:</p>
<div class="columns is-img-preview is-bottom-marginless">
<div class="column is-bottom-paddingless">
<a href="./debugbug.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/debugbug_hu54e4e3ca60dab6c5cd8cf31499506332_107568_800x0_resize_q90_bgffffff_box_3.jpg" alt="Before and After, Debug configuration settings"></a>
</div>
<div class="column is-bottom-paddingless">
<a href="./debugfix.png" title="">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/debugfix_hu2f474a9ac5c964b236cc5f9d62943584_99196_800x0_resize_q90_bgffffff_box_3.jpg" alt="Before and After, Debug configuration settings"></a>
</div>
</div>
<p class="has-text-centered is-italic has-text-grey-light">Before and After, Debug configuration settings</p>
<h2 id="general-bugfixes">General bugfixes</h2>
<p>epicboy noticed a memory leak that would grow progressively after stopping and restarting the emulation, which was caused by yuzus <code>main_process</code> not being cleaned up.
<a href="https://github.com/yuzu-emu/yuzu/pull/7009">By destroying this process when stopping emulation</a>, the resources are properly freed now, fixing the leak.</p>
<p>Additionally, epicboy also mitigated the crashes that happened when emulation was stopped by
<a href="https://github.com/yuzu-emu/yuzu/pull/7019">using std::jthread for worker threads</a>.</p>
<p><code>std::jthread</code> is a <a href="https://en.cppreference.com/w/cpp/thread/jthread">new implementation of the thread class that was recently introduced in C++20</a>, which alleviates their
management and usage, since they simplify some of the synchronization challenges inherent to multithreading.</p>
<p>With this change, the number of crashes caused by race conditions between working threads upon shutdown was supposed to decrease, but it also introduced a new bug that would
cause yuzu to hang when the emulation was stopped.</p>
<p>This problem was caused by the order in which objects were being destroyed, which epicboy
<a href="https://github.com/yuzu-emu/yuzu/pull/7078">fixed in a follow-up PR</a>.</p>
<p><a href="https://github.com/bunnei">bunnei</a> also <a href="https://github.com/yuzu-emu/yuzu/pull/6965">introduced std::jthreads into the cpu_manager</a>, in favour of using this more efficient
implementation of the class for yuzu&rsquo;s host threads.</p>
<p>He also made changes so that the KEvents used in the nvflinger <a href="https://github.com/yuzu-emu/yuzu/pull/6968">service</a> and <a href="https://github.com/yuzu-emu/yuzu/pull/6971">queue</a>
are owned by these services, instead of being owned by the process for the emulated game, which makes the implementation more accurate.</p>
<p>Weve been trying to focus on improving our homebrew support, as this isnt just a powerful tool that only developers use. For example, modders have very powerful homebrew apps
that the Switch community enjoys.
One important example is <a href="https://github.com/ultimate-research/UltimateModManager">UltimateModManager</a>, or UMM for short, which refuses to work on yuzu for now.</p>
<p>To counter this, <a href="https://github.com/ogniK5377">ogniK</a> allowed homebrew running in yuzu to <a href="https://github.com/yuzu-emu/yuzu/pull/6974">also create subdirectories instead of just the parent directory</a>,
resulting in UMM managing to at least start.
This is a temporary solution until our much needed filesystem rewrite is finished.
Additionally, <a href="https://github.com/Morph1984">Morph</a> pushed a <a href="https://github.com/yuzu-emu/yuzu/pull/7010">partial implementation of the <code>GetFileTimeStampRaw</code> function,</a> removing
several warnings.</p>
<p>This isnt enough to allow full UMM compatibility, but were getting there.</p>
<p>Moving on to a quality-of-life change, some games pop-up a confirmation window when trying to stop emulation.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./exit.png" title=" Like this, End emulation confirmation window">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/exit_hudbd14da1147c6ed437dd1c24692a8c7e_7560_415x0_resize_q90_bgffffff_box_3.jpg" alt=" Like this, End emulation confirmation window"></a>
<p class="has-text-centered is-italic has-text-grey-light"> Like this, End emulation confirmation window</p>
</div>
</div>
<p>This kind of redundant question is generated by the game itself and while we always had a toggle to skip it, it wasnt working properly. epicboy comes to the rescue,
<a href="https://github.com/yuzu-emu/yuzu/pull/6997">fixing the toggle</a> for good and saving us precious seconds in quitting our games.</p>
<p>If you wish to change this behaviour, the option is in <code>Emulation &gt; Configure… &gt; General &gt; Confirm exit while emulation is running</code>.</p>
<p>v1993 <a href="https://github.com/yuzu-emu/yuzu/pull/7075">moved all QtWebEngine data to a more organized centralized folder,</a> improving consistency and reducing clutter from the
users storage.
Instead of a separate folder in <code>%localappdata%</code>, information is now saved in yuzus directory, <code>%appdata%\yuzu\qtwebengine</code> by default.</p>
<p><a href="https://github.com/lat9nq">toastUnlimited</a>
<a href="https://github.com/yuzu-emu/yuzu/pull/7018">performed his first stubbing surgery with the audio input services <code>Start</code>, <code>RegisterBufferEvent</code>, and <code>AppendAudioInBufferAuto</code></a>.
This way, <code>Splatoon 2</code> can now be played via <a href="https://yuzu-mirror.github.io/entry/yuzu-progress-report-aug-2021/#lan-party-time">LAN</a> without requiring the use of auto-stub. Happy
splatting!</p>
<p>german77 <a href="https://github.com/yuzu-emu/yuzu/pull/6992">stubbed <code>SetTouchScreenConfiguration</code> and implemented <code>GetNotificationStorageChannelEvent</code></a> to make <code>Dr Kawashima's Brain Training for Nintendo Switch</code> playable.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./brain.png" title=" Dr Kawashima&#39;s Brain Training for Nintendo Switch">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/brain_hu5f76972ce26d6461518f81c37dfb0841_1193144_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" Dr Kawashima&#39;s Brain Training for Nintendo Switch"></a>
<p class="has-text-centered is-italic has-text-grey-light"> Dr Kawashima&#39;s Brain Training for Nintendo Switch</p>
</div>
</div>
<p>He has also <a href="https://github.com/yuzu-emu/yuzu/pull/7015">stubbed <code>Match</code></a> to make <code>Cruis'n Blast</code> playable.
This game experiences some crashes, so theres more work to do.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./blast.png" title=" Cruis&#39;n Blast">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/blast_hu4d70e92df426d5a49ec273cc89aeb49a_2961115_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" Cruis&#39;n Blast"></a>
<p class="has-text-centered is-italic has-text-grey-light"> Cruis&#39;n Blast</p>
</div>
</div>
<p>ogniK <a href="https://github.com/yuzu-emu/yuzu/pull/6975">implemented the <code>EnsureTokenIdCacheAsync</code> function,</a> making <code>Death Coming</code> go in-game, albeit with some graphical bugs that
we have to sort out in the future.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./death.png" title=" Death Coming">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/death_hu120ee96626b8ff607add2cc8748dafd1_2816897_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" Death Coming"></a>
<p class="has-text-centered is-italic has-text-grey-light"> Death Coming</p>
</div>
</div>
<p>Morph has been working on implementing what is needed to get <code>Diablo II: Resurrected</code> working.
Initially, the <a href="https://github.com/yuzu-emu/yuzu/pull/7082"><code>Read</code> socket service was implemented</a>, but this mandates also implementing more complex services like <code>Select</code> and
<code>EventFD</code>.
<code>EventFD</code> is particularly tricky as there is no native support for it on Windows, so a considerable amount of work is needed to properly emulate it in the most popular OS.</p>
<p>As a temporary alternative, <a href="https://github.com/yuzu-emu/yuzu/pull/7085">Read was just stubbed</a>, allowing the game to boot.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./diablo.png" title=" Diablo II: Resurrected">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/diablo_huaea0704d7ed08fc84eec4c59d7c4a88d_2166201_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" Diablo II: Resurrected"></a>
<p class="has-text-centered is-italic has-text-grey-light"> Diablo II: Resurrected</p>
</div>
</div>
<h2 id="future-projects">Future projects</h2>
<p>For anyone wondering about <code>Project A.R.T.</code>, the following image speaks for itself.</p>
<div class="columns is-img-preview">
<div class="column has-text-centered">
<a href="./art.png" title=" Xenoblade Chronicles Definitive Edition">
<img src="https://yuzu-mirror.github.io/entry/yuzu-progress-report-sep-2021/art_huca2967bee837b21824c48b3c2699c593_16950267_1024x0_resize_q90_bgffffff_box_3.jpg" alt=" Xenoblade Chronicles Definitive Edition"></a>
<p class="has-text-centered is-italic has-text-grey-light"> Xenoblade Chronicles Definitive Edition</p>
</div>
</div>
<p>Regarding works in progress, there are more rendering fixes underway, and were already starting plans on what to focus on after <code>A.R.T.</code> is finished.</p>
<p>Thats all folks! Thank you for your attention and see you next month!</p>
<p> 
<h4 style="text-align:center;">
<b>Please consider supporting us on <a href="https://www.patreon.com/yuzuteam">Patreon</a>!<br>
If you would like to contribute to this project, check out our <a href="https://github.com/yuzu-emu/yuzu">GitHub</a>!</b>
</h4>
</p>
</section>
<div class="has-text-centered">
<a class="pagination-next" href="https://community.citra-emu.org/t/472953">Continue the discussion on our forums.</a>
</div>
</div>
<div class="column">
<div class="px-md">
<ins class="adsbygoogle"
style="display:block; margin-left:25px;"
data-ad-client="ca-pub-4126545610079023"
data-ad-slot="6276099127"
data-ad-format="auto"></ins>
<br>
<p class="is-size-6 has-text-centered">Advertisement</p>
</div>
</div>
</div>
<div class="column">
<div class="px-md has-text-centered">
<p class="is-size-6 has-text-centered">Advertisement</p>
<br>
<ins class="adsbygoogle" style="display:inline-block;width:728px;height:100px" data-ad-client="ca-pub-4126545610079023" data-ad-slot="1038554045"></ins>
</div>
</div>
</div>
<div class="container">
<footer class="footer">
<div class="content has-text-centered">
copyright &copy; 2025 yuzu emulator team
</div>
</footer>
</div>
<script src="https://yuzu-mirror.github.io/js/script.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/baguettebox.js/1.11.1/baguetteBox.min.js" type="text/javascript"></script>
<script type="text/javascript">
window.addEventListener("DOMContentLoaded", function() {
baguetteBox.run('.is-img-preview');
});
</script>
<script type="text/javascript">
for (var i = 0; i < document.getElementsByClassName('adsbygoogle').length; i++) {
(adsbygoogle = window.adsbygoogle || []).push({});
}
</script>
</body>
</html>