mirror of
https://github.com/yuzu-mirror/yuzu-mirror.github.io.git
synced 2025-12-06 07:12:21 +01:00
881 lines
42 KiB
HTML
881 lines
42 KiB
HTML
<!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 · 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’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 (Intel’s 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 AMD’s 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 wouldn’t 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 Int8Float16’s 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 yuzu’s 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 game’s 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, there’s 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>Luigi’s 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>Luigi’s 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, AMD’s 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 “generic” 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 > 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>Let’s 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.
|
||
There’s 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 > Configure… > Controls > Advanced > 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 doesn’t 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 yuzu’s <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’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>We’ve been trying to focus on improving our homebrew support, as this isn’t 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 isn’t enough to allow full UMM compatibility, but we’re 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 wasn’t 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 > Configure… > General > 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
|
||
user’s storage.
|
||
Instead of a separate folder in <code>%localappdata%</code>, information is now saved in yuzu’s 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'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's Brain Training for Nintendo Switch"></a>
|
||
|
||
|
||
<p class="has-text-centered is-italic has-text-grey-light"> Dr Kawashima'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 there’s more work to do.</p>
|
||
|
||
<div class="columns is-img-preview">
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="column has-text-centered">
|
||
|
||
<a href="./blast.png" title=" Cruis'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'n Blast"></a>
|
||
|
||
|
||
<p class="has-text-centered is-italic has-text-grey-light"> Cruis'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 we’re already starting plans on what to focus on after <code>A.R.T.</code> is finished.</p>
|
||
<p>That’s 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 © 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>
|