citra-emu
/
citra-web
Archived
1
0
Fork 0

Merge pull request #50 from j-selby/fix-stuff

Blog post + home page changes
This commit is contained in:
Flame Sage 2017-09-12 13:03:21 +00:00 committed by GitHub
commit fc83484d77
28 changed files with 702 additions and 258 deletions

View File

@ -150,6 +150,7 @@ gulp.task('final:serve', function() {
gulp.watch('src/js/**/*', ['assets:js']); gulp.watch('src/js/**/*', ['assets:js']);
gulp.watch('src/scss/**/*', ['assets:scss']); gulp.watch('src/scss/**/*', ['assets:scss']);
gulp.watch('site/**/*.html', ['hugo']); gulp.watch('site/**/*.html', ['hugo']);
gulp.watch('site/**/*.md', ['hugo']);
gulp.watch('build/**/*').on('change', fileChange); gulp.watch('build/**/*').on('change', fileChange);
}); });

View File

@ -7,17 +7,23 @@ coauthor = "jroweboy"
forum = 42 forum = 42
+++ +++
Sometimes it's hard to wait. We've noticed that users are very excited about the future of Citra, which means wanting to try all of the changes all of the time. Sometimes it's hard to wait. We've noticed that users are very excited about the future of Citra, which means wanting
But, emulator development can be a slow, arduous process as new changes can bring big regressions and problems with the much wanted new features. to try all of the changes all of the time.
But, emulator development can be a slow, arduous process as new changes can bring big regressions and problems with
the much wanted new features.
In order to satiate the needs of our users, we'll be adding new builds for download: bleeding edge builds! In order to satiate the needs of our users, we'll be adding new builds for download: bleeding edge builds!
These builds will contain experimental features and changes designed to give the absolute fastest builds with the most features combined into one download! These builds will contain experimental features and changes designed to give the absolute fastest builds with the most
Since these releases are official, unlike other random builds you might find on the internet, there is no chance that they will contain a virus, or anything else that can potentially be harmful. features combined into one download!
Since these releases are official, unlike other random builds you might find on the internet, there is no chance that
they will contain a virus, or anything else that can potentially be harmful.
Because updates will come at a rapid pace and there is a chance of these changes adversely affecting emulation, the builds will let you know when a newer version is available and **auto-update** if you allow it. Because updates will come at a rapid pace and there is a chance of these changes adversely affecting emulation, the
builds will let you know when a newer version is available and **auto-update** if you allow it.
You can download the bleeding edge development builds at our <a href="https://citra-emu.org/download/">downloads page</a> right now! You can download the bleeding edge development builds at our [downloads page](https://citra-emu.org/download/) right now!
While Windows is the only operating system targeted at this time, the other operating systems will follow shortly. While Windows is the only operating system targeted at this time, the other operating systems will follow shortly.
While these builds aren't technically supported, they can be extremely useful for catching regressions and other issues from the various experimental features rolled into them. While these builds aren't technically supported, they can be extremely useful for catching regressions and other issues
from the various experimental features rolled into them.
If you experience a bug, please make sure that the latest nightly builds do not have the issue before reporting it. If you experience a bug, please make sure that the latest nightly builds do not have the issue before reporting it.

View File

@ -6,15 +6,38 @@ author = "bunnei"
forum = 33 forum = 33
+++ +++
While Citra was first founded in April of 2014, visible progress for the emulator didn't really happen until the turn of the year. After a long struggle to get anything to boot, 2015 saw Citra evolve from an experimental emulator that couldn't run games into an experimental emulator that can run games. And while it may not seem like Citra is that far along, it is truly amazing how much things have progressed in just a year since the first commercial title booted. While Citra was first founded in April of 2014, visible progress for the emulator didn't really happen until the turn
of the year. After a long struggle to get anything to boot, 2015 saw Citra evolve from an experimental emulator that
couldn't run games into an experimental emulator that can run games. And while it may not seem like Citra is that far
along, it is truly amazing how much things have progressed in just a year since the first commercial title booted.
However, with Citra's success and high visibility within the emulation community, it may be easy to think that we've gotten this far on our own, but that would be quite misguided. Citra would not exist without the work that others have done before and alongside it: Particularly the folks behind [3dmoo](https://github.com/plutooo/3dmoo/) ([Normmatt](http://github.com/normmatt), [ichfly](http://github.com/ichfly), and [plutoo](https://github.com/plutooo)), who did a lot of the early reverse-engineering to boot commercial games; as well as those who have worked tirelessly to break open the 3DS and [share their work](https://www.3dbrew.org/wiki/Main_Page) publically ([yellows8](https://github.com/yellows8), [Bond697](https://github.com/bond697), [fincs](https://github.com/fincs), among many others), and [smea](https://github.com/smealum) for providing a public [way to run](http://smealum.net/ninjhax/) (and a [library](https://github.com/smealum/ctrulib) to create) homebrew. We've been lucky to be part of a much larger community of hackers, developers and researchers that have always been willing to lend a hand in some way, which is something that many other emulator teams are not quite as fortunate to have! However, with Citra's success and high visibility within the emulation community, it may be easy to think that we've
gotten this far on our own, but that would be quite misguided. Citra would not exist without the work that others
have done before and alongside it: Particularly the folks behind [3dmoo](https://github.com/plutooo/3dmoo/)
([Normmatt](http://github.com/normmatt), [ichfly](http://github.com/ichfly), and [plutoo](https://github.com/plutooo)),
who did a lot of the early reverse-engineering to boot commercial games; as well as those who have worked tirelessly
to break open the 3DS and [share their work](https://www.3dbrew.org/wiki/Main_Page) publically
([yellows8](https://github.com/yellows8), [Bond697](https://github.com/bond697),
[fincs](https://github.com/fincs), among many others), and [smea](https://github.com/smealum) for providing a public
[way to run](http://smealum.net/ninjhax/) (and a [library](https://github.com/smealum/ctrulib) to create) homebrew.
We've been lucky to be part of a much larger community of hackers, developers and researchers that have always been
willing to lend a hand in some way, which is something that many other emulator teams are not quite as fortunate
to have!
Like most young projects, Citra didn't have a great website infrastructure featuring a blog last year; there was no need to as it didn't boot games or have a big fanbase interested in its development. It was just one of several emulators that had promise. With that promise starting to be fulfilled and a shiny new blog ready and waiting, let us look back at the year that Citra rose above the rest and became **THE** 3DS emulator. Like most young projects, Citra didn't have a great website infrastructure featuring a blog last year; there was no
need to as it didn't boot games or have a big fanbase interested in its development. It was just one of several
emulators that had promise. With that promise starting to be fulfilled and a shiny new blog ready and waiting, let us
look back at the year that Citra rose above the rest and became **THE** 3DS emulator.
## Winter: The First Retail Games ## Winter: The First Retail Games
In late 2014, Citra was a very small project developed primarily by [bunnei](https://github.com/bunnei) and [neobrain](http://github.com/neobrain). The heart and soul behind the effort to get a game rendering was their reverse-engineering skills put into figuring out how the 3DS GPU worked and accurately represented it in an accuracy focused software renderer. Meanwhile, [bunnei](https://github.com/bunnei) assisted with that while figuring out how to recreate the environment that the 3DS games run in, with a particular focus on emulating the 3DS' operating system. Because they focused on accurate emulation, parts of the emulator were fairly advanced despite no commercial games booting. In late 2014, Citra was a very small project developed primarily by [bunnei](https://github.com/bunnei) and
[neobrain](http://github.com/neobrain). The heart and soul behind the effort to get a game rendering was their
reverse-engineering skills put into figuring out how the 3DS GPU worked and accurately represented it in an accuracy
focused software renderer. Meanwhile, [bunnei](https://github.com/bunnei) assisted with that while figuring out how
to recreate the environment that the 3DS games run in, with a particular focus on emulating the 3DS' operating system.
Because they focused on accurate emulation, parts of the emulator were fairly advanced despite no commercial games
booting.
Until one day... Until one day...
<br></br> <br></br>
@ -22,18 +45,45 @@ Until one day...
{{< img src="entry/citra-progress-report-2015-p1/image01.png" center="true" >}} {{< img src="entry/citra-progress-report-2015-p1/image01.png" center="true" >}}
<br></br> <br></br>
Recognize the game? That's The Legend of Zelda: Ocarina of Time 3D rendering on Citra on [December 13, 2014](https://twitter.com/fail_cluez/status/543796766270046210). This distorted upside-down Triforce loading icon was the first rendering of a commercial title in Citra. After that, Ocarina of Time 3D would promptly hang, but even this little blip caused excitement from the developers. To get a retail game to show any graphics at all be it a simple icon or a complex 3D scene requires that a virtual environment be created that is sufficiently complete such that from the perspective of a game, it is running on an actual Nintendo 3DS. This isnt just a matter of being able to execute the games native machine code, but also provide it with enough of the essential features it expects when running on a real 3DS. For example, 3DS games run within a full operating system (much like your PC or smart phone), that of which Citra needed to duplicate. Recognize the game? That's The Legend of Zelda: Ocarina of Time 3D rendering on Citra on
[December 13, 2014](https://twitter.com/fail_cluez/status/543796766270046210). This distorted upside-down Triforce
loading icon was the first rendering of a commercial title in Citra. After that, Ocarina of Time 3D would promptly
hang, but even this little blip caused excitement from the developers. To get a retail game to show any graphics at
all be it a simple icon or a complex 3D scene requires that a virtual environment be created that is sufficiently
complete such that from the perspective of a game, it is running on an actual Nintendo 3DS. This isnt just a matter
of being able to execute the games native machine code, but also provide it with enough of the essential features it
expects when running on a real 3DS. For example, 3DS games run within a full operating system (much like your PC or
smart phone), that of which Citra needed to duplicate.
Propelled by this breakthrough, [neobrain](http://github.com/neobrain) and [bunnei](https://github.com/bunnei) worked tirelessly day and night to push Ocarina of Time just a little bit further. With [bunnei](https://github.com/bunnei) focused on fixing core emulation bugs and implementing necessary OS features, [neobrain](http://github.com/neobrain) continued with GPU reverse-engineering based on the features that Ocarina of Time was lacking within the software renderer. While it took months to get the game booting, getting it to the title screen only took a few more days. The result of this hard work may look like nothing but a screenshot from a glitchy emulator, but when it happened it was a huge cause for celebration: Citra's first fully 3D-rendered scene. <br></br> Propelled by this breakthrough, [neobrain](http://github.com/neobrain) and [bunnei](https://github.com/bunnei) worked
tirelessly day and night to push Ocarina of Time just a little bit further. With [bunnei](https://github.com/bunnei)
focused on fixing core emulation bugs and implementing necessary OS features, [neobrain](http://github.com/neobrain)
continued with GPU reverse-engineering based on the features that Ocarina of Time was lacking within the software
renderer. While it took months to get the game booting, getting it to the title screen only took a few more days. The
result of this hard work may look like nothing but a screenshot from a glitchy emulator, but when it happened it was a
huge cause for celebration: Citra's first fully 3D-rendered scene.
<br></br>
{{< img src="entry/citra-progress-report-2015-p1/image03.png" center="true" >}} {{< img src="entry/citra-progress-report-2015-p1/image03.png" center="true" >}}
<br></br> <br></br>
This breakthrough only motivated developers further. With a 3D rendered scene under its belt, users had taken notice and news of Citra had spread. This fervor was met with more than just hype, but also results. It was only a matter of weeks before several more retail games were booting in Citra, some of which were able to be played in-game. It became a sort of friendly competition among the developers to see who could be the first to get a new game booting it. Among the next few games to fall were Cave Story and Cave Story 3D, VVVVVV, Ikachan, Gunman Clive, Super Little Acorns, and Retro City Rampage. <br></br> This breakthrough only motivated developers further. With a 3D rendered scene under its belt, users had taken notice
and news of Citra had spread. This fervor was met with more than just hype, but also results. It was only a matter of
weeks before several more retail games were booting in Citra, some of which were able to be played in-game. It became
a sort of friendly competition among the developers to see who could be the first to get a new game booting it. Among
the next few games to fall were Cave Story and Cave Story 3D, VVVVVV, Ikachan, Gunman Clive, Super Little Acorns, and
Retro City Rampage.
<br></br>
{{< youtube ZGQWVMCdfK0 >}} {{< youtube ZGQWVMCdfK0 >}}
<br></br> <br></br>
While this was cause for excitement, there is a pattern to be noticed in the games that booted. Most of the titles were either simple 2D games, or ports from other systems. This actually has some meaning: ports and simple games are less likely to use new features of a system than say a blockbuster title from Nintendo designed for the system to show off what it can really do. While this was cause for excitement, there is a pattern to be noticed in the games that booted. Most of the titles were
either simple 2D games, or ports from other systems. This actually has some meaning: ports and simple games are less
likely to use new features of a system than say a blockbuster title from Nintendo designed for the system to show off
what it can really do.
In the [next part](https://citra-emu.org/entry/citra-progress-report-2015-p2), we'll continue our 2015 retrospective with Spring. By then, Citra fever was in full effect, with new devs and old faces showing up to throw their hat in the ring and see who could make the next big breakthrough. No one was ready for how much could change in just three more months. In the [next part](https://citra-emu.org/entry/citra-progress-report-2015-p2), we'll continue our 2015 retrospective
with Spring. By then, Citra fever was in full effect, with new devs and old faces showing up to throw their hat in the
ring and see who could make the next big breakthrough. No one was ready for how much could change in just three more
months.

View File

@ -6,26 +6,49 @@ author = "bunnei"
forum = 36 forum = 36
+++ +++
This month we bring you the second installment of our two-part progress report on Citra in 2015! With this part, we discuss the evolution from Citra being able to barely run a few commercial games at a few frames-per-second, to where it is in 2016: Running many retail games at reasonable speeds, some of which are fully playable with near flawless graphics! We discuss Citra's new "dyncom" CPU core, the OpenGL renderer, per-pixel lighting, and various bug fixes. Lastly, we wrap up with an outlook for 2016, and a special thanks to everyone who has helped make Citra what it is today! This month we bring you the second installment of our two-part progress report on Citra in 2015! With this part, we
discuss the evolution from Citra being able to barely run a few commercial games at a few frames-per-second, to where
it is in 2016: Running many retail games at reasonable speeds, some of which are fully playable with near flawless
graphics! We discuss Citra's new "dyncom" CPU core, the OpenGL renderer, per-pixel lighting, and various bug fixes.
Lastly, we wrap up with an outlook for 2016, and a special thanks to everyone who has helped make Citra what it is
today!
## Spring 2015: A New CPU, Renderer and More ## Spring 2015: A New CPU, Renderer and More
The arms race to get games booting ran into a wall. Often, testing games and getting to crash points would be incredibly painful because of how slow the emulator ran. Instead of measuring frames-per-second, testers often referred to seconds-per-frame. Donkey Kong Country Returns 3D would sometimes require three realtime seconds to render a single in-game frame in the software renderer! It took over 90 minutes to capture all of the footage for a three minute video of Super Monkey Ball 3D! <br></br> The arms race to get games booting ran into a wall. Often, testing games and getting to crash points would be incredibly
painful because of how slow the emulator ran. Instead of measuring frames-per-second, testers often referred to
seconds-per-frame. Donkey Kong Country Returns 3D would sometimes require three realtime seconds to render a single
in-game frame in the software renderer! It took over 90 minutes to capture all of the footage for a three minute video
of Super Monkey Ball 3D!
{{< youtube t0TGSeQe1wE >}} {{< youtube t0TGSeQe1wE >}}
<br></br> Within the next few months, [bunnei](https://github.com/bunnei) and [Lioncash](https://github.com/lioncash) replaced
Within the next few months, [bunnei](https://github.com/bunnei) and [Lioncash](https://github.com/lioncash) replaced the old "ARMULATOR" CPU core in Citra with a better implementation that was both several times faster and much more accurate. Despite the fact that it was still an interpreter, this new core was still efficient enough that the performance implications were huge. With this new core, games that were light on graphics could reach above half-speed on very strong processors. the old "ARMULATOR" CPU core in Citra with a better implementation that was both several times faster and much more
accurate. Despite the fact that it was still an interpreter, this new core was still efficient enough that the
performance implications were huge. With this new core, games that were light on graphics could reach above half-speed
on very strong processors.
Shortly thereafter, a new developer joined the Citra team [tfarley](https://github.com/tfarley) with the ambitious goal of implementing a hardware renderer using OpenGL. Up until this point, Citra had used a software renderer primarily developed by [neobrain](http://github.com/neobrain) to render graphics. While a software renderer is great for development and achieving pixel-perfect accuracy, Citras GPU emulation had become the major performance bottleneck. Even with infinitely fast CPU emulation, the software renderer was so slow that no games would run full speed despite this. Shortly thereafter, a new developer joined the Citra team [tfarley](https://github.com/tfarley) with the ambitious
goal of implementing a hardware renderer using OpenGL. Up until this point, Citra had used a software renderer
primarily developed by [neobrain](http://github.com/neobrain) to render graphics. While a software renderer is great
for development and achieving pixel-perfect accuracy, Citras GPU emulation had become the major performance
bottleneck. Even with infinitely fast CPU emulation, the software renderer was so slow that no games would run full
speed despite this.
While the rest of the team continued with other development efforts, [tfarley](https://github.com/tfarley) went on a month-long battle developing this new OpenGL renderer. All of this resulted in Ocarina of Time 3D running nearly perfect in Citra using OpenGL while running at a fairly decent speed! Below is a very early video of Ocarina of Time, before the renderer was completed and merged into CItra's mainline repository. <br></br> While the rest of the team continued with other development efforts, [tfarley](https://github.com/tfarley) went on a
month-long battle developing this new OpenGL renderer. All of this resulted in Ocarina of Time 3D running nearly
perfect in Citra using OpenGL while running at a fairly decent speed! Below is a very early video of Ocarina of Time,
before the renderer was completed and merged into CItra's mainline repository.
{{< youtube Hj8sPsB5qXQ >}} {{< youtube Hj8sPsB5qXQ >}}
## Summer: More Accuracy, More Performance ## Summer: More Accuracy, More Performance
With the summer, development slowed down a bit but several additional improvements were made. By this point, the team had already made lots of incremental advances in 3DS emulation, resulting in a significant number of retail games booting, such as Super Mario 3D Land, Fire Emblem: Awakening, The Legend of Zelda: A Link Between Worlds, Mario Kart 7, and many more. <br></br> With the summer, development slowed down a bit but several additional improvements were made. By this point, the
team had already made lots of incremental advances in 3DS emulation, resulting in a significant number of retail games
booting, such as Super Mario 3D Land, Fire Emblem: Awakening, The Legend of Zelda: A Link Between Worlds, Mario Kart 7,
and many more.
{{< img src="entry/citra-progress-report-2015-p2/earlyunknown1.png" center="true" >}} {{< img src="entry/citra-progress-report-2015-p2/earlyunknown1.png" center="true" >}}
@ -48,57 +71,112 @@ forum = 36
{{< img src="entry/citra-progress-report-2015-p2/earlyfireemblem.png" center="true" >}} {{< img src="entry/citra-progress-report-2015-p2/earlyfireemblem.png" center="true" >}}
<br></br> <br></br>
But there was still one major issue that was blocking many games: video playback. 3DS games use a proprietary format known as “MOFLEX” to play video clips, which are commonly used for intro logos, cut scenes, and more. Not only was the video format unknown, but any time a MOFLEX video was used, Citra would hang in an infinite loop for unknown reasons. However, this issue proved to be no match for our team within a matter of weeks, Citra developers [yuriks](https://github.com/yuriks) and [Subv](https://github.com/Subv) reverse-engineered and implemented all of the mechanisms necessary to prevent hanging and play MOFLEX videos!<br></br> But there was still one major issue that was blocking many games: video playback. 3DS games use a proprietary format
known as “MOFLEX” to play video clips, which are commonly used for intro logos, cut scenes, and more. Not only was the
video format unknown, but any time a MOFLEX video was used, Citra would hang in an infinite loop for unknown reasons.
However, this issue proved to be no match for our team within a matter of weeks, Citra developers
[yuriks](https://github.com/yuriks) and [Subv](https://github.com/Subv) reverse-engineered and implemented all of the
mechanisms necessary to prevent hanging and play MOFLEX videos!<br></br>
{{< img src="entry/citra-progress-report-2015-p2/3.png" center="true" >}} {{< figure src="/images/entry/citra-progress-report-2015-p2/3.png"
<p style="text-align: center;">Bravely Default's intro sequence relies on MOFLEX video support <br></br> alt="Bravely Default"
title="Bravely Default's intro sequence relies on MOFLEX video support" >}}
With many games now running stable with fairly accurate rendering, it became evident that with a bit more speed some titles would not only be playable in Citra, but enjoyable to play. On top of this, more speed would make testing even easier, so with a huge library of games now working, the task again came to making things faster. With many games now running stable with fairly accurate rendering, it became evident that with a bit more speed some
titles would not only be playable in Citra, but enjoyable to play. On top of this, more speed would make testing even
easier, so with a huge library of games now working, the task again came to making things faster.
The cause of the slowdown was very obvious: Citras emulation of 3DS vertex shaders. With emulators like Dolphin and PPSSPP, your GPU uses shaders to emulate the target systems GPU, which does not actually use any shaders of its own. The 3DS, on the other hand, has a more modern GPU that natively supports its own shaders which are not as trivial to emulate in the same manner. The approach that we took was similar to CPU emulation and we were using a pure interpreter for the job. As such, the solution was pretty obvious; Even a naively implemented Just-In-Time (JIT) compiler would make our shader emulation scream. With that in mind, [bunnei](https://github.com/bunnei) set out to implement a vertex shader JIT. The cause of the slowdown was very obvious: Citras emulation of 3DS vertex shaders. With emulators like Dolphin and
PPSSPP, your GPU uses shaders to emulate the target systems GPU, which does not actually use any shaders of its own.
The 3DS, on the other hand, has a more modern GPU that natively supports its own shaders which are not as trivial to
emulate in the same manner. The approach that we took was similar to CPU emulation and we were using a pure
interpreter for the job. As such, the solution was pretty obvious; Even a naively implemented Just-In-Time (JIT)
compiler would make our shader emulation scream. With that in mind, [bunnei](https://github.com/bunnei) set out to
implement a vertex shader JIT.
While it took several weeks to develop, the difference in speed was very obvious. Vertex heavy games were sometimes two or three times as fast, allowing some games like Ocarina of Time 3D to near full speed in many areas! <br></br> While it took several weeks to develop, the difference in speed was very obvious. Vertex heavy games were sometimes two
or three times as fast, allowing some games like Ocarina of Time 3D to near full speed in many areas!
{{< youtube yhLEs4yEmlU >}} {{< youtube yhLEs4yEmlU >}}
## Autumn: Closing out the Year with a Bang! ## Autumn: Closing out the Year with a Bang!
After a brief summer hiatus, development on Citra began to pick up again with autumn 2015. While Citra now had a library of games running without severe problems, many still relied on more advanced graphics features that had yet to be reverse-engineered. One of these more widely used features is fragment lighting a feature that enables complex lighting calculations to be performed on a per-pixel basis. A major breakthrough was made when hacker and homebrew developer fincs made major strides in figuring out the 3DS fragment lighting implementation. Immediately, [bunnei](https://github.com/bunnei) began embodying this work into Citra. <br></br> After a brief summer hiatus, development on Citra began to pick up again with autumn 2015. While Citra now had a
library of games running without severe problems, many still relied on more advanced graphics features that had yet
to be reverse-engineered. One of these more widely used features is fragment lighting a feature that enables complex
lighting calculations to be performed on a per-pixel basis. A major breakthrough was made when hacker and homebrew
developer fincs made major strides in figuring out the 3DS fragment lighting implementation. Immediately,
[bunnei](https://github.com/bunnei) began embodying this work into Citra.
{{< img src="entry/citra-progress-report-2015-p2/rotatecube.gif" center="true" >}} {{< figure src="/images/entry/citra-progress-report-2015-p2/rotatecube.gif"
<p style="text-align: center;"> An early fragment lighting demo running in Citra <br></br> alt="Fragment shader test"
title="An early fragment lighting demo running in Citra" >}}
Despite that its not a fully complete implementation of fragment lighting, the results have significantly improved Citras visuals! Despite that its not a fully complete implementation of fragment lighting, the results have significantly improved
Citras visuals!
<div class="row" style="margin-top:3em; margin-bottom:1em;"> {{< figure src="/images/entry/citra-progress-report-2015-p2/moonbefore.png"
<div class="col-xs-12 col-sm-6" style="text-align:center; margin-bottom: 1em;"><img alt="" src="/images/entry/citra-progress-report-2015-p2/moonbefore.png" style="max-width: 100%; border-style: none; margin-bottom: 1em;" /> title="It's a super moon!" >}}
It's a super moon!
</div>
<div class="col-xs-12 col-sm-6" style="text-align:center; margin-bottom: 1em;"><img alt="" src="/images/entry/citra-progress-report-2015-p2/moonafter.png" style="max-width: 100%; border-style: none; margin-bottom: 1em;" /> {{< figure src="/images/entry/citra-progress-report-2015-p2/moonafter.png"
With fragment lighting implemented, the moon became even scarier! H-hurray? title="With fragment lighting implemented, the moon became even scarier! H-hurray?" >}}
</div>
</div>
While no more major features were merged into Citra by the turn of the year, [Subv](https://github.com/Subv) came up with one final teaser of things to come before letting 2015 come to a close. CROs, the dynamically linked libraries of the 3DS (similiar to DLLs on Windows), blocked several very popular 3DS games from booting in Citra, such as Pokemon X, Y, Omega Ruby, Alpha Sapphire and Super Smash Bros. for 3DS. While the implementation was far from done, it still was able to boot up some of the games that relied heavily on this feature. While no more major features were merged into Citra by the turn of the year, [Subv](https://github.com/Subv) came up
<br></br> with one final teaser of things to come before letting 2015 come to a close. CROs, the dynamically linked libraries of
the 3DS (similiar to DLLs on Windows), blocked several very popular 3DS games from booting in Citra, such as Pokemon
X, Y, Omega Ruby, Alpha Sapphire and Super Smash Bros. for 3DS. While the implementation was far from done, it still
was able to boot up some of the games that relied heavily on this feature.
{{< youtube 30NwGUYmIpU >}} {{< youtube 30NwGUYmIpU >}}
## Citra in 2016 ## Citra in 2016
With 2016 already upon us, it's shaping up to be a pretty exciting year for Citra! In addition to the many tasks discussed in the 2015 progress reports that are still ongoing, we've got several exciting new features to look forward to: With 2016 already upon us, it's shaping up to be a pretty exciting year for Citra! In addition to the many tasks
discussed in the 2015 progress reports that are still ongoing, we've got several exciting new features to look forward
to:
* [MerryMage](https://github.com/merrymage) has been making some exciting progress on an HLE implementation of the DSP, meaning audio support may come sooner than expected! * [MerryMage](https://github.com/merrymage) has been making some exciting progress on an HLE implementation of the DSP,
* [tfarley](https://github.com/tfarley) has been working on a HW renderer optimization - "texture forwarding" - that minimizes copies of textures/framebuffers to/from emulated RAM. The result of this effort will be both a performance improvement as well as support for upscaled rendering! meaning audio support may come sooner than expected!
* [yuriks](https://github.com/yuriks) has plans to rewrite the vertex shader JIT to fix several inherent flaws, which will improve accuracy and address the crashing issues, as well as improved memory and IPC emulation in the kernel HLE * [tfarley](https://github.com/tfarley) has been working on a HW renderer optimization - "texture forwarding" - that
* [Subv](https://github.com/Subv) is still looking into CRO support, as well as mipmapping and scissor testing minimizes copies of textures/framebuffers to/from emulated RAM. The result of this effort will be both a performance
* [ds84182](http://github.com/ds84182) is currently working on an implementation of Pica's geometry shaders improvement as well as support for upscaled rendering!
* [bunnei](https://github.com/bunnei) has plans to work on Circle Pad Pro (required for getting Majora's Mask in game), CROs, and a JIT compiler for faster CPU emulation * [yuriks](https://github.com/yuriks) has plans to rewrite the vertex shader JIT to fix several inherent flaws, which
* [Lioncash](https://github.com/lioncash) has plans to continue working on ARM11 CPU emulation, improving both accuracy and performance will improve accuracy and address the crashing issues, as well as improved memory and IPC emulation in the kernel
HLE.
* [Subv](https://github.com/Subv) is still looking into CRO support, as well as mipmapping and scissor testing.
* [ds84182](http://github.com/ds84182) is currently working on an implementation of Pica's geometry shaders.
* [bunnei](https://github.com/bunnei) has plans to work on Circle Pad Pro (required for getting Majora's Mask in game),
CROs, and a JIT compiler for faster CPU emulation.
* [Lioncash](https://github.com/lioncash) has plans to continue working on ARM11 CPU emulation, improving both accuracy
and performance.
With all of these exciting new features upcoming, it's quite possible that 2016 might be the year that Citra becomes official with a v1.0 release! With all of these exciting new features upcoming, it's quite possible that 2016 might be the year that Citra becomes
official with a v1.0 release!
## Special Thanks from Bunnei ## Special Thanks from Bunnei
While working on this article, I found that it was easy to find major changes to write about, but that these really only captured a fraction of the progress made in 2015 as there was work done literally every single day to make Citra what it is now. While I wish I could draw attention to every contribution made, thats just not reasonable to do in one article so instead Id like to personally thank each person that impacted Citra in the past year: [Lioncash](https://github.com/lioncash), [yuriks](https://github.com/yuriks), [neobrain](http://github.com/neobrain), [Subv](https://github.com/Subv), [archshift](http://github.com/archshift), [linkmauve](http://github.com/linkmauve), [tfarley](https://github.com/tfarley), [purpasmart96](http://github.com/purpasmart96),[aroulin](http://github.com/aroulin), [chinhodado](https://github.com/chinhodado), [polaris-](https://github.com/polaris-), [zawata](http://github.com/zawata), [kevinhartman](http://github.com/kevinhartman), [Cruel](http://github.com/cruel), [Lectem](http://github.com/lectem), [jroweboy](http://github.com/jroweboy), [LittleWhite-tb](http://github.com/littlewhite-tb), [Normmatt](http://github.com/normmatt), [kemenaran](http://github.com/kemenaran), [rohit-n](http://github.com/rohit-n), [Yllodra](http://github.com/yllodra), [xsacha](http://github.com/xsacha), [darkf](http://github.com/darkf), [filfat](http://github.com/filfat), [SeannyM](http://github.com/seannym), [uppfinnarn](http://github.com/uppfinnarn), [Kingcom](http://github.com/kingcom), [Zaneo](http://github.com/zaneo), [wwylele](http://github.com/wwylele), [Zangetsu38](http://github.com/zangetsu38), [Apology11](http://github.com/apology11), [Kloen](http://github.com/kloen), [MoochMcGee](http://github.com/moochmcgee), [gwicks](http://github.com/gwicks), [vaguilar](http://github.com/vaguilar), [chrisvj](http://github.com/chrisvj), [Sethpaien](http://github.com/sethpaien), [Gareth422](http://github.com/gareth422), [JSFernandes](http://github.com/jsfernandes), [esoteric-programmer](http://github.com/esoteric-programmer), [martinlindhe](http://github.com/martinlindhe), [clienthax](http://github.com/clienthax), [ILOVEPIE](http://github.com/ILOVEPIE), [zhuowei](http://github.com/zhuowei), [Bentley](http://github.com/bentley), [mailwl](http://github.com/mailwl), [Disruption](http://github.com/disruption), [LFsWang](http://github.com/lfswang), [Antidote](http://github.com/antidote), [ichfly](http://github.com/ichfly). I cant wait to see what you guys bring for 2016! While working on this article, I found that it was easy to find major changes to write about, but that these really only
captured a fraction of the progress made in 2015 as there was work done literally every single day to make Citra what
it is now. While I wish I could draw attention to every contribution made, thats just not reasonable to do in one
article so instead Id like to personally thank each person that impacted Citra in the past year:
[Lioncash](https://github.com/lioncash), [yuriks](https://github.com/yuriks), [neobrain](http://github.com/neobrain),
[Subv](https://github.com/Subv), [archshift](http://github.com/archshift), [linkmauve](http://github.com/linkmauve),
[tfarley](https://github.com/tfarley), [purpasmart96](http://github.com/purpasmart96),
[aroulin](http://github.com/aroulin), [chinhodado](https://github.com/chinhodado),
[polaris-](https://github.com/polaris-), [zawata](http://github.com/zawata),
[kevinhartman](http://github.com/kevinhartman), [Cruel](http://github.com/cruel), [Lectem](http://github.com/lectem),
[jroweboy](http://github.com/jroweboy), [LittleWhite-tb](http://github.com/littlewhite-tb),
[Normmatt](http://github.com/normmatt), [kemenaran](http://github.com/kemenaran), [rohit-n](http://github.com/rohit-n),
[Yllodra](http://github.com/yllodra), [xsacha](http://github.com/xsacha), [darkf](http://github.com/darkf),
[filfat](http://github.com/filfat), [SeannyM](http://github.com/seannym), [uppfinnarn](http://github.com/uppfinnarn),
[Kingcom](http://github.com/kingcom), [Zaneo](http://github.com/zaneo), [wwylele](http://github.com/wwylele),
[Zangetsu38](http://github.com/zangetsu38), [Apology11](http://github.com/apology11), [Kloen](http://github.com/kloen),
[MoochMcGee](http://github.com/moochmcgee), [gwicks](http://github.com/gwicks), [vaguilar](http://github.com/vaguilar),
[chrisvj](http://github.com/chrisvj), [Sethpaien](http://github.com/sethpaien),
[Gareth422](http://github.com/gareth422), [JSFernandes](http://github.com/jsfernandes),
[esoteric-programmer](http://github.com/esoteric-programmer), [martinlindhe](http://github.com/martinlindhe),
[clienthax](http://github.com/clienthax), [ILOVEPIE](http://github.com/ILOVEPIE), [zhuowei](http://github.com/zhuowei),
[Bentley](http://github.com/bentley), [mailwl](http://github.com/mailwl), [Disruption](http://github.com/disruption),
[LFsWang](http://github.com/lfswang), [Antidote](http://github.com/antidote), [ichfly](http://github.com/ichfly).
I cant wait to see what you guys bring for 2016!

View File

@ -6,98 +6,162 @@ author = "jmc47"
forum = 37 forum = 37
+++ +++
Welcome to the first Citra Progress Report of 2016! While 2015 will be considered the year that Citra first played games, 2016 is quickly shaping up as a year filled with higher compatibility, greater stability and much more as Citra matures. The avalanche of new features from tons of contributors has made it hard to keep up with everything even for developers! Welcome to the first Citra Progress Report of 2016! While 2015 will be considered the year that Citra first played
games, 2016 is quickly shaping up as a year filled with higher compatibility, greater stability and much more as Citra
Because there have been so many changes and there are so many different games, it can be very hard to keep up with what is working and what is not. To try and make things a little easier, we've compiled some of the biggest changes of the new year together to show you just how far Citra has come already! matures. The avalanche of new features from tons of contributors has made it hard to keep up with everything even for
developers!
Because there have been so many changes and there are so many different games, it can be very hard to keep up with what
is working and what is not. To try and make things a little easier, we've compiled some of the biggest changes of the
new year together to show you just how far Citra has come already!
## [Immediate Mode Vertex Submission Part 1](https://github.com/citra-emu/citra/pull/1394) and [Part 2](https://github.com/citra-emu/citra/pull/1461) by [ds84182](https://github.com/ds84182) & [yuriks](https://github.com/yuriks) ## [Immediate Mode Vertex Submission Part 1](https://github.com/citra-emu/citra/pull/1394) and [Part 2](https://github.com/citra-emu/citra/pull/1461) by [ds84182](https://github.com/ds84182) & [yuriks](https://github.com/yuriks)
Immediate Mode Vertex Submission is a second way for the PICA200 (aka the 3DS GPU) to draw vertices. Unlike the normal method, Immediate Mode trades off some efficiency when drawing complex models for less overhead on each object. This makes it a suitable option for things such as UI elements. Despite all of that, it's capable of being used for just about anything, and some games use it for drawing all of their graphics. Immediate Mode Vertex Submission is a second way for the PICA200 (aka the 3DS GPU) to draw vertices. Unlike the normal
method, Immediate Mode trades off some efficiency when drawing complex models for less overhead on each object. This
makes it a suitable option for things such as UI elements. Despite all of that, it's capable of being used for just
about anything, and some games use it for drawing all of their graphics.
[ds84182](https://github.com/ds84182) first implemented the feature and showed just how many games it could fix. After it was merged, some issues were found and [yuriks](https://github.com/yuriks) fixed some edge cases and added support for *vertex restart*. Vertex Restart is a feature necessary when drawing using triangle strips, in order to break apart consecutive strips. [ds84182](https://github.com/ds84182) first implemented the feature and showed just how many games it could fix. After
it was merged, some issues were found and [yuriks](https://github.com/yuriks) fixed some edge cases and added support
<p style="text-align: center;"> <img alt="" src="/images/entry/citra-progress-report-2016-p1/etrianodysseytop.png" style="width: 400px; height: 240px;" /><img alt="" src="/images/entry/citra-progress-report-2016-p1/etrianodysseybottom.png" style="width: 320px; height: 240px;" /> for *vertex restart*. Vertex Restart is a feature necessary when drawing using triangle strips, in order to break apart
consecutive strips.
<p style="text-align: center;">Etrian Odyssey IV running in Citra with Immediate Mode Vertex Submission
With this, along with previous fixes of [#1462](https://github.com/citra-emu/citra/pull/1462) and [#1624](https://github.com/citra-emu/citra/pull/1624) for correct depth writing behaviors, Etrian Odyssey IV and other games appear to be playable in Citra.
{{< figure src="/images/entry/citra-progress-report-2016-p1/etrianodysseytop.png"
alt="Etrian Odyssey IV"
title="Etrian Odyssey IV running in Citra with Immediate Mode Vertex Submission" >}}
With this, along with previous fixes of [#1462](https://github.com/citra-emu/citra/pull/1462) and
[#1624](https://github.com/citra-emu/citra/pull/1624) for correct depth writing behaviors, Etrian Odyssey IV and other
games appear to be playable in Citra.
## [Unicode Support on Windows](https://github.com/citra-emu/citra/pull/1541) by [LFsWang](https://github.com/LFsWang) ## [Unicode Support on Windows](https://github.com/citra-emu/citra/pull/1541) by [LFsWang](https://github.com/LFsWang)
Due to the different way Windows reports filenames to programs compared to Linux or OS X, Citra was previously unable to load any files with a path containing non-English characters. That is, if your file was named using accented letters, Chinese, Japanese characters, emoji, or in general any characters not present in the [ASCII](https://en.wikipedia.org/wiki/ASCII) character set, Citra would be unable to find the file! Considering Citra is developed and used by people around the world, this was a very important issue. We did not want people to need to rename files or directories to be able to open them with Citra. Due to the different way Windows reports filenames to programs compared to Linux or OS X, Citra was previously unable
to load any files with a path containing non-English characters. That is, if your file was named using accented
[LFsWang](https://github.com/LFsWang) took the time to fix the frontend code so that Citra was able to correctly load these files. [More recently](https://github.com/citra-emu/citra/pull/1620) further improvements were made so that this works correctly even if you're loading files with characters from a language different than the one running on your operating system. letters, Chinese, Japanese characters, emoji, or in general any characters not present in the
[ASCII](https://en.wikipedia.org/wiki/ASCII) character set, Citra would be unable to find the file! Considering Citra
is developed and used by people around the world, this was a very important issue. We did not want people to need to
rename files or directories to be able to open them with Citra.
[LFsWang](https://github.com/LFsWang) took the time to fix the frontend code so that Citra was able to correctly load
these files. [More recently](https://github.com/citra-emu/citra/pull/1620) further improvements were made so that this
works correctly even if you're loading files with characters from a language different than the one running on your
operating system.
## [Fix MAD/MADI Shader Instruction Encoding](https://github.com/citra-emu/citra/pull/1479) by [JayFoxRox](https://github.com/JayFoxRox) ## [Fix MAD/MADI Shader Instruction Encoding](https://github.com/citra-emu/citra/pull/1479) by [JayFoxRox](https://github.com/JayFoxRox)
MAD and MADI (Multiply-Add and Multiply-Add Inverted, respectively.) are shader instructions in the PICA200 GPU, handled by Citra's shader JIT and interpreter. These instructions execute a multiplication followed by an addition (*d* = *a* × *b* + *c*) in the same instruction. They're unique in that they're the only instructions that works with 3 source operands, and thus have a special way of being encoded into the program. Citra interpreted this format incorrectly, causing it to sometimes operate on the wrong values! MAD and MADI (Multiply-Add and Multiply-Add Inverted, respectively.) are shader instructions in the PICA200 GPU, handled
by Citra's shader JIT and interpreter. These instructions execute a multiplication followed by an addition
(*d* = *a* × *b* + *c*) in the same instruction. They're unique in that they're the only instructions that works with
3 source operands, and thus have a special way of being encoded into the program. Citra interpreted this format
incorrectly, causing it to sometimes operate on the wrong values!
Handling these instructions correctly, much like a CPU emulator, is paramount for accurate emulation. In this case, it happened that these instructions were commonly used in font rendering shaders, and this bug often manifested as gibberish textures and incorrect positioning, as can be seen in this The Legend of Zelda: A Link Between Worlds screenshot: Handling these instructions correctly, much like a CPU emulator, is paramount for accurate emulation. In this case, it
happened that these instructions were commonly used in font rendering shaders, and this bug often manifested as
gibberish textures and incorrect positioning, as can be seen in this The Legend of Zelda: A Link Between Worlds
screenshot:
<p style="text-align: center;"><img alt="" src="/images/entry/citra-progress-report-2016-p1/albwbefore.png" style="width: 400px; height: 480px;" /><img alt="" src="/images/entry/citra-progress-report-2016-p1/albwafter.jpg" style="width: 400px; height: 480px;" /> {{< figure src="/images/entry/citra-progress-report-2016-p1/albwbefore.png" >}}
<p style="text-align: center;">The Hylian language just seems to get harder and harder to read every game! Oh... wait.
Considering that emulators over a decade older than Citra are still finding problems with how CPU instructions are handled, it's no surprise that our shaders aren't bullet-proof yet either. There should be many, many games affected by the encoding fixes, so if you've been seeing gibberish text or other problems, there's a fair chance that this change could have fixed the bug.
{{< figure src="/images/entry/citra-progress-report-2016-p1/albwafter.jpg"
title="The Hylian language just seems to get harder and harder to read every game! Oh... wait." >}}
Considering that emulators over a decade older than Citra are still finding problems with how CPU instructions are
handled, it's no surprise that our shaders aren't bullet-proof yet either. There should be many, many games affected
by the encoding fixes, so if you've been seeing gibberish text or other problems, there's a fair chance that this
change could have fixed the bug.
## [Align Attribute Components](https://github.com/citra-emu/citra/pull/1496) by [JayFoxRox](https://github.com/JayFoxRox) ## [Align Attribute Components](https://github.com/citra-emu/citra/pull/1496) by [JayFoxRox](https://github.com/JayFoxRox)
Vertex Attributes are an integral step in rendering. They can tell the GPU the bone weight, color, position, etc. So when [JayFoxRox](http://github.com/JayFoxRox) discovered that the Vertex Attributes were misaligned and pulling the incorrect values, he knew he stumbled upon a major problem. One game in particular affected by this was Super Smash Bros. 4, which since the MAD/MADI fixes had been displaying some graphics, although things looked pretty messed up. Vertex Attributes are an integral step in rendering. They can tell the GPU the bone weight, color, position, etc. So
when [JayFoxRox](http://github.com/JayFoxRox) discovered that the Vertex Attributes were misaligned and pulling the
incorrect values, he knew he stumbled upon a major problem. One game in particular affected by this was Super Smash
Bros. 4, which since the MAD/MADI fixes had been displaying some graphics, although things looked pretty messed up.
<p style="text-align: center;"><img alt="Pikachu has seen better days." src="/images/entry/citra-progress-report-2016-p1/smashbrosbefore.jpg" style="width: 400px; height: 240px;" /><img alt="While lighting is a bit off, the game looks fairly playable!" src="/images/entry/citra-progress-report-2016-p1/smashbrosafter.png" style="width: 400px; height: 240px;" /> {{< figure src="/images/entry/citra-progress-report-2016-p1/smashbrosbefore.jpg"
title="Pikachu has seen better days." >}}
<p style="text-align: center;">With this fix, the Super Smash Bros. 4 actually looks fairly playable!
The align attributes fixes should also fix other games where the graphics tend to explode like Super Smash Bros. 4.
{{< figure src="/images/entry/citra-progress-report-2016-p1/smashbrosafter.png"
title="While lighting is a bit off, the game looks fairly playable!" >}}
With this fix, the Super Smash Bros. 4 actually looks fairly playable! The align attributes fixes should also fix other
games where the graphics tend to explode like Super Smash Bros. 4.
## [Save Fixes](https://github.com/citra-emu/citra/pull/1302) by [Subv](https://github.com/Subv) ## [Save Fixes](https://github.com/citra-emu/citra/pull/1302) by [Subv](https://github.com/Subv)
One of the more notable problems that Citra has currently is that many games require a savefile extracted from the 3DS in order to get in game. This is due to many reasons, including partial or incorrect file system and OS emulation. Because getting saves from newer games can be problematic due to encryption (and it's generally a pain anyway), getting Citra to create and load savegames properly is a very important task that will continue to be a priority for the forseeable future. One of the more notable problems that Citra has currently is that many games require a savefile extracted from the 3DS
in order to get in game. This is due to many reasons, including partial or incorrect file system and OS emulation.
Because getting saves from newer games can be problematic due to encryption (and it's generally a pain anyway), getting
Citra to create and load savegames properly is a very important task that will continue to be a priority for the
forseeable future.
The save fixes recently merged mostly have to do with formatting the cartridge saves correctly. 3DS titles are very picky about how their saves are formatted and will often fail if all of the files aren't handled *exactly* like they want. This was the reason why Mario Kart 7 would hang in Citra! And once you're in game, it is quite the visual treat for a 3DS title! The save fixes recently merged mostly have to do with formatting the cartridge saves correctly. 3DS titles are very
picky about how their saves are formatted and will often fail if all of the files aren't handled *exactly* like they
want. This was the reason why Mario Kart 7 would hang in Citra! And once you're in game, it is quite the visual treat
for a 3DS title!
<p style="text-align: center;"><img alt="" src="/images/entry/citra-progress-report-2016-p1/mk7.jpg" style="width: 800px; height: 441px;" /> {{< figure src="/images/entry/citra-progress-report-2016-p1/mk7.jpg"
title="Mario Kart 7 is now fully playable in Citra and looking better than ever!" >}}
<p style="text-align: center;">Mario Kart 7 is now fully playable in Citra and looking better than ever! The above change fixes Mario Kart 7, Final Fantasy Explorers, Lego Batman 3: Beyond Gotham, The Amazing Spiderman, and
likely many others games that previously hung while creating or deleting savefiles.
The above change fixes Mario Kart 7, Final Fantasy Explorers, Lego Batman 3: Beyond Gotham, The Amazing Spiderman, and likely many others games that previously hung while creating or deleting savefiles.
## [Clear Shader JIT Cache](https://github.com/citra-emu/citra/pull/1503) by [bunnei](https://github.com/bunnei) ## [Clear Shader JIT Cache](https://github.com/citra-emu/citra/pull/1503) by [bunnei](https://github.com/bunnei)
Citra's GPU shader JIT had a bit of a flaw: It would keep previously compiled shaders in memory forever. Furthermore, it only allocated a fixed amount of space for all compiled shader code. When testing the early games that booted on Citra, none of this seemed to matter and things continued fine. But, as Citra has been running more complex games and was being used by more users for longer periods of time, it became apparent that this simply wasn't good enough. Games were managing to fill up the fixed amount of space that Citra had allocated for the Shader JIT Cache and crashing the emulator! Citra's GPU shader JIT had a bit of a flaw: It would keep previously compiled shaders in memory forever. Furthermore,
it only allocated a fixed amount of space for all compiled shader code. When testing the early games that booted on
Citra, none of this seemed to matter and things continued fine. But, as Citra has been running more complex games and
was being used by more users for longer periods of time, it became apparent that this simply wasn't good enough. Games
were managing to fill up the fixed amount of space that Citra had allocated for the Shader JIT Cache and crashing the
emulator!
[bunnei](https://github.com/bunnei) added a simple fix to the memory management which allows Citra to drop old, unused shaders in order to free up space for new ones being requested by the game, fixing these crashes and allowing for longer game sessions. For example, Kirby: Triple Deluxe is now stable in Citra, even when using the Shader JIT: [bunnei](https://github.com/bunnei) added a simple fix to the memory management which allows Citra to drop old, unused
shaders in order to free up space for new ones being requested by the game, fixing these crashes and allowing for
longer game sessions. For example, Kirby: Triple Deluxe is now stable in Citra, even when using the Shader JIT:
<p style="text-align: center;"><img alt="" src="/images/entry/citra-progress-report-2016-p1/b.png" style="width: 400px; height: 240px;" /><img alt="" src="/images/entry/citra-progress-report-2016-p1/c.png" style="width: 400px; height: 240px;" /> {{< figure src="/images/entry/citra-progress-report-2016-p1/b.png" >}}
<p style="text-align: center;">Kirby: Triple Deluxe used to crash almost immediately while in game {{< figure src="/images/entry/citra-progress-report-2016-p1/c.png"
title="Kirby: Triple Deluxe used to crash almost immediately while in game" >}}
## [Shader JIT Refactor](https://github.com/citra-emu/citra/pull/1546) by [bunnei](https://github.com/bunnei) ## [Shader JIT Refactor](https://github.com/citra-emu/citra/pull/1546) by [bunnei](https://github.com/bunnei)
While most of the issues with the shader JIT were fixed with the aforemoentioned changes, there remained a fundamental flaw with how flow control was handled. Previously, the shader JIT inlined CALL and JMP instructions. This had several issues: 1) Inlining all subroutines resulted in bloated shaders being generated, and 2) jumping to arbitrary addresses (and nested jumps) couldn't be supported. This is because when inlining code, the same source shader code might be recompiled multiple times. To support arbitrary jumps, there needed to be a one-to-one mapping of source code to compiled code. While most of the issues with the shader JIT were fixed with the aforemoentioned changes, there remained a fundamental
flaw with how flow control was handled. Previously, the shader JIT inlined CALL and JMP instructions. This had several
issues: 1) Inlining all subroutines resulted in bloated shaders being generated, and 2) jumping to arbitrary addresses
(and nested jumps) couldn't be supported. This is because when inlining code, the same source shader code might be
recompiled multiple times. To support arbitrary jumps, there needed to be a one-to-one mapping of source code to
compiled code.
To fix this, [bunnei](https://github.com/bunnei) refactored the shader JIT to do a multiple step compile: First, analyze the shader and identify subroutines, jumps, and return locations. Next, compile the code (just once), and insert additional code to handle the returns and jumps. In addition to enabling arbitrary CALL/JMP instructions, this results in pretty constant compiled shader sizes of around 40kb, which significantly reduced the memory footprint of the shader JIT. To fix this, [bunnei](https://github.com/bunnei) refactored the shader JIT to do a multiple step compile: First,
analyze the shader and identify subroutines, jumps, and return locations. Next, compile the code (just once), and
insert additional code to handle the returns and jumps. In addition to enabling arbitrary CALL/JMP instructions, this
results in pretty constant compiled shader sizes of around 40kb, which significantly reduced the memory footprint of
the shader JIT.
This change fixes IronFall: Invasion, Pokemon: Rumble Blast, and several other games: This change fixes IronFall: Invasion, Pokemon: Rumble Blast, and several other games:
<p style="text-align: center;"><img alt="" src="/images/entry/citra-progress-report-2016-p1/1.png" style="width: 400px; height: 240px;" /><img alt="" src="/images/entry/citra-progress-report-2016-p1/2.png" style="width: 320px; height: 240px;" /> {{< figure src="/images/entry/citra-progress-report-2016-p1/1.png" >}}
<p style="text-align: center;">With these changes, all known graphical glitches with IronFall: Invasion are fixed in Citra {{< figure src="/images/entry/citra-progress-report-2016-p1/2.png"
title="With these changes, all known graphical glitches with IronFall: Invasion are fixed in Citra" >}}
## [Audio Framework](https://github.com/citra-emu/citra/pull/1386) by [MerryMage](https://github.com/merrymage) ## [Audio Framework](https://github.com/citra-emu/citra/pull/1386) by [MerryMage](https://github.com/merrymage)
We'd like to mention the amazing work done by [MerryMage](https://github.com/merrymage) to bring proper DSP HLE and audio support to Citra. Over the past few months, she has been carefully chipping away at figuring out how audio 3DS works, removing several hacks in Citra along the way. While many of her efforts have been transparent to users up until this point, they have laid the groundwork for soon-to-come audio support. With changes [#1386](https://github.com/citra-emu/citra/pull/1386), [#1403](https://github.com/citra-emu/citra/pull/1403), [#1441](https://github.com/citra-emu/citra/pull/1441), [#1566](https://github.com/citra-emu/citra/pull/1566), and [#1572](https://github.com/citra-emu/citra/pull/1572), we're now closer than ever to hearing games for the first time in Citra! While [MerryMage](http://github.com/merrymage) has audio nearly complete in unofficial branches, there are still a few remaining issues before it gets merged. We'd like to mention the amazing work done by [MerryMage](https://github.com/merrymage) to bring proper DSP HLE and
audio support to Citra. Over the past few months, she has been carefully chipping away at figuring out how audio 3DS
works, removing several hacks in Citra along the way. While many of her efforts have been transparent to users up
until this point, they have laid the groundwork for soon-to-come audio support. With changes
[#1386](https://github.com/citra-emu/citra/pull/1386), [#1403](https://github.com/citra-emu/citra/pull/1403),
[#1441](https://github.com/citra-emu/citra/pull/1441), [#1566](https://github.com/citra-emu/citra/pull/1566), and
[#1572](https://github.com/citra-emu/citra/pull/1572), we're now closer than ever to hearing games for the first time
in Citra! While [MerryMage](http://github.com/merrymage) has audio nearly complete in unofficial branches, there are
still a few remaining issues before it gets merged.
## Contributors of 2016 ## Contributors of 2016
We've got a fortunate problem to have: It's often too difficult to mention every contribution made to Citra when writing progress reports! We'd like to extend a special thanks [to all that helped advance Citra further](https://github.com/citra-emu/citra/graphs/contributors?from=2016-01-01&amp;to=2016-04-19&amp;type=c) since our last progress report, you guys rock! We've got a fortunate problem to have: It's often too difficult to mention every contribution made to Citra when
writing progress reports! We'd like to extend a special thanks
[to all that helped advance Citra further](https://github.com/citra-emu/citra/graphs/contributors?from=2016-01-01&amp;to=2016-04-19&amp;type=c)
since our last progress report, you guys rock!

View File

@ -13,15 +13,13 @@ The summer of 2017 has just rolled in, and although we don't have a [summer of c
There is a rarely used feature in the 3DS' GPU called procedural textures, "proctex" for short. It allows games to generate new textures on the fly by just plugging in a few parameters. Mario & Luigi: Paper Jam, and Kirby: Planet Robobot both use it to generate realistic sea surfaces. The formula behind proctex had to be reverse-engineered in order to be implemented, which fortunately [fincs](https://github.com/fincs) did [and documented](https://gist.github.com/fincs/543f7e1375815f495f10020a053f14e9). Using this documentation, [wwylele](https://github.com/wwylele) simply translated it into code, and dropped it into Citra, fixing both those games. There is a rarely used feature in the 3DS' GPU called procedural textures, "proctex" for short. It allows games to generate new textures on the fly by just plugging in a few parameters. Mario & Luigi: Paper Jam, and Kirby: Planet Robobot both use it to generate realistic sea surfaces. The formula behind proctex had to be reverse-engineered in order to be implemented, which fortunately [fincs](https://github.com/fincs) did [and documented](https://gist.github.com/fincs/543f7e1375815f495f10020a053f14e9). Using this documentation, [wwylele](https://github.com/wwylele) simply translated it into code, and dropped it into Citra, fixing both those games.
<p style="text-align: center; font-size: small; padding: 1%"> {{< figure src="/images/entry/citra-progress-report-2017-june/paper-jam-foam.png" title="Look at that beautiful sea foam. ❤"
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Mario &amp; Luigi: Paper Jam's intro cutscene, showing Peach's castle, and the sea behind it" src="/images/entry/citra-progress-report-2017-june/paper-jam-foam.png" /> alt="Mario &amp; Luigi: Paper Jam's intro cutscene, showing Peach's castle, and the sea behind it" >}}
<br />
<!-- <!--
title_id = 0004000000132700 title_id = 0004000000132700
commit_hash = c017065570f9bad90a8cd3dadac9b63d810793a6 commit_hash = c017065570f9bad90a8cd3dadac9b63d810793a6
--> -->
Look at that beautiful sea foam. ❤︎
</p>
## [OpenGL: Improve accuracy of quaternion interpolation](https://github.com/citra-emu/citra/pull/2729) by [yuriks](https://github.com/yuriks) ## [OpenGL: Improve accuracy of quaternion interpolation](https://github.com/citra-emu/citra/pull/2729) by [yuriks](https://github.com/yuriks)
@ -45,27 +43,23 @@ In Citra, to be more efficient, we give the LUT (look-up table) to OpenGL and te
As a workaround, some offsets were set on the table in OpenGL so that it would pick the correct entries. But, the LUT on the 3DS also has a mode called "two's complement" in which each half of the table is "wrapped" virtually across past the beginning and end of the table, but not across the middle of the table. This completely messes up the table in OpenGL, leading to completely different results near the middle of the table, causing things like dark spots in highlighted areas. As a workaround, some offsets were set on the table in OpenGL so that it would pick the correct entries. But, the LUT on the 3DS also has a mode called "two's complement" in which each half of the table is "wrapped" virtually across past the beginning and end of the table, but not across the middle of the table. This completely messes up the table in OpenGL, leading to completely different results near the middle of the table, causing things like dark spots in highlighted areas.
<p style="text-align: center; font-size: small; padding: 1%"> {{< figure src="/images/entry/citra-progress-report-2017-june/lut-fix-before.png" title="Kyogre seems to have a bit of a skin blemish."
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Kyogre in Pok&eacute;mon Alpha Sapphire before the fix." src="/images/entry/citra-progress-report-2017-june/lut-fix-before.png" /> alt="Kyogre in Pok&eacute;mon Alpha Sapphire before the fix." >}}
<br />
<!-- <!--
title_id = 000400000011c500 title_id = 000400000011c500
commit_hash = 2f746e9946f78a2e283dfdcbeda9cf332e44d099 cherry-pick 6ca816e011c03f90f9ef6800c747c030df54c0cf 24e0b1ed8d4a24c814496e1b36236687fc0d442f commit_hash = 2f746e9946f78a2e283dfdcbeda9cf332e44d099 cherry-pick 6ca816e011c03f90f9ef6800c747c030df54c0cf 24e0b1ed8d4a24c814496e1b36236687fc0d442f
--> -->
Kyogre seems to have a bit of a skin blemish.
</p>
Although the OpenGL hack provided a slight increase in efficiency, in the end [wwylele](https://github.com/wwylele) replaced it all with simply mimicking what the 3DS does, fixing the entire issue, and making lighting calculations significantly more accurate. Sometimes the simplest solution is the best solution. Although the OpenGL hack provided a slight increase in efficiency, in the end [wwylele](https://github.com/wwylele) replaced it all with simply mimicking what the 3DS does, fixing the entire issue, and making lighting calculations significantly more accurate. Sometimes the simplest solution is the best solution.
<p style="text-align: center; font-size: small; padding: 1%"> {{< figure src="/images/entry/citra-progress-report-2017-june/lut-fix-after.png" title="Much better, guess the lighting got an acne treatment."
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Kyogre in Pok&eacute;mon Alpha Sapphire after the fix." src="/images/entry/citra-progress-report-2017-june/lut-fix-after.png" /> alt="Kyogre in Pok&eacute;mon Alpha Sapphire after the fix." >}}
<br />
<!-- <!--
title_id = 000400000011c500 title_id = 000400000011c500
commit_hash = c017065570f9bad90a8cd3dadac9b63d810793a6 commit_hash = c017065570f9bad90a8cd3dadac9b63d810793a6
--> -->
Much better, guess the lighting got an acne treatment.
</p>
## [Display QMessageBox Dialogs For Errors](https://github.com/citra-emu/citra/pull/2611) by [TheKoopaKingdom](https://github.com/TheKoopaKingdom) ## [Display QMessageBox Dialogs For Errors](https://github.com/citra-emu/citra/pull/2611) by [TheKoopaKingdom](https://github.com/TheKoopaKingdom)
@ -87,20 +81,23 @@ As a side-effect, [yuriks](https://github.com/yuriks) also had to implement the
These new features are all just features that were not known or not researched enough when the original lighting implementation was written. A few small fixes lead to big changes, such as the fact that Super Smash Bros. for 3DS now has proper lighting, instead of colours looking washed out and very bright. These new features are all just features that were not known or not researched enough when the original lighting implementation was written. A few small fixes lead to big changes, such as the fact that Super Smash Bros. for 3DS now has proper lighting, instead of colours looking washed out and very bright.
<p style="text-align: center; font-size: small; padding: 1%">
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Super Smash Bros. for 3DS before the new lighting features" src="/images/entry/citra-progress-report-2017-june/frag-light-before.png" /> {{< figure src="/images/entry/citra-progress-report-2017-june/frag-light-before.png"
alt="Super Smash Bros. for 3DS before the new lighting features" >}}
<!-- <!--
title_id = 00040000000edf00 title_id = 00040000000edf00
commit_hash = bae3799bd5208d08bb52546ad0723103c94cada3 commit_hash = bae3799bd5208d08bb52546ad0723103c94cada3
--> -->
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Super Smash Bros. for 3DS after the new lighting features" src="/images/entry/citra-progress-report-2017-june/frag-light-after.png" />
{{< figure src="/images/entry/citra-progress-report-2017-june/frag-light-after.png"
alt="Super Smash Bros. for 3DS after the new lighting features"
title="Finally someone turned down the lights." >}}
<!-- <!--
title_id = 00040000000edf00 title_id = 00040000000edf00
commit_hash = c017065570f9bad90a8cd3dadac9b63d810793a6 commit_hash = c017065570f9bad90a8cd3dadac9b63d810793a6
--> -->
<br />
Finally someone turned down the lights.
</p>
## [Frontend: Prevent FileSystemWatcher from blocking UI thread](https://github.com/citra-emu/citra/pull/2669) by [jroweboy](https://github.com/jroweboy) ## [Frontend: Prevent FileSystemWatcher from blocking UI thread](https://github.com/citra-emu/citra/pull/2669) by [jroweboy](https://github.com/jroweboy)

View File

@ -20,10 +20,7 @@ Citra's video code has grown organically from the start; not much was known abou
The entire architecture of the 3DS was largely unknown, so development was done in small seperate bits at a time, and then trying to piece it all together into one cohesive piece of software. But, over time, as new pieces of information were found, the assumptions that were made previously broke. Some assumptions were very large, obvious, and easy to overcome, but a more subtle error that these assumptions created were not even in the design of the GPU, but rather the architecture and organization of the code itself. The entire architecture of the 3DS was largely unknown, so development was done in small seperate bits at a time, and then trying to piece it all together into one cohesive piece of software. But, over time, as new pieces of information were found, the assumptions that were made previously broke. Some assumptions were very large, obvious, and easy to overcome, but a more subtle error that these assumptions created were not even in the design of the GPU, but rather the architecture and organization of the code itself.
<p style="text-align: center;"> {{< figure src="/images/entry/citra-progress-report-2017-p1/acnl-bridge.png" title="Shouldn't there be a bridge here?" alt="Animal Crossing bridge" >}}
<img alt="" src="/images/entry/citra-progress-report-2017-p1/acnl-bridge.png" />
Shouldn't there be a bridge here?
</p>
The video code was very interconnected using this interface, so despite people being aware of this, it was also extremely difficult to move code around and reorganize it, as it could very easily affect unrelated bits of code that depended on it. This was only compounded by the hardware renderer, as it was written much like earlier, slowly adding hardware support bit-by-bit to separate parts of the video code, simply falling back into the software renderer when disabled or not supported. The video code was very interconnected using this interface, so despite people being aware of this, it was also extremely difficult to move code around and reorganize it, as it could very easily affect unrelated bits of code that depended on it. This was only compounded by the hardware renderer, as it was written much like earlier, slowly adding hardware support bit-by-bit to separate parts of the video code, simply falling back into the software renderer when disabled or not supported.

View File

@ -6,11 +6,23 @@ author = "saphiresurf"
forum = 1943 forum = 1943
+++ +++
As game compatibility has broadened and the popularity of Citra has risen there's always been a lack of consistent information on what could be played in Citra and what couldn't. Often times the best way to find out if a game was working properly in Citra was to jump in and test it for yourself, but if any issues were encountered you'd be left scouring through forums sifting through potentially out of date information for answers. As game compatibility has broadened and the popularity of Citra has risen there's always been a lack of consistent
information on what could be played in Citra and what couldn't. Often times the best way to find out if a game was
working properly in Citra was to jump in and test it for yourself, but if any issues were encountered you'd be left
scouring through forums sifting through potentially out of date information for answers.
In order to address this issue [Flame Sage](https://community.citra-emu.org/u/flamesage/summary), [Flamboyant Ham](https://community.citra-emu.org/u/flamboyant_ham/summary), [leo121](https://community.citra-emu.org/u/leo121/summary), [anodium](https://community.citra-emu.org/u/anodium/summary), and [TheKoopaKingdom](https://community.citra-emu.org/u/thekoopakingdom/summary) have worked hard to create a new game compatibility wiki! As time goes on more and more titles from the 3DS library will be added to this list. As they're added in, each game will be given a compatibility rating based on how well and how smoothly they run in Citra. On each game's individual page there will be a summary of the game itself, how it runs on Citra, as well as any problems that arise when running the game. In order to address this issue [Flame Sage](https://community.citra-emu.org/u/flamesage/summary),
[Flamboyant Ham](https://community.citra-emu.org/u/flamboyant_ham/summary),
[leo121](https://community.citra-emu.org/u/leo121/summary),
[anodium](https://community.citra-emu.org/u/anodium/summary), and
[TheKoopaKingdom](https://community.citra-emu.org/u/thekoopakingdom/summary) have worked hard to create a new game
compatibility wiki! As time goes on more and more titles from the 3DS library will be added to this list. As they're
added in, each game will be given a compatibility rating based on how well and how smoothly they run in Citra. On each
game's individual page there will be a summary of the game itself, how it runs on Citra, as well as any problems that
arise when running the game.
We encourage community contributions to this list as well! If you'd like to add new entries to this list you can find out how to contribute [here](https://github.com/citra-emu/citra-games-wiki/blob/master/CONTRIBUTING.md). We encourage community contributions to this list as well! If you'd like to add new entries to this list you can find
out how to contribute [here](https://github.com/citra-emu/citra-games-wiki/blob/master/CONTRIBUTING.md).
Thank you everyone for continuing on this journey with us! Thank you everyone for continuing on this journey with us!

View File

@ -6,39 +6,65 @@ author = "merrymage"
forum = 38 forum = 38
+++ +++
*Special thanks must be given to fincs and the rest of the 3DS community for their work reverse-engineering the DSP firmware. Without that work, Citra would not be this far with audio emulation.* *Special thanks must be given to fincs and the rest of the 3DS community for their work reverse-engineering the DSP
firmware. Without that work, Citra would not be this far with audio emulation.*
As of [May 19th, 2016](https://github.com/citra-emu/citra/commit/af258584d978f02d462743012491a273c61b067e), Citra now has preliminary High Level Emulation (HLE) audio support! This means that users playing on Citra no longer have to listen to the deafening sound of silence in many titles. To get to this point was a huge reverse-engineering effort done by multiple people, with much of the reverse-engineering and the final implementation for Citra coming from MerryMage. This undertaking has required many months of development but the end result brings sound to the masses. As of [May 19th, 2016](https://github.com/citra-emu/citra/commit/af258584d978f02d462743012491a273c61b067e), Citra now
has preliminary High Level Emulation (HLE) audio support! This means that users playing on Citra no longer have to
listen to the deafening sound of silence in many titles. To get to this point was a huge reverse-engineering effort
done by multiple people, with much of the reverse-engineering and the final implementation for Citra coming from
MerryMage. This undertaking has required many months of development but the end result brings sound to the masses.
{{< youtube 8LCUlyjvTJU >}} {{< youtube 8LCUlyjvTJU >}}
## **Technical Details on how Audio Works for the 3DS** ## Technical Details on how Audio Works for the 3DS
Audio processing and output is done by a specialised coprocessor. These kinds of coprocessors are called Digital Signal Processors (DSPs). Audio processing and output is done by a specialised coprocessor. These kinds of coprocessors are called Digital Signal
Processors (DSPs).
Games that run on the 3DS need to communicate with the DSP in order to play audio. They do this by two ways: via the the <span style="font-family:'Courier New'">dsp::DSP</span> service and via a shared memory region. The <span style="font-family:'Courier New'">dsp::DSP</span> service provides service calls for initialization of the DSP hardware including firmware upload. The shared memory region is used for communication between the game on the CPU and the firmware on the DSP. Games that run on the 3DS need to communicate with the DSP in order to play audio. They do this by two ways: via the
the `dsp::DSP` service and via a shared memory region. The `dsp::DSP` service provides service calls for initialization
of the DSP hardware including firmware upload. The shared memory region is used for communication between the game on
the CPU and the firmware on the DSP.
In order to emulate audio, Citra must emulate the <span style="font-family:'Courier New'">dsp::DSP</span> service and also understand the layout of the DSP shared memory region. One must understand what writing to various addresses in the shared memory region does. One must also understand what happens between data being fed to the DSP firmware and audio coming out of the speakers. In order to emulate audio, Citra must emulate the `dsp::DSP` service and also understand the layout of the DSP shared
memory region. One must understand what writing to various addresses in the shared memory region does. One must also
understand what happens between data being fed to the DSP firmware and audio coming out of the speakers.
## **Early Reverse Engineering** ## Early Reverse Engineering
With this known MerryMage set out to trace reads and writes to shared memory that games did. She eventually ended up playing these back on hardware and figured out what the appropriate firmware responses were. This eventually lead to the early implementations of audio output that originally were shown in January by various users. Many other aspects, including ADPCM decoding, took a while to figure out. <br></br> With this known MerryMage set out to trace reads and writes to shared memory that games did. She eventually ended up
playing these back on hardware and figured out what the appropriate firmware responses were. This eventually lead to
the early implementations of audio output that originally were shown in January by various users. Many other aspects,
including ADPCM decoding, took a while to figure out.
{{< youtube 1c_A7gpAZ8A >}} {{< youtube 1c_A7gpAZ8A >}}
<br></br>
MerryMage had raw audio output working but she still didnt understand how various parameters were applied to the audio by the firmware. It was at this point where she discovered that the firmware writes back what is output to the speakers into the shared memory region. This discovery made future work with audio effects much easier as bit perfect audio could be dumped as the 3DS produced it without any extra hardware. Having real hardware audio output on hand meant MerryMage could also apply signal processing techniques like system identification to figure out what internal processing the firmware does. MerryMage had raw audio output working but she still didnt understand how various parameters were applied to the audio
by the firmware. It was at this point where she discovered that the firmware writes back what is output to the speakers
into the shared memory region. This discovery made future work with audio effects much easier as bit perfect audio
could be dumped as the 3DS produced it without any extra hardware. Having real hardware audio output on hand meant
MerryMage could also apply signal processing techniques like system identification to figure out what internal
processing the firmware does.
With this newfound knowledge and this new set of tools MerryMage rapidly conquered what the firmware was doing. With this newfound knowledge and this new set of tools MerryMage rapidly conquered what the firmware was doing.
## **Time Stretching** ## Time Stretching
Emulation speed can vary a lot between games or even parts of games. To accomodate this, time streching was added as an audio enhancement. This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio stutter. This is an effect completely separate from emulation and is only to alter and improve audio played back when the emulator is not going full speed. Emulation speed can vary a lot between games or even parts of games. To accomodate this, time streching was added as an
audio enhancement. This post-processing effect adjusts audio speed to match emulation speed and helps prevent audio
stutter. This is an effect completely separate from emulation and is only to alter and improve audio played back when
the emulator is not going full speed.
## **Future Plans for Audio** ## Future Plans for Audio
Audio is still not complete! There are still a number of unimplemented features and accuracy improvements to have. Many of these features have been reverse engineered already but simply aren't implemented. This includes reverb, delay, and other minor audio effects. Some features require more reverse engineering work, such as looped buffers and surround sound. Audio is still not complete! There are still a number of unimplemented features and accuracy improvements to have. Many
of these features have been reverse engineered already but simply aren't implemented. This includes reverb, delay, and
other minor audio effects. Some features require more reverse engineering work, such as looped buffers and surround
sound.
While the black-box reverse engineering approach has served well so far, further improvements in accuracy can more easily be made by decompiling the firmware and perhaps implementing Low Level Emulation (LLE) audio. This comes with its own set of challenges especially as the DSP architecture is not well known and there is little documentation on it. While the black-box reverse engineering approach has served well so far, further improvements in accuracy can more
easily be made by decompiling the firmware and perhaps implementing Low Level Emulation (LLE) audio. This comes with
its own set of challenges especially as the DSP architecture is not well known and there is little documentation on it.
Until then, we at Citra hope that everyone enjoys this initial HLE audio implementation! Until then, we at Citra hope that everyone enjoys this initial HLE audio implementation!

View File

@ -5,24 +5,31 @@ author = "thekoopakingdom"
forum = 40 forum = 40
+++ +++
```DISCLAIMER: You do NOT need to follow this guide if you downloaded Citra for the first time after December 6th, 2016 OR if you have freshly installed Citra since using an older build.``` **DISCLAIMER: You do NOT need to follow this guide if you downloaded Citra for the first time after December 6th, 2016
OR if you have freshly installed Citra since using an older build.**
In new versions of Citra, the location of saves has changed, so this guide will show how to migrate your saves to the new location on Window (Linux and macOS Bleeding Edge builds are planned, we are currently busy working on bringing nightly builds back.). In new versions of Citra, the location of saves has changed, so this guide will show how to migrate your saves to the
new location on Windows (Linux and macOS Bleeding Edge builds are planned, we are currently busy working on bringing
nightly builds back.).
1. Press Windows + R, type `explorer %localappdata%`, this should bring up a Windows Explorer window in a `Local`
folder. Navigate to the `citra` folder.
1. Press Windows + R, type ```explorer %localappdata%```, this should bring up a Windows Explorer window in a ```Local``` folder. Navigate to the ```citra``` folder.
<br></br>
{{< img src="entry/migrate-your-savefiles/ex_1.png" width="574px" height="142px">}} {{< img src="entry/migrate-your-savefiles/ex_1.png" width="574px" height="142px">}}
2. Navigate to the ```app-x.x.x``` folder with the highest version number. 2. Navigate to the `app-x.x.x` folder with the highest version number.
<br></br>
{{< img src="entry/migrate-your-savefiles/ex_2.png" width="570px" height="497px">}} {{< img src="entry/migrate-your-savefiles/ex_2.png" width="570px" height="497px">}}
3. Move the ```user``` folder to your desktop. **<u>Make sure the user folder no longer exists in the existing folder.</u>** 3. Move the user` folder to your desktop. **<u>Make sure the user folder no longer exists in the existing folder.</u>**
4. Run ```citra-qt.exe```. The settings should now be reset, and Citra will begin using the new location. Now you can exit it. 4. Run citra-qt.exe`. The settings should now be reset, and Citra will begin using the new location. Now you can exit
it.
5. Press Windows + R, type ```explorer %appdata%```, this should bring up a Windows Explorer window in a ```Roaming``` folder. Navigate to the ```Citra ```folder. 5. Press Windows + R, type `explorer %appdata%`, this should bring up a Windows Explorer window in a `Roaming` folder.
Navigate to the ```Citra ```folder.
6. Move the contents of the ```user``` folder on your desktop to the ```Citra``` folder, overwrite any files if asked. 6. Move the contents of the `user` folder on your desktop to the `Citra` folder, overwrite any files if asked.
Now, all of your settings and saves for Citra have been moved to the new location, which has the advantage of being able to be accessed by any new version of Citra, bringing stability improvements and storing your user data in a safe place. Now, all of your settings and saves for Citra have been moved to the new location, which has the advantage of being able
to be accessed by any new version of Citra, bringing stability improvements and storing your user data in a safe place.

View File

@ -33,23 +33,18 @@ The telemetry framework will collect information such as:
Not everyone is comfortable sharing information about their system, so we've made it easy to opt-out: Not everyone is comfortable sharing information about their system, so we've made it easy to opt-out:
<p style="text-align: center; padding: 1%;">
<img style="padding: 0% 0% 1% 0%;" height="75%" width="75%" alt="Alt, E, C" src="/images/entry/telemetry-and-why-thats-a-good-thing/optout1.png" />
<br />
First, head to the Citra "Emulation" → "Configure..." menu.
</p>
<p style="text-align: center; padding: 1%;"> {{< figure src="/images/entry/telemetry-and-why-thats-a-good-thing/optout1.png"
<img style="padding: 0% 0% 1% 0%;" height="75%" width="75%" alt="Right arrow, Right arrow, Right arrow, Right arrow, Right arrow, Right arrow, Right arrow" src="/images/entry/telemetry-and-why-thats-a-good-thing/optout2.png" /> alt="Alt, E, C"
<br /> title="First, head to the Citra \"Emulation\" → \"Configure...\" menu." >}}
Then, head into the "Web" tab.
</p>
<p style="text-align: center; padding: 1%;"> {{< figure src="/images/entry/telemetry-and-why-thats-a-good-thing/optout2.png"
<img style="padding: 0% 0% 1% 0%;" height="75%" width="75%" alt="Tab, Tab, Tab, Tab, Tab, Space" src="/images/entry/telemetry-and-why-thats-a-good-thing/optout3.png" /> alt="Right arrow, Right arrow, Right arrow, Right arrow, Right arrow, Right arrow, Right arrow"
<br /> title="Then, head into the \"Web\" tab." >}}
And finally, untick the box titled "Share anonymous usage data with the Citra team".
</p> {{< figure src="/images/entry/telemetry-and-why-thats-a-good-thing/optout3.png"
alt="Tab, Tab, Tab, Tab, Tab, Space"
title="And finally, untick the box titled \"Share anonymous usage data with the Citra team\"." >}}
You may have also noticed the field titled "Telemetry ID" in the screenshots, this You may have also noticed the field titled "Telemetry ID" in the screenshots, this
is an identifier generated randomly on install which is used instead of your IP is an identifier generated randomly on install which is used instead of your IP

View File

@ -7,7 +7,11 @@ coauthor = "tfarley"
forum = 35 forum = 35
+++ +++
One of the big things everyone has been wondering about Citra is when it will be able to render games at HD resolutions. One of the great things about emulators is that they can surpass the limitations of the original console, especially when it comes to graphical fidelity. With the 3DS specifically, many beautifully detailed games are hidden behind staggeringly low resolution screens topping out at 400x240. With **Texture Forwarding** (from tfarley, based on yuriks early implementation), Citra can now output games at any resolution, and runs faster as well! One of the big things everyone has been wondering about Citra is when it will be able to render games at HD resolutions.
One of the great things about emulators is that they can surpass the limitations of the original console, especially
when it comes to graphical fidelity. With the 3DS specifically, many beautifully detailed games are hidden behind
staggeringly low resolution screens topping out at 400x240. With **Texture Forwarding** (from tfarley, based on
yuriks early implementation), Citra can now output games at any resolution, and runs faster as well!
{{< youtube 7XFcTqoZ3nk >}} {{< youtube 7XFcTqoZ3nk >}}
@ -15,11 +19,21 @@ One of the big things everyone has been wondering about Citra is when it will be
To understand Texture Forwarding, we've created a diagram to show what's actually going on. To understand Texture Forwarding, we've created a diagram to show what's actually going on.
{{< img src="entry/texture-forwarding-brings-hd-output-to-citra/citra-texture-forwarding.png" width="481px" height="367px" center="true" >}} {{< figure src="/images/entry/texture-forwarding-brings-hd-output-to-citra/citra-texture-forwarding.png" >}}
<br></br>
The diagram is a simplified representation of the actual pipeline, as 3DS games perform multiple additional steps such as framebuffer copies between rendering and display - but the concept remains the same. The main idea is to keep framebuffers rendered by the HW Renderer as textures on the GPU as much as possible, to avoid the performance overhead of transferring them between the CPU and GPU as in the Slow Path. In most instances, the CPU never accesses (reads from/writes to) a rendered frame so it can safely stay on the GPU from rendering all the way through to ultimate display in Citra. This eliminates CPU/GPU sync points and makes the emulator faster overall. The diagram is a simplified representation of the actual pipeline, as 3DS games perform multiple additional steps such
<br></br> as framebuffer copies between rendering and display - but the concept remains the same. The main idea is to keep
In addition to a performance boost, Texture Forwarding also allows the HW Renderer to render and display at higher resolutions than the native 3DS when the pixel data is not accessed from anywhere else. But in the event that the memory region of some texture is reador writtenby the CPU, the renderer will fall back to the slow path and downsample the texture back to native resolution to ensure that the accesses are reflected accurately. framebuffers rendered by the HW Renderer as textures on the GPU as much as possible, to avoid the performance overhead
of transferring them between the CPU and GPU as in the Slow Path. In most instances, the CPU never accesses
(reads from/writes to) a rendered frame so it can safely stay on the GPU from rendering all the way through to
ultimate display in Citra. This eliminates CPU/GPU sync points and makes the emulator faster overall.
If you're interested in seeing just how nice some 3DS games look, [HD screenshots have been added to Citra's screenshots page!](https://citra-emu.org/screenshots) Or you can try it yourself on your 3DS games by downloading the latest build of Citra from the [download's page](https://citra-emu.org/page/download). In addition to a performance boost, Texture Forwarding also allows the HW Renderer to render and display at higher
resolutions than the native 3DS when the pixel data is not accessed from anywhere else. But in the event that the
memory region of some texture is read or written by the CPU, the renderer will fall back to the slow path and
downsample the texture back to native resolution to ensure that the accesses are reflected accurately.
If you're interested in seeing just how nice some 3DS games look,
[HD screenshots have been added to Citra's screenshots page!](https://citra-emu.org/screenshots) Or you can try it
yourself on your 3DS games by downloading the latest build of Citra from the
[download's page](https://citra-emu.org/page/download).

View File

@ -7,6 +7,12 @@ coauthor = "flamboyant_ham"
forum = 41 forum = 41
+++ +++
As you all know, the Nightly builds have been down for some time now due to the former maintainer not being around, but the issues have been resolved, and the Nightly builds are now available on our [downloads page](https://citra-emu.org/download/) once again! With downloads available for Windows, macOS, and Linux, you're no longer required to compile the build yourself. As you all know, the Nightly builds have been down for some time now due to the former maintainer not being around, but
the issues have been resolved, and the Nightly builds are now available on our
[downloads page](https://citra-emu.org/download/) once again! With downloads available for Windows, macOS, and Linux,
you're no longer required to compile the build yourself.
Likewise, we'd like to remind all users that any bugs found within Citra, or during emulation, be reported from the Nightly builds, and not the Bleeding Edge ones. From hereon out, support for the latter will no longer be given. If you believe you've found a bug in Bleeding Edge, please retest on the latest Nightly build. Thank you everyone for your patience, and Happy New Year! Likewise, we'd like to remind all users that any bugs found within Citra, or during emulation, be reported from the
Nightly builds, and not the Bleeding Edge ones. From hereon out, support for the latter will no longer be given. If
you believe you've found a bug in Bleeding Edge, please retest on the latest Nightly build. Thank you everyone for
your patience, and Happy New Year!

View File

@ -5,19 +5,21 @@ author = "thekoopakingdom"
forum = 39 forum = 39
+++ +++
If you haven't heard of [Discord](https://discordapp.com/) yet, it's basically an alternative to Skype, featuring servers with both voice and text chat. You can use it in your browser, download the desktop program, or get the mobile app. If you haven't heard of [Discord](https://discordapp.com/) yet, it's basically an alternative to Skype, featuring
servers with both voice and text chat. You can use it in your browser, download the desktop program, or get the mobile
app.
If you don't have an account already, you can make one for free [here](https://discordapp.com/register). If you don't have an account already, you can make one for free [here](https://discordapp.com/register).
Once you've done that, you can join Citra's official server by going [here](https://discord.gg/fZwvKPu). Once you've done that, you can join Citra's official server by going [here](/discord/).
There are 5 channels: There are 5 channels:
* #read-first - A read-only introduction to the server, and announcements. * \#read-first - A read-only introduction to the server, and announcements.
* #citra-general - Any discussion related to Citra. * \#citra-general - Any discussion related to Citra.
* #citra-support - If you are having trouble with Citra, you can ask for help here. **Please read #read-first, first.** * \#citra-support - If you are having trouble with Citra, you can ask for help here. **Please read #read-first, first.**
* #dumping-support - Support for dumping games/system files for Citra. * \#dumping-support - Support for dumping games/system files for Citra.
* #offtopic - Anything not related to Citra that doesn't belong in #citra-general goes here. * \#offtopic - Anything not related to Citra that doesn't belong in #citra-general goes here.
The [Citra](https://citra-emu.org/rules/) Community Rules also apply to this server. The [Citra](https://citra-emu.org/rules/) Community Rules also apply to this server.

View File

@ -5,28 +5,32 @@ author = "flamesage"
forum = 8 forum = 8
+++ +++
Welcome to the brand new Citra website! This new site has been a sort of secret project off and on for over a year now. A lot of hard work, a few false starts, but here we are! This has been a big team effort - we'd like to especially thank [Flame Sage](https://community.citra-emu.org/users/flamesage/activity), the primary architect behind the new website backend; [MaJoR](https://community.citra-emu.org/users/mayimilae/activity) for the design and artwork, and lastly jchadwick for his early on role in the project. Here's a brief overview of some of our new features! Welcome to the brand new Citra website! This new site has been a sort of secret project off and on for over a year now.
A lot of hard work, a few false starts, but here we are! This has been a big team effort - we'd like to especially
thank [Flame Sage](https://community.citra-emu.org/users/flamesage/activity), the primary architect behind the new
website backend; [MaJoR](https://community.citra-emu.org/users/mayimilae/activity) for the design and artwork, and
lastly jchadwick for his early on role in the project. Here's a brief overview of some of our new features!
**[Blog](https://citra-emu.org):** Citra now *finally* has a platform to share information with everyone directly! It
will allow Citra to communicate directly to users and fans in long form, fully exploring 3DS emulation in ways that
were impossible to express before. An article is already up talking about the past year of development, and more
will come!
**[Community](https://community.citra-emu.org/):** Citra now has its own discussion forum! It is now open, so come on
everyone and join! Instead of the typical forum software, we are using a brand new open source forum software that
is focused on streamlining and simplifying bulletin boards. It's a little different from what you might be used to,
but it is a joy to use!
**[Blog](https://citra-emu.org):** Citra now *finally* has a platform to share information with everyone directly! It will allow Citra to communicate directly to users and fans in long form, fully exploring 3DS emulation in ways that were impossible to express before. An article is already up talking about the past year of development, and more will come! **[Wiki](https://citra-emu.org/wiki/Home):** The site has it's own wiki! But not a mediawiki - select articles from
Github can be elevated here for easy access to user-update guides and other materials. In time, it will make Citra
much easier to use.
**[Community](https://community.citra-emu.org/):** Citra now has its own discussion forum! It is now open, so come on everyone and join! Instead of the typical forum software, we are using a brand new open source forum software that is focused on streamlining and simplifying bulletin boards. It's a little different from what you might be used to, but it is a joy to use!
**[Wiki](https://citra-emu.org/wiki/Home):** The site has it's own wiki! But not a mediawiki - select articles from github can be elevated here for easy access to user-update guides and other materials. In time, it will make Citra much easier to use.
**[Screenshots](https://citra-emu.org/screenshots):** We have our own screenshots gallery, which will give us a *lot* more room for a lot more screenshots! With easy navigation and viewing to boot.
**[Screenshots](https://citra-emu.org/screenshots):** We have our own screenshots gallery, which will give us a *lot*
more room for a lot more screenshots! With easy navigation and viewing to boot.
**Logo:** And finally, this is the official reveal of our new logo! **Logo:** And finally, this is the official reveal of our new logo!
{{< img src="entry/welcome-to-the-new-citra/citralogoforarticle.jpg" width="640px" height="320px" center="true" >}} {{< img src="entry/welcome-to-the-new-citra/citralogoforarticle.jpg" width="640px" height="320px" center="true" >}}
There's a LOT more work to be done, so things are definitely a work in progress. For example, a new download page with archives is high on our list! But we're going to keep working hard and keep making things better. There's a LOT more work to be done, so things are definitely a work in progress. For example, a new download page with
archives is high on our list! But we're going to keep working hard and keep making things better.

View File

@ -8,10 +8,22 @@ forum = 54
As we approach the first birthday of Citra's website, we'd like to announce yet another project infrastructure update: As we approach the first birthday of Citra's website, we'd like to announce yet another project infrastructure update:
**We've decided to launch a [new forum](http://community.citra-emu.org/) based on the [Discourse](https://www.discourse.org/) forum software!** **We've decided to launch a [new forum](http://community.citra-emu.org/) based on the
[Discourse](https://www.discourse.org/) forum software!**
When we first introduced the new website back in February of 2016, we chose to use [Flarum](http://flarum.org/) over more classic forums used on other websites (such as phpBB, MyBB, or vBulletin). The reason for this was because Flarum was a much more modern platform, with better mobile support, and a attractive and innovative UI. It seemingly had a very promising future, receiving multiple large updates in a very short timeframe. But while it was great to use at first, it ultimately left us wanting some critical features that never seemed to come - such as the ability to send private messages. When we first introduced the new website back in February of 2016, we chose to use [Flarum](http://flarum.org/) over
more classic forums used on other websites (such as phpBB, MyBB, or vBulletin). The reason for this was because Flarum
was a much more modern platform, with better mobile support, and a attractive and innovative UI. It seemingly had a
very promising future, receiving multiple large updates in a very short timeframe. But while it was great to use at
first, it ultimately left us wanting some critical features that never seemed to come - such as the ability to send
private messages.
Meet [Discourse](https://www.discourse.org/), an open source forum platform with the features that we need. Not only does it improve our ability to moderate, but the every day user experience should also be enhanced. Discourse is a widely used and established platform, used by such communities as [Imgur](https://community.imgur.com/), [Twitter](https://twittercommunity.com/), [Github](https://discuss.atom.io/), [Ubuntu](http://discourse.ubuntu.com/), and [more](https://www.discourse.org/faq/customers/). The layout of the new forums are simple, users of Flarum should have no problem getting used to it! Meet [Discourse](https://www.discourse.org/), an open source forum platform with the features that we need. Not only
does it improve our ability to moderate, but the every day user experience should also be enhanced. Discourse is a
widely used and established platform, used by such communities as [Imgur](https://community.imgur.com/),
[Twitter](https://twittercommunity.com/), [Github](https://discuss.atom.io/), [Ubuntu](http://discourse.ubuntu.com/),
and [more](https://www.discourse.org/faq/customers/). The layout of the new forums are simple, users of Flarum should
have no problem getting used to it!
You can visit the new forums at https://community.citra-emu.org/, come say Hello! You'll need to create a new account, but we now support using your Google or GitHub credentials to log in! You can visit the new forums at https://community.citra-emu.org/, come say Hello! You'll need to create a new account,
but we now support using your Google or GitHub credentials to log in!

View File

@ -23,13 +23,12 @@
<link href="{{ .Site.BaseURL }}/index.xml" rel="feed" type="application/rss+xml" title="{{ .Site.Title }}" /> <link href="{{ .Site.BaseURL }}/index.xml" rel="feed" type="application/rss+xml" title="{{ .Site.Title }}" />
{{ end }} {{ end }}
<title>{{- if .IsHome }}Homepage{{- else }}{{ .Title }}{{- end }} | {{ .Site.Title }} | Nintendo 3DS Emulator</title> <title>{{- if not .IsHome }}{{ .Title }} - {{ .Site.Title }}{{- else }}{{ .Site.Title }} - Nintendo 3DS Emulator{{- end }}</title>
<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet"> <link href="https://fonts.googleapis.com/css?family=Ubuntu|Dosis" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Dosis" rel="stylesheet">
<link rel="stylesheet" href="{{ .Site.BaseURL }}/css/style.css"/> <link rel="stylesheet" href="{{ .Site.BaseURL }}/css/style.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous"></script> integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
{{ if eq (getenv "HUGO_ENV") "PRD" }} {{ if eq (getenv "HUGO_ENV") "PRD" }}
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
@ -114,8 +113,8 @@
</div> </div>
</div> </div>
{{ block "scripts" . }}{{ end }}
<script src="{{ .Site.BaseURL }}/js/script.js"></script> <script src="{{ .Site.BaseURL }}/js/script.js"></script>
{{ block "scripts" . }}{{ end }}
</body> </body>
</html> </html>

View File

@ -14,6 +14,13 @@
{{ define "scripts" }} {{ define "scripts" }}
<script type="text/javascript"> <script type="text/javascript">
$('#carousel').carousel({ interval: 4000 }); $('#carousel-inner').slick({
autoplay: true,
autoplaySpeed: 4000,
lazyLoaded: true,
prevArrow: "#slider-prev",
nextArrow: "#slider-next",
lazyLoad: "progressive"
});
</script> </script>
{{ end }} {{ end }}

View File

@ -7,23 +7,29 @@
<div id="carousel" class="carousel slide" data-ride="carousel"> <div id="carousel" class="carousel slide" data-ride="carousel">
<!-- Wrapper for slides --> <!-- Wrapper for slides -->
<div class="carousel-inner"> <div id="carousel-inner" class="carousel-inner">
{{ $jumbotronFiles := readDir "/static/images/jumbotron/" }} {{ $jumbotronFiles := readDir "/static/images/jumbotron/" }}
{{ range $index, $element := $jumbotronFiles }} {{ range $index, $element := $jumbotronFiles }}
{{ $fileTitle := (index (split .Name "-") 1) }} {{ $fileTitle := (index (split .Name "-") 1) }}
{{ $fileTitle := (index (split $fileTitle ".") 0) }} {{ $fileTitle := (index (split $fileTitle ".") 0) }}
<div class="item {{if eq $index 0}}active{{end}}"> <div>
<img class="article-image img-responsive center-block" src="/images/jumbotron{{ $element.Name | relURL }}" alt="..."> <img class="article-image img-responsive center-block"
{{if eq $index 0}}
src="/images/jumbotron{{ $element.Name | relURL }}"
{{else}}
data-lazy="/images/jumbotron{{ $element.Name | relURL }}"
{{end}}
alt="{{ $fileTitle }}">
<div class="carousel-caption">{{ $fileTitle }}</div> <div class="carousel-caption">{{ $fileTitle }}</div>
</div> </div>
{{ end }} {{ end }}
</div> </div>
<!-- Controls --> <!-- Controls -->
<a class="left carousel-control" href="#carousel" role="button" data-slide="prev"> <a class="left carousel-control" href="#carousel" role="button" id="slider-prev">
<span class="glyphicon glyphicon-chevron-left"></span> <span class="glyphicon glyphicon-chevron-left"></span>
</a> </a>
<a class="right carousel-control" href="#carousel" role="button" data-slide="next"> <a class="right carousel-control" href="#carousel" role="button" id="slider-next">
<span class="glyphicon glyphicon-chevron-right"></span> <span class="glyphicon glyphicon-chevron-right"></span>
</a> </a>

View File

@ -1,7 +1,8 @@
<nav class="navbar navbar-default navbar-wrapper navbar-fixed-top"> <nav class="navbar navbar-default navbar-wrapper navbar-fixed-top">
<div class="container"> <div class="container">
<div class="navbar-header"> <div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span> <span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
@ -9,34 +10,42 @@
</button> </button>
<a class="navbar-brand" href="/">&nbsp;</a> <a class="navbar-brand" href="/">&nbsp;</a>
</div> </div>
<div id="navbar" class="navbar-collapse collapse"> <div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav"> <ul class="nav navbar-nav">
<li class="index-1 first"><a href="/" title="" class="">Blog</a></li> <li class="index-1 first"><a href="/" title="Blog Posts">Blog</a></li>
<li class="index-2"><a href="/download/" title="" class="">Download</a></li> <li class="index-2"><a href="/download/" title="Download Citra">Download</a></li>
<li class="index-3"><a href="/wiki/home/" title="" class="">Wiki</a></li> <li class="index-3"><a href="/wiki/home/" title="Wiki Homepage">Wiki</a></li>
<li class="index-4"><a href="/wiki/faq/" title="" class="">FAQ</a></li> <li class="index-4"><a href="/wiki/faq/" title="Frequently Asked Questions">FAQ</a></li>
<li class="index-5"><a href="/game/" title="" class="">Games</a></li> <li class="index-5"><a href="/game/" title="Game Compatibility">Games</a></li>
<li class="index-6 dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Social <span class="caret"></span></a>
<li class="index-6 dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"
role="button" aria-haspopup="true" aria-expanded="false">
Social <span class="caret"></span>
</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li class="index-1 first"><a href="/rules/" title="" class="">Rules</a></li> <li class="index-1 first"><a href="/rules/" title="">Rules</a></li>
<li class="index-2"><a href="https://community.citra-emu.org/" title="" class="">Community Forums</a></li> <li class="index-2"><a href="https://community.citra-emu.org/" title="Forums">Community Forums</a></li>
<li class="index-3 last"><a href="/discord/" title="" class="">Discord Chat</a></li> <li class="index-3 last"><a href="/discord/" title="Discord Channel">Discord Chat</a></li>
</ul> </ul>
</li> </li>
<li class="index-7 dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Media <span class="caret"></span></a>
<li class="index-7 dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
aria-haspopup="true" aria-expanded="false">
Media <span class="caret"></span>
</a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li class="index-1 first"><a href="/screenshots/" title="" class="">Screenshots</a></li> <li class="index-1 first"><a href="/screenshots/" title="Screenshots">Screenshots</a></li>
<li class="index-2 last"><a href="https://www.youtube.com/channel/UC_dcdgzuapBtAY4ol3x-90Q" title="" class="">Videos</a></li> <li class="index-2 last"><a href="https://www.youtube.com/channel/UC_dcdgzuapBtAY4ol3x-90Q"
title="Youtube Channel">Videos</a></li>
</ul> </ul>
</li> </li>
<li class="index-8 last"><a href="/donate/" title="" class="">Donate</a></li>
</ul> <li class="index-8 last"><a href="/donate/" title="Donate to Citra">Donate</a></li>
<ul class="nav navbar-nav navbar-right">
<!--<li>
<form method="get" action="/search" enctype="text/plain">
<input class="form-control" value="" placeholder="Search Citra..." name="search" type="text">
</form>
</li>-->
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -0,0 +1,10 @@
<figure>
<img src="{{.Get "src"}}" {{ with .Get "alt" }}alt="{{ . }}"{{ end }} />
{{ with .Get "title" }}
<figcaption>
<h4>
{{ . }}
</h4>
</figcaption>
{{ end }}
</figure>

View File

@ -0,0 +1,3 @@
<table class="table">
{{ safeHTML (substr .Inner 7 -9) }}
</table>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

7
src/js/vendor/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

18
src/js/vendor/slick.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -75,7 +75,7 @@ a:hover {
padding-right: 56px; padding-right: 56px;
padding-left: 25px; padding-left: 25px;
width: 84px; width: 84px;
background: url('../images/name.png') no-repeat 50% 50%; background: url('../images/contentlogo.svg') no-repeat 50% 50%;
background-size: 64px; background-size: 64px;
} }
.navbar-default { .navbar-default {
@ -127,33 +127,37 @@ a:hover {
box-shadow: 0px 0px 30px 0px rgba(0, 0, 0, 0.15); box-shadow: 0px 0px 30px 0px rgba(0, 0, 0, 0.15);
overflow: hidden; overflow: hidden;
z-index: 2; z-index: 2;
background: #000;
} }
.carousel-inner .item { .carousel-inner .item {
overflow: hidden; overflow: hidden;
} }
.carousel-inner .item .article-image { .carousel-inner .item .article-image {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.carousel-caption { .carousel-caption {
text-align: left; text-align: left;
padding-bottom: 0px; padding: 0 10px 0;
height: 25px;
font-size: 12px; font-size: 14px;
left: 15px; left: 15px;
top: -12px; bottom: 460px;
}
.carousel-name { position: relative;
position: absolute;
top: 375px; z-index: 1010; // 10 more then slick
left: 50%;
margin-left: -62px; text-shadow: -2px 2px 3px rgba(0,0,0,1), -2px -2px 3px rgba(0,0,0,1), 2px -2px 3px rgba(0,0,0,1), 2px 2px 3px rgba(0,0,0,1);
z-index: 99; display: inline-block;
width: 125px;
height: 50px; max-width: 300px;
background: url('../images/name.png') no-repeat;
background-size: 100% auto;
} }
.carousel-content { .carousel-content {
position: absolute; position: absolute;
top: 440px; top: 440px;
@ -170,7 +174,7 @@ a:hover {
width: 100%; width: 100%;
height: 215px; height: 215px;
z-index: 3; z-index: 3;
background-image: url('../images/logo.png'); background-image: url('../images/logo.svg');
background-size: 215px 215px; background-size: 215px 215px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
@ -295,6 +299,15 @@ a:hover {
padding-top: 16px; padding-top: 16px;
} }
.entry-content figure {
padding: 20px 120px;
text-align: center;
}
.entry-content iframe {
padding: 20px 0;
}
/* Used for square boxes color coded */ /* Used for square boxes color coded */
.square-icon { float: left; margin-top: 2px; margin-right: 4px; width: 16px; height: 16px; background-color: black; } .square-icon { float: left; margin-top: 2px; margin-right: 4px; width: 16px; height: 16px; background-color: black; }

View File

@ -10,5 +10,6 @@ $headings-font-family: "Dosis";
$headings-color: #888; $headings-color: #888;
@import "./node_modules/bootstrap-sass/assets/stylesheets/bootstrap.scss"; @import "./node_modules/bootstrap-sass/assets/stylesheets/bootstrap.scss";
@import "vendor/slick.scss";
@import "citra-theme.scss"; @import "citra-theme.scss";
@import "citra-theme-media.scss"; @import "citra-theme-media.scss";

98
src/scss/vendor/slick.scss vendored Normal file
View File

@ -0,0 +1,98 @@
/* Slider */
.slick-slider {
position: relative;
display: block;
box-sizing: border-box;
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-ms-touch-action: pan-y;
touch-action: pan-y;
-webkit-tap-highlight-color: transparent;
}
.slick-list {
position: relative;
overflow: hidden;
display: block;
margin: 0;
padding: 0;
&:focus {
outline: none;
}
&.dragging {
cursor: pointer;
cursor: hand;
}
}
.slick-slider .slick-track,
.slick-slider .slick-list {
-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
-o-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
.slick-track {
position: relative;
left: 0;
top: 0;
display: block;
&:before,
&:after {
content: "";
display: table;
}
&:after {
clear: both;
}
.slick-loading & {
visibility: hidden;
}
}
.slick-slide {
float: left;
height: 100%;
min-height: 1px;
[dir="rtl"] & {
float: right;
}
img {
display: block;
}
&.slick-loading img {
display: none;
}
display: none;
&.dragging img {
pointer-events: none;
}
.slick-initialized & {
display: block;
}
.slick-loading & {
visibility: hidden;
}
.slick-vertical & {
display: block;
height: auto;
border: 1px solid transparent;
}
}
.slick-arrow.slick-hidden {
display: none;
}