Simply go into `View → Fullscreen`, or just strike the Alt + Return keycombo, and
enjoy Citra to its fullest on your largest monitor.
## Rewrite AM Service and Add CIA Installation ([Here](https://github.com/citra-emu/citra/pull/2993), [here](https://github.com/citra-emu/citra/pull/3048), [here](https://github.com/citra-emu/citra/pull/2975), [there](https://github.com/citra-emu/citra/pull/3029), [this](https://github.com/citra-emu/citra/pull/3113), and [that](https://github.com/citra-emu/citra/pull/3144)) by [shinyquagsire23](https://github.com/shinyquagsire23) and [BreadFish64](https://github.com/BreadFish64)
The `am` service on a Nintendo 3DS handles the installation, tracking, and removal
of applications and games installed on the console and SD card(s) via a centralized
database in the NAND, with some parts of the database for SD card-installed titles
on the SD card itself. It has a handful of nice features such as installing packages
as they're streamed in, along with DLC support being cleanly implemented as a
side-effect of the CIA format's design. CIAs themselves are also designed to be
streamed in, which is used extensively across 3DS apps, such as the eShop streaming
downloads directly into `am` so that it installs at the same time, or `dlp` using
it to stream Download Play CIAs from one 3DS to another directly.
The CIA format starts off with a header that describes where each component of
itself starts within the stream and a bitfield. This is then followed by a
certificate signed by Nintendo, the CIA's ticket, and the title metadata (or TMD
for short). The TMD then contains a list of every CXI file the CIA could possibly
title="A tiny portion of the Home Menu Themes CIA" >}}
For the `am` side of streaming installations, the way it handles a request to
install an application is by creating and then giving the requester a handle to
a virtual file. This leaves most of the busy work to `am`, while the app only needs
to worry about writing the CIA file into that handle.
[shinyquagsire23](https://github.com/shinyquagsire23) reimplemented the entirety
of how Citra handles NCCH files, which quickly paved the way to implementing `am`
in Citra. This allowed users to use FBI to install applications from its virtual
SD card. He and [BreadFish64](https://github.com/BreadFish64) also went a step
further and added support for installing CIAs via the SDL and Qt frontends
directly, removing the need to use FBI. Do note that you cannot yet run installed
applications and games directly, but CXI executables can access the virtual SD
card for DLC, updates, etc.
## [Qtifw build installer](https://github.com/citra-emu/citra/pull/2966) by [j-selby](https://github.com/j-selby)
Citra now has a fancy new installer and updater, thanks to [j-selby](https://github.com/j-selby)
and [jroweboy](https://github.com/jroweboy)'s efforts! If you haven't already, we
strongly recommend you download and install Citra through it, since it will make
updating as easy as re-running the installer. You can check it out over [here](/download/),
## [macOS: Build x86_64h slice](https://github.com/citra-emu/citra/pull/2982) by [MerryMage](https://github.com/MerryMage)
A little known feature in macOS is fat binaries, the ability to have the same executable
contain binaries for multiple architectures. This was used extensively around 2007
to support Mac OS X's transition from PowerPC to x86_64, allowing developers to
have one binary work on all Macs effortlessly.
After poking around Apple's LLVM fork, [MerryMage](https://github.com/MerryMage)
found that they had a specific flag to build binaries for Intel Haswell and later.
Enabling it made a fat binary that contained both pre-Haswell and post-Haswell code,
allowing Citra to take advantage of the newer CPU's instructions, without dropping
support for older ones.
## [Kernel/IPC: Add a small delay after each SyncRequest to prevent thread starvation.](https://github.com/citra-emu/citra/pull/3091) by [Subv](https://github.com/Subv)
When communicating with services, titles on a real Nintendo 3DS expect to wait some
amount of time before the service replies or responds. Until now, Citra didn't implement
this, it responded without incrementing the virtual clock. From the emulated system's
title="Animal Crossing: New Leaf, among other games, are now working perfectly with this change!" >}}
As Citra's responses are instantaneous from the point-of-view of the game,
the secondary thread doesn't have nearly enough time to finish its job. And, the
first thread's priority comes back up above the secondary's once it wakes up,
this leads to the first thread waiting on the secondary thread to finish, but it
never gets a chance to, due to its now much lower priority. Essentially, the
first thread waits on the secondary forever, because the secondary never gets a
chance to actually finish what it was doing.
[ds84182](https://github.com/ds84182) and [Subv](https://github.com/Subv) each
wrote homebrew software which found and measured the issue, respectively, which
[B3n30](https://github.com/B3n30) ran on a real Nintendo 3DS. With which, an
average delay for every type of service reply was found. Then, [Subv](https://github.com/Subv)
made Citra's virtual clock increment by this amount before fulfilling any service
request, solving many of the issues this brought.
## [core/arm: Improve timing accuracy before service calls in JIT](https://github.com/citra-emu/citra/pull/3184) by [MerryMage](https://github.com/MerryMage)
As our previous section demonstrates, Citra's virtual clock should be
incremented before any time code that was supposed to be on a real
Nintendo 3DS runs within Citra, including services. This change by [MerryMage](https://github.com/MerryMage)
makes services increment the clock *before* they are called, instead of after.
<!-- NOTE: Possibly hard to understand/too verbose? Reword if so. -->
One of the reasons this is important is that services can schedule calls to
other services to run in the future. If the current time in the virtual clock is
incorrect when the service schedule an event, it would run too early since
the time for the scheduled event would effectively be shifted back by the virtual
time it takes for the service that scheduled it would run.
Although this doesn't fix any reported bugs, it does make the timing emulation
of Citra much more accurate.
## [citra-qt : Fix a bug in our fullscreen implementation](https://github.com/citra-emu/citra/pull/3159) by [FearlessTobi](https://github.com/FearlessTobi)
In Citra's GUI, a strange bug exists, where if you have fullscreen enabled, and
you start a game while the window is maximized, the window instead unmaximizes
before starting the game. This was due to Citra not keeping track of the window's
state (be it normal, maximized, minimized, or fullscreen), and instead simply
defaulting to normal. [FearlessTobi](https://github.com/FearlessTobi) found,
## [shader_jit_x64_compiler: Remove ABI overhead of LG2 and EX2](https://github.com/citra-emu/citra/pull/3145) by [MerryMage](https://github.com/MerryMage)
The shader JIT in Citra is a component of the video core responsible for
recompiling GPU shaders for the 3DS to x86 code, so that they can be run on the