Merge pull request #50 from j-selby/fix-stuff
Blog post + home page changes
This commit is contained in:
commit
fc83484d77
|
@ -150,6 +150,7 @@ gulp.task('final:serve', function() {
|
|||
gulp.watch('src/js/**/*', ['assets:js']);
|
||||
gulp.watch('src/scss/**/*', ['assets:scss']);
|
||||
gulp.watch('site/**/*.html', ['hugo']);
|
||||
gulp.watch('site/**/*.md', ['hugo']);
|
||||
|
||||
gulp.watch('build/**/*').on('change', fileChange);
|
||||
});
|
||||
|
|
|
@ -7,17 +7,23 @@ coauthor = "jroweboy"
|
|||
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.
|
||||
But, emulator development can be a slow, arduous process as new changes can bring big regressions and problems with the much wanted new features.
|
||||
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.
|
||||
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!
|
||||
These builds will contain experimental features and changes designed to give the absolute fastest builds with the most 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.
|
||||
These builds will contain experimental features and changes designed to give the absolute fastest builds with the most
|
||||
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 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.
|
||||
|
|
|
@ -6,15 +6,38 @@ author = "bunnei"
|
|||
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
|
||||
|
||||
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...
|
||||
<br></br>
|
||||
|
@ -22,18 +45,45 @@ Until one day...
|
|||
{{< img src="entry/citra-progress-report-2015-p1/image01.png" center="true" >}}
|
||||
|
||||
<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 isn’t just a matter of being able to execute the game’s 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 isn’t just a matter
|
||||
of being able to execute the game’s 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" >}}
|
||||
<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 >}}
|
||||
<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.
|
||||
|
|
|
@ -6,26 +6,49 @@ author = "bunnei"
|
|||
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
|
||||
|
||||
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 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.
|
||||
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.
|
||||
|
||||
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, Citra’s 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, Citra’s 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 >}}
|
||||
|
||||
## 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" >}}
|
||||
|
||||
|
@ -48,57 +71,112 @@ forum = 36
|
|||
{{< img src="entry/citra-progress-report-2015-p2/earlyfireemblem.png" center="true" >}}
|
||||
|
||||
<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" >}}
|
||||
<p style="text-align: center;">Bravely Default's intro sequence relies on MOFLEX video support <br></br>
|
||||
{{< figure src="/images/entry/citra-progress-report-2015-p2/3.png"
|
||||
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: Citra’s emulation of 3DS vertex shaders. With emulators like Dolphin and PPSSPP, your GPU uses shaders to emulate the target system’s 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: Citra’s emulation of 3DS vertex shaders. With emulators like Dolphin and
|
||||
PPSSPP, your GPU uses shaders to emulate the target system’s 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 >}}
|
||||
|
||||
## 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" >}}
|
||||
<p style="text-align: center;"> An early fragment lighting demo running in Citra <br></br>
|
||||
{{< figure src="/images/entry/citra-progress-report-2015-p2/rotatecube.gif"
|
||||
alt="Fragment shader test"
|
||||
title="An early fragment lighting demo running in Citra" >}}
|
||||
|
||||
Despite that it’s not a fully complete implementation of fragment lighting, the results have significantly improved Citra’s visuals!
|
||||
Despite that it’s not a fully complete implementation of fragment lighting, the results have significantly improved
|
||||
Citra’s visuals!
|
||||
|
||||
<div class="row" style="margin-top:3em; margin-bottom:1em;">
|
||||
<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;" />
|
||||
It's a super moon!
|
||||
</div>
|
||||
{{< figure src="/images/entry/citra-progress-report-2015-p2/moonbefore.png"
|
||||
title="It's a super moon!" >}}
|
||||
|
||||
{{< figure src="/images/entry/citra-progress-report-2015-p2/moonafter.png"
|
||||
title="With fragment lighting implemented, the moon became even scarier! H-hurray?" >}}
|
||||
|
||||
<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;" />
|
||||
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.
|
||||
<br></br>
|
||||
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.
|
||||
|
||||
{{< youtube 30NwGUYmIpU >}}
|
||||
|
||||
## 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!
|
||||
* [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!
|
||||
* [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
|
||||
* [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
|
||||
* [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!
|
||||
* [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!
|
||||
* [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.
|
||||
* [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
|
||||
|
||||
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, that’s just not reasonable to do in one article – so instead I’d 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 can’t 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, that’s just not reasonable to do in one
|
||||
article – so instead I’d 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 can’t wait to see what you guys bring for 2016!
|
||||
|
|
|
@ -6,98 +6,162 @@ author = "jmc47"
|
|||
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!
|
||||
|
||||
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!
|
||||
|
||||
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!
|
||||
|
||||
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 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.
|
||||
|
||||
<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;" />
|
||||
|
||||
<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.
|
||||
[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.
|
||||
|
||||
{{< 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)
|
||||
|
||||
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.
|
||||
|
||||
[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.
|
||||
|
||||
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.
|
||||
|
||||
[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)
|
||||
|
||||
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:
|
||||
|
||||
<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;" />
|
||||
|
||||
<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.
|
||||
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:
|
||||
|
||||
{{< figure src="/images/entry/citra-progress-report-2016-p1/albwbefore.png" >}}
|
||||
|
||||
{{< 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)
|
||||
|
||||
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;" />
|
||||
|
||||
<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.
|
||||
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.
|
||||
|
||||
{{< figure src="/images/entry/citra-progress-report-2016-p1/smashbrosbefore.jpg"
|
||||
title="Pikachu has seen better days." >}}
|
||||
|
||||
{{< 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)
|
||||
|
||||
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)
|
||||
|
||||
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)
|
||||
|
||||
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:
|
||||
|
||||
<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)
|
||||
|
||||
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
|
||||
|
||||
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&to=2016-04-19&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&to=2016-04-19&type=c)
|
||||
since our last progress report, you guys rock!
|
||||
|
|
|
@ -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.
|
||||
|
||||
<p style="text-align: center; font-size: small; padding: 1%">
|
||||
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Mario & 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" />
|
||||
<br />
|
||||
{{< figure src="/images/entry/citra-progress-report-2017-june/paper-jam-foam.png" title="Look at that beautiful sea foam. ❤"
|
||||
alt="Mario & Luigi: Paper Jam's intro cutscene, showing Peach's castle, and the sea behind it" >}}
|
||||
|
||||
<!--
|
||||
title_id = 0004000000132700
|
||||
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)
|
||||
|
||||
|
@ -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.
|
||||
|
||||
<p style="text-align: center; font-size: small; padding: 1%">
|
||||
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Kyogre in Pokémon Alpha Sapphire before the fix." src="/images/entry/citra-progress-report-2017-june/lut-fix-before.png" />
|
||||
<br />
|
||||
{{< figure src="/images/entry/citra-progress-report-2017-june/lut-fix-before.png" title="Kyogre seems to have a bit of a skin blemish."
|
||||
alt="Kyogre in Pokémon Alpha Sapphire before the fix." >}}
|
||||
|
||||
<!--
|
||||
title_id = 000400000011c500
|
||||
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.
|
||||
|
||||
<p style="text-align: center; font-size: small; padding: 1%">
|
||||
<img style="padding: 0% 0% 1% 0%" height="75%" width="75%" alt="Kyogre in Pokémon Alpha Sapphire after the fix." src="/images/entry/citra-progress-report-2017-june/lut-fix-after.png" />
|
||||
<br />
|
||||
{{< figure src="/images/entry/citra-progress-report-2017-june/lut-fix-after.png" title="Much better, guess the lighting got an acne treatment."
|
||||
alt="Kyogre in Pokémon Alpha Sapphire after the fix." >}}
|
||||
|
||||
<!--
|
||||
title_id = 000400000011c500
|
||||
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)
|
||||
|
||||
|
@ -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.
|
||||
|
||||
<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
|
||||
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
|
||||
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)
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
<p style="text-align: center;">
|
||||
<img alt="" src="/images/entry/citra-progress-report-2017-p1/acnl-bridge.png" />
|
||||
Shouldn't there be a bridge here?
|
||||
</p>
|
||||
{{< figure src="/images/entry/citra-progress-report-2017-p1/acnl-bridge.png" title="Shouldn't there be a bridge here?" alt="Animal Crossing bridge" >}}
|
||||
|
||||
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.
|
||||
|
||||
|
|
|
@ -6,12 +6,24 @@ author = "saphiresurf"
|
|||
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!
|
||||
|
||||
[Check Out The Compatibility List Here] (https://citra-emu.org/game/)
|
||||
[Check Out The Compatibility List Here](https://citra-emu.org/game/)
|
||||
|
|
|
@ -6,39 +6,65 @@ author = "merrymage"
|
|||
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 >}}
|
||||
|
||||
## **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 >}}
|
||||
<br></br>
|
||||
|
||||
MerryMage had raw audio output working but she still didn’t 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 didn’t 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.
|
||||
|
||||
## **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!
|
||||
|
|
|
@ -5,24 +5,31 @@ author = "thekoopakingdom"
|
|||
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.
|
||||
<br></br>
|
||||
1. Press Windows + R, type `explorer %localappdata%`, this should bring up a Windows Explorer window in a `Local`
|
||||
folder. Navigate to the `citra` folder.
|
||||
|
||||
{{< 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.
|
||||
<br></br>
|
||||
2. Navigate to the `app-x.x.x` folder with the highest version number.
|
||||
|
||||
{{< 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.
|
||||
|
|
|
@ -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:
|
||||
|
||||
<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%;">
|
||||
<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" />
|
||||
<br />
|
||||
Then, head into the "Web" tab.
|
||||
</p>
|
||||
{{< figure src="/images/entry/telemetry-and-why-thats-a-good-thing/optout1.png"
|
||||
alt="Alt, E, C"
|
||||
title="First, head to the Citra \"Emulation\" → \"Configure...\" menu." >}}
|
||||
|
||||
<p style="text-align: center; padding: 1%;">
|
||||
<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" />
|
||||
<br />
|
||||
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/optout2.png"
|
||||
alt="Right arrow, Right arrow, Right arrow, Right arrow, Right arrow, Right arrow, Right arrow"
|
||||
title="Then, head into the \"Web\" tab." >}}
|
||||
|
||||
{{< 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
|
||||
is an identifier generated randomly on install which is used instead of your IP
|
||||
|
|
|
@ -7,7 +7,11 @@ coauthor = "tfarley"
|
|||
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 >}}
|
||||
|
||||
|
@ -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.
|
||||
|
||||
{{< img src="entry/texture-forwarding-brings-hd-output-to-citra/citra-texture-forwarding.png" width="481px" height="367px" center="true" >}}
|
||||
<br></br>
|
||||
{{< figure src="/images/entry/texture-forwarding-brings-hd-output-to-citra/citra-texture-forwarding.png" >}}
|
||||
|
||||
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.
|
||||
<br></br>
|
||||
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.
|
||||
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.
|
||||
|
||||
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).
|
||||
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).
|
||||
|
|
|
@ -7,6 +7,12 @@ coauthor = "flamboyant_ham"
|
|||
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!
|
||||
|
|
|
@ -5,19 +5,21 @@ author = "thekoopakingdom"
|
|||
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).
|
||||
|
||||
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:
|
||||
|
||||
* #read-first - A read-only introduction to the server, and announcements.
|
||||
* #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.**
|
||||
* #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.
|
||||
* \#read-first - A read-only introduction to the server, and announcements.
|
||||
* \#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.**
|
||||
* \#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.
|
||||
|
||||
The [Citra](https://citra-emu.org/rules/) Community Rules also apply to this server.
|
||||
|
||||
|
|
|
@ -5,28 +5,32 @@ author = "flamesage"
|
|||
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!
|
||||
|
||||
**[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!
|
||||
|
||||
|
||||
**[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!
|
||||
|
||||
{{< 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.
|
||||
|
|
|
@ -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:
|
||||
|
||||
**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!
|
||||
|
|
|
@ -23,13 +23,12 @@
|
|||
<link href="{{ .Site.BaseURL }}/index.xml" rel="feed" type="application/rss+xml" title="{{ .Site.Title }}" />
|
||||
{{ end }}
|
||||
|
||||
<title>{{- if .IsHome }}Homepage{{- else }}{{ .Title }}{{- end }} | {{ .Site.Title }} | Nintendo 3DS Emulator</title>
|
||||
<link href="https://fonts.googleapis.com/css?family=Ubuntu" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css?family=Dosis" rel="stylesheet">
|
||||
<title>{{- if not .IsHome }}{{ .Title }} - {{ .Site.Title }}{{- else }}{{ .Site.Title }} - Nintendo 3DS Emulator{{- end }}</title>
|
||||
<link href="https://fonts.googleapis.com/css?family=Ubuntu|Dosis" rel="stylesheet">
|
||||
<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/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"
|
||||
integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
|
||||
|
||||
{{ if eq (getenv "HUGO_ENV") "PRD" }}
|
||||
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
|
||||
|
@ -114,8 +113,8 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{{ block "scripts" . }}{{ end }}
|
||||
<script src="{{ .Site.BaseURL }}/js/script.js"></script>
|
||||
{{ block "scripts" . }}{{ end }}
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
|
@ -14,6 +14,13 @@
|
|||
|
||||
{{ define "scripts" }}
|
||||
<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>
|
||||
{{ end }}
|
||||
|
|
|
@ -7,23 +7,29 @@
|
|||
<div id="carousel" class="carousel slide" data-ride="carousel">
|
||||
|
||||
<!-- Wrapper for slides -->
|
||||
<div class="carousel-inner">
|
||||
<div id="carousel-inner" class="carousel-inner">
|
||||
{{ $jumbotronFiles := readDir "/static/images/jumbotron/" }}
|
||||
{{ range $index, $element := $jumbotronFiles }}
|
||||
{{ $fileTitle := (index (split .Name "-") 1) }}
|
||||
{{ $fileTitle := (index (split $fileTitle ".") 0) }}
|
||||
<div class="item {{if eq $index 0}}active{{end}}">
|
||||
<img class="article-image img-responsive center-block" src="/images/jumbotron{{ $element.Name | relURL }}" alt="...">
|
||||
<div>
|
||||
<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>
|
||||
{{ end }}
|
||||
</div>
|
||||
|
||||
<!-- 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>
|
||||
</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>
|
||||
</a>
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
<nav class="navbar navbar-default navbar-wrapper navbar-fixed-top">
|
||||
<div class="container">
|
||||
<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="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
|
@ -9,34 +10,42 @@
|
|||
</button>
|
||||
<a class="navbar-brand" href="/"> </a>
|
||||
</div>
|
||||
|
||||
<div id="navbar" class="navbar-collapse collapse">
|
||||
<ul class="nav navbar-nav">
|
||||
<li class="index-1 first"><a href="/" title="" class="">Blog</a></li>
|
||||
<li class="index-2"><a href="/download/" title="" class="">Download</a></li>
|
||||
<li class="index-3"><a href="/wiki/home/" title="" class="">Wiki</a></li>
|
||||
<li class="index-4"><a href="/wiki/faq/" title="" class="">FAQ</a></li>
|
||||
<li class="index-5"><a href="/game/" title="" class="">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-1 first"><a href="/" title="Blog Posts">Blog</a></li>
|
||||
<li class="index-2"><a href="/download/" title="Download Citra">Download</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="Frequently Asked Questions">FAQ</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>
|
||||
|
||||
<ul class="dropdown-menu">
|
||||
<li class="index-1 first"><a href="/rules/" title="" class="">Rules</a></li>
|
||||
<li class="index-2"><a href="https://community.citra-emu.org/" title="" class="">Community Forums</a></li>
|
||||
<li class="index-3 last"><a href="/discord/" title="" class="">Discord Chat</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="Forums">Community Forums</a></li>
|
||||
<li class="index-3 last"><a href="/discord/" title="Discord Channel">Discord Chat</a></li>
|
||||
</ul>
|
||||
</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">
|
||||
<li class="index-1 first"><a href="/screenshots/" title="" class="">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-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="Youtube Channel">Videos</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="index-8 last"><a href="/donate/" title="" class="">Donate</a></li>
|
||||
</ul>
|
||||
<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>-->
|
||||
|
||||
<li class="index-8 last"><a href="/donate/" title="Donate to Citra">Donate</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
<figure>
|
||||
<img src="{{.Get "src"}}" {{ with .Get "alt" }}alt="{{ . }}"{{ end }} />
|
||||
{{ with .Get "title" }}
|
||||
<figcaption>
|
||||
<h4>
|
||||
{{ . }}
|
||||
</h4>
|
||||
</figcaption>
|
||||
{{ end }}
|
||||
</figure>
|
|
@ -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 |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -75,7 +75,7 @@ a:hover {
|
|||
padding-right: 56px;
|
||||
padding-left: 25px;
|
||||
width: 84px;
|
||||
background: url('../images/name.png') no-repeat 50% 50%;
|
||||
background: url('../images/contentlogo.svg') no-repeat 50% 50%;
|
||||
background-size: 64px;
|
||||
}
|
||||
.navbar-default {
|
||||
|
@ -127,33 +127,37 @@ a:hover {
|
|||
box-shadow: 0px 0px 30px 0px rgba(0, 0, 0, 0.15);
|
||||
overflow: hidden;
|
||||
z-index: 2;
|
||||
background: #000;
|
||||
}
|
||||
|
||||
.carousel-inner .item {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.carousel-inner .item .article-image {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.carousel-caption {
|
||||
text-align: left;
|
||||
padding-bottom: 0px;
|
||||
height: 25px;
|
||||
font-size: 12px;
|
||||
padding: 0 10px 0;
|
||||
|
||||
font-size: 14px;
|
||||
|
||||
left: 15px;
|
||||
top: -12px;
|
||||
}
|
||||
.carousel-name {
|
||||
position: absolute;
|
||||
top: 375px;
|
||||
left: 50%;
|
||||
margin-left: -62px;
|
||||
z-index: 99;
|
||||
width: 125px;
|
||||
height: 50px;
|
||||
background: url('../images/name.png') no-repeat;
|
||||
background-size: 100% auto;
|
||||
bottom: 460px;
|
||||
|
||||
position: relative;
|
||||
|
||||
z-index: 1010; // 10 more then slick
|
||||
|
||||
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);
|
||||
display: inline-block;
|
||||
|
||||
max-width: 300px;
|
||||
}
|
||||
|
||||
.carousel-content {
|
||||
position: absolute;
|
||||
top: 440px;
|
||||
|
@ -170,7 +174,7 @@ a:hover {
|
|||
width: 100%;
|
||||
height: 215px;
|
||||
z-index: 3;
|
||||
background-image: url('../images/logo.png');
|
||||
background-image: url('../images/logo.svg');
|
||||
background-size: 215px 215px;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
|
@ -295,6 +299,15 @@ a:hover {
|
|||
padding-top: 16px;
|
||||
}
|
||||
|
||||
.entry-content figure {
|
||||
padding: 20px 120px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.entry-content iframe {
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
/* Used for square boxes color coded */
|
||||
.square-icon { float: left; margin-top: 2px; margin-right: 4px; width: 16px; height: 16px; background-color: black; }
|
||||
|
||||
|
|
|
@ -10,5 +10,6 @@ $headings-font-family: "Dosis";
|
|||
$headings-color: #888;
|
||||
|
||||
@import "./node_modules/bootstrap-sass/assets/stylesheets/bootstrap.scss";
|
||||
@import "vendor/slick.scss";
|
||||
@import "citra-theme.scss";
|
||||
@import "citra-theme-media.scss";
|
||||
|
|
|
@ -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;
|
||||
}
|
Reference in New Issue