The Dolphin Progress Report is not only about featuring high impact changes, but also smaller changes that do interesting things, changes with interesting stories behind them and more. This month has a ton of everything to offer. Dolphin is graced with a new graphical enhancement that will have games popping right out of the screen, a new way to accurately use native controllers, more MMU optimizations, graphics fixes, and even a few other surprises sprinkled in. Some of these changes made us regret running the Best Of blog entries mid-month; as they would have been shoe-ins to be featured!
With that, let's say goodbye to 2014 with a bang and take a look at some of the biggest changes that hit the emulator in December!
4.0-4441 - Fix Wii Disc Partitions by magumagu and ported by JosJuice¶
Six months ago, the blog teased a video showing the masterpieces from Super Smash Bros. Brawl working amongst other things thanks to magumagu's E-ticket Service Launch fixes. Even though this didn't fix the Masterpieces by itself, it was assumed that the simple Wii Disc Partition fix would be ported in within a couple of days.
That didn't happen, and the code was forgotten for quite some time as Dolphin moved forward without it. JosJuice finally stepped in and ported the feature forward so it finally could be merged into master.
This is unlikely to fix anything else aside from letting users see disc partitions beyond the first two in Dolphin's disc browser. For those that haven't seen the ES_Launch Preview and the Brawl Masterpieces working, the video has been re-embedded below.
This is a bit a complicated story involving self-inflicted wounds. Long story short is that many games, including popular titles like Sonic Colors, Sonic Unleashed, F-Zero GX and others, clipped things in the projection matrix slightly different than the emulator expected. Because Dolphin was originally off ever so slightly, that meant things like the UI and videos could be clipped, and thus not rendered, even though they render on console. This was fixed by adjusting Dolphin's projection matrix very, very slightly in the past, and that's how it works as of this build, but at lot ended up happening in-between that.
Donko adds a projection matrix epsilon. This was to make it match GameCube clipping tendencies.
Without any knowledge of why that code was added or if it was hardware tested, the projection matrix epsilon is removed. It is likely that the developers who removed it didn't notice if it broke any games right away.
After noticing a bunch of Sonic games among other titles not rendering their UIs, a hack is added for those particular games to make them work in Dolphin. This became known as the Sonic Unleashed hack.
neobrain removes the Sonic Unleashed hack in order to get people looking for a real solution.
After months of searching and testing, kayru stumbles upon the same solution that Donko did without even realizing it. With hardware tests backing up his data, the projection matrix epsilon is added back into Dolphin, fixing the Sonic Unleashed hack once and for all. Hopefully.
Fixes issues 6914
While crudelios and degasus respectively handled the software and OpenGL bounding box rewrites, D3D was still waiting. While Dolphin no longer has D3D9 in Master, the long-time D3D9 maintainer, TinoB still actively keeps up on Dolphin. Within a day or so of the OpenGL implementation of Bounding Box, he already had a D3D variant ready and working.
This change allowed degasus to finally merge the D3D and OpenGL bounding box implementations into one, making everything much cleaner and easier to work with in the future!
While working on the Dualcore NVIDIA Tegra K1 Denver in his Nexus 9, Sonicadvance1 realized that Dolphin was more or less using both cores to the very maximum. This would usually be a good thing, right?
Even though Dolphin is primarily a dualcore program (with some exceptions,) the operating system also has stuff it needs to do. With Dolphin maxing out all cores, the operating system wasn't able to do what it needed to do, and forced the OS to intrude on Dolphin's operations. On dualcore machines, it turned out that maxing out the video thread was slower than yielding to the CPU for the stuff it needs to do. This increases performance by 10% - 15% on dualcore computers/devices. Because Tri-core processors and higher had an extra thread to dump everything on already, they are completely unaffected by this change.
4.0-4587 - Enable Block-Linking on MMU by skid_au and 4.0-4650 - JIT: Use fastmem loads in MMU by magumagu¶
MMU titles have been getting a lot of love lately, and these two commits greatly speed up the MMU through use of features that once had to be disabled on them. skid_au and magumagu identified that even though SOME parts of Block-Linking and Fastmem can't work with the MMU, other parts of it can. By correctly implementing these features for the MMU and working around what they can't, the MMU sees a large speedup!
From the moment that it was announced, this was one of the most potentially game-changing accessories for Dolphin. When it hit, it was rife with shortages, and didn't natively work on PC (which was expected.) Thanks to reverse engineering work by shuffle2 and toadking, within a few days the adapter was functional on computers and drivers were coming.
While there are generic programs and drivers to get GameCube controllers working with any emulator, including Dolphin, skidau decided to take it to the next level, skipping over pretty much all of those steps.
He added native support for the GameCube Controller Adapter, which means that once it's setup all you need to do is have it plugged in, and Dolphin will auto-detect the adapter. This allows users to get 1:1 joystick input compared to the GameCube and Wii. No more wonky deadzones, no more messed up R/L triggers; everything will work just as it does on console without the hassle. Fortunately, F-Zero GX has a controller calibration test which lets us show how accurate various controller set ups are.
The only problem now is trying to get your hands on one.
This one amounts to a very simple oversight. EFB peeks are the game reading a pixel or pixels from the embedded framebuffer to gather data from it. Dolphin caches these in OpenGL to make them faster, and it allows things like Super Smash Bros. Brawl's wifi menu to run at reasonable speeds in the OpenGL backend.
The problem came in when OpenGL EFB pokes, or writes, were implemented, Dolphin ended up using the same caching for them and bad things happened.
By removing the caching on EFB pokes, everything works just fine now. But, there's actually more to this and no one is exactly sure why. D3D doesn't have an EFB peek cache, and thusly never ran into this issue. But it has its own strange issues with EFB pokes that no one can really explain. This ranges from minor annoyances to the downright strange.
Earlier this year, Armada651 embarked on a long quest to try and revitalize 3D support in Dolphin (more on this later.) This quest ended up taking him throughout the D3D and OpenGL backends, and forced him to change a lot about how they worked in order to support such a feature. One necessary change was implementing a unified geometry shader generator for OpenGL and D3D.
That may not sound exciting, but it actually opened up the door to level the playing field between the two backends. Previously, OpenGL did have direct support for line-width/point-size in the API, but most of those functions were old and deprecated. As such, it didn't work correctly. D3D on the other-hand has never supported this feature whatsoever and another solution was thought up way back in 2011. Nolan Check ended up implementing a geometry shader that converted line-width/point-size effects into polygons that could be easily rendered in D3D.
With a unified geometry shader, all Armada651 had to do was convert the old algorithm to use the new geometry shader. Once that was done, OpenGL and D3D would be using the same generator for the line-width and point-size effects. This makes tracking down and fixing bugs easier, while the unification also weeds out some minor bugs.
It's been no secret that a lot of work has been done on the internals of the emulator in preparation for a huge addition to Dolphin's enhancements. Shaders have been retooled, backends reorganized, and tons of side work has been done to prepare the emulator for this moment. In the same vein as increasing the internal resolution, we're proud to announce support for Stereoscopic 3D.
Long-time users may remember this feature from way back when in the form of anaglyph 3D and NVIDIA 3D support. They will also remember the features not working very well, causing tons of issues, and generally not being worth the trouble. While those implementations may have been cool for the time, they lacked key elements.
NVIDIA 3D support was handled by the driver, and thusly couldn't adjust to some of the more particular needs of Dolphin.
Anaglyph 3D takes out a lot of the color and clarity of playing these games. Most users would choose crystal clear HD over washed out 3D.
3D wasn't as well understood then as it is now. The old implementation didn't provide very good depth in D3D9, and it provided absolutely no depth in OpenGL!
The old anaglyph/stereo 3D options cut the framerate in half; splitting the frames for each eye. Turning on 3D essentially meant having frame-skipping on.
The unified geometry shader generator that Armada651 implemented actually works around a lot of those problems. By using a geometry shader Dolphin can handle 3D stereoscopy internally without the need to rely on drivers. And unlike the old internal support, the new 3D system does not need to sacrifice framerate, color quality or anything else that could get in the way of the user's viewing experience. It can be used alongside most other enhancements without any issues whatsoever. The only time stereoscopy explicitly is not supported is in titles that require the RealXFB option.
The higher compatibility is merely a side-effect of the more careful and advanced implementation of the feature. It completely surpasses the old hacks in every single manner. OpenGL and D3D are both supported. That means any operating system that can run Dolphin can access the Stereo 3D features. Windows, Linux, Mac, and even Android! Any screen that supports Side-by-side or Top-and-Bottom will work out of the box. And even though NVIDIA 3D uses its own way of communicating with 3D Vision monitors, Dolphin has a specific mode that lets the emulator interface with NVIDIA 3D to output to their specialized 3D setups to maintain higher compatibility. For those on the cheap or just curious, a better Anaglyph 3D option has been added as well, which supports all of the depth and features of our new 3D Enhancement.
This feature would have little point if the games themselves didn't take advantage of it. Just because they weren't designed to be played in 3D doesn't mean they aren't absolutely stunning in it. In fact, it seems to be quite the opposite.
There simply aren't enough words to describe how visceral F-Zero GX feels in high definition alongside 3D, racing at a flawless 60 frames per second. The sensory overload with the massive tracks given true depth is something to behold. Beautiful platformers like Super Mario Galaxy 2 constantly astound with massive galaxies floating aimlessly through space like shooting stars. Metroid Prime lets you take on the role of Samus Aran and explore at the eerie world of Tallon IV just as she would have seen it with her own eyes. And what more can be said about The Legend of Zelda: The Wind Waker? One of the most gorgeous GameCube games, its vivid world makes a nearly flawless transition into 3D. Just watch as the wind blows through the screen as Link sail's the Great Sea in this ocean epic.