How recent Unity games do stuff, and a new GeDoSaTo version

Dreamfall Chapters: Book 1 was just released (go buy it), and it’s another game using the Unity engine. Like with another recent Unity title, Wasteland 2, it refused to work with GeDoSaTo. Now, since I like both of these games a lot I invested some time to find out what’s happening, and hopefully fix it.

Without further ado, here are my findings. This is what recent Unity engine games do on Windows if you select “fullscreen” mode. Note that all of this is based on deduction from the behaviour of Dreamfall and Wasteland 2, someone with access to the Unity source probably has a more exact understanding:

  1. Check the desktop resolution and create a fullscreen window as well as a DirectX device with that size.
  2. Check the native monitor resolution (using GetMonitorInfo), and reset the device/window to that size.
  3. Render at whatever resolution you specify in the game settings, to an off-screen surface.
  4. Stretch that surface to the window.

So, no real fullscreen mode in sight. Why would you do this? Well, it has multiple advantages: you don’t lose your resources switching to another rendering resolution, alt-tab behaviour is much faster and more stable, and you get free, correctly implemented triple buffering if the user is using Aero.

Obviously, this majorly messed up the way GeDoSaTo works — and the same goes for traditional downsampling methods. In the latest version, it’s now possible to downsample Unity games following this scheme, provided you add this magic formula to their configuration file:

It works by “pretending” that both the desktop and monitor are the given renderResolution in size, forcing that to always be reported, and modifying the mouse cursor position used by the game (so that clicks register correctly). GeDoSaTo takes care of actually constraining the fullscreen window to the correct size, and of course performs a high-quality downsampling of the rendering result as always.

Since the resolution you want to downsample from needs to be known before the game requests any, only a single rendering resolution can be provided.

Cursor Sidenote

Already in earlier versions, a problem in games using windowed modes was that custom cursors would be lost outside of the rectangular region corresponding to portion of the screen that would be taken up by a window downscaled by the downsampling factor. I figured out why this happens: To make games work, the cursor positions reported to them need to be adjusted (modifyGetCursorPos). This works for any processing within the game, as it thinks it is operating within a larger rendering area.

However, an issue occurs for cursors: I found out that many/most games use the Windows API WindowFromPoint function to check if the mouse is within their window before setting the cursor, passing the modified coordinates. Now obviously, Windows knows what the real window sizes are, and the modified virtual coordinates fall out of them. So I had to apply the reverse transformation in that function.

Release

Anyway, the new version is called “Tokikagura”. Other than the stuff discussed above it also includes some GeDoSaToTool fixes.

As always, grab the installer here or simply update, and if you want to you can donate here.

By the way, Nvidia’s DSR can’t downsample in these games (for now). Take that big boy corporate version!

FF13 micro-update

Another small update to fix some reported issues:

  • Fixed lack of postprocessing when disabling HuD
  • Fixed crash on alt-tab (again)

The latter took a lot more time to figure out than I expected. It seems that the game is actually leaking a backbuffer reference :/

About texture dumping/replacement: After getting the current GeDoSaTo facilities to work (more or less) on FF13, I figured out that most interesting textures (e.g. the fonts) aren’t actually being loaded using D3DX, so the existing mechanisms don’t help at all. I have a different method in mind (for a long time now actually), but this will take some time to implement.

Talking about time, what I wrote about on the blog a few days ago regarding not really having any time due to “real world” workloads applies now even more than before — after I spent basically the entire weekend on FF13. Therefore, don’t expect updates from me until next weekend.

That said, I’ve seen a lot of new forks at GitHub, so perhaps someone will make some contributions! I’ll try to merge good additions as quickly as possible if there are any.
As always, you can use the installer here to get the latest version (or just press the update button!), and you can donate here.

Small FF13 Updates MK2

I just pushed a new version once again, with these improvements/additions:

  • Added shadow scale option (increases shadow resolution)
  • Added settings for the number of MSAA samples and coverage sampling (that is, CSAA or EQAA depending on your GPU)
  • Mitigated issues with large screenshots (taking a screenshot should never crash now, but it might still fail at very high resolutions or settings – it will report that failure though)
  • Changed scaling order, fixes some sharpness issues

A few words on performance, according to my testing: Starting from a base setting of 3840×2160 with bicubic scaling at 60 FPS I get a GPU usage of 66% on my 770.

Increasing shadow scaling to 4 gives a very marginal increase to 67% (basically free on my system). Setting it to 8 goes up to 70%.

Going from the default 4xMSAA to 16xCSAA increases GPU usage from the 66% base to 70%. Worth it in my opinion. 32xCSAA (that is, 8 MSAA samples + coverage AA) goes up to 80% and the improvement is debatable.

As always, you can use the installer here to get the latest version (or just press the update button!), and you can donate here.

Small FF13 Updates

There’s a new version of GeDoSaTo with a new FF13 plugin up now. It includes these improvements:

  • Fixed crash on Alt-tab
  • Fixed all known instances of cut-offs (including e.g. items and settings) without introducing artifacts
  • Fixed AMD user issues and minimap (thanks to Garteal for investigating this!)

I’ll do a more in-depth look into the screenshot issues and the problems with texture dumping/replacement tomorrow, I really want to get a high-res font replacement.

Also, I did some initial experiments with increasing shadow resolution. Sadly, without also improving the filtering quality that doesn’t help all that much. And improving the filtering quality would require reverse engineering and replacing the shadow rendering shader, which is a longer task, so I’ve put it towards the back of the queue for now.

Anyway, as always, you can use the installer here to get the latest version (or just press the update button!), and you can donate here.

GeDoSaTo Beta 0.14 “Barrage am Ring”

I’ll shortly release a new version of GeDoSaTo, which includes a pre-alpha version of a custom plugin for Final Fantasy XIII. Its current features are:

  • Arbitrary rendering and presentation resolutions (only 16:9 though)
  • HUD hiding (using the normal GeDoSaTo keybindings)

It’s bugs and known issues are:

  • Some off-by-a-bit scaling issues, making the output less sharp than it should be in some circumstances
  • DoF effects are unchanged (still at original, low resolution – this is more apparent in contrast to higher resolutions)
  • Probably some stuff somewhere is cut off. I saw some scissor calls and am not dealing with them yet
  • Crashes when taking screenshots using GeDoSaTo
  • Rendering resolutions larger than 3840×2160 don’t work
  • Probably lots more

Some observations:

  • The game performs really well from what I’ve seen, both GPU and CPU-wise. But their frame limiting/pacing stuff sometimes seems to bug out.

Tons of stuff can still be improved — obvious ones like fixing bugs and the DoF, but also e.g. probably shadow resolution — so if you like this work and want it to continue consider donating.

Of course, I’d also really appreciate any development or debugging contributions. As always, the source is on Github.

You can download the installer from here, it will automatically grab the latest version.

Don’t report bugs in the comments, report them on GitHub (and check for duplicates or if they are known issues).

Article about PC Game Features, Development Updates

An article I wrote for PC Gamer has now come online:

The features PC gamers want — an open letter to developers and gamers

I really liked the idea for this article when I was first approached about writing it. While writing, I turned it from something addressed mostly at developers into also trying to make gamers understand the cost of features and how to interpret comparative performance across games.

The final article is about 50% longer than initially planned, but I still missed at least two important features, which I will shortly discuss here. I’d add those to the “important” category.

  • Audio support: Just like with display devices, people use a lot of different audio setups on their PCs, both in terms of output and in terms of processing. Decent positional audio should be supported for at least the common speaker configurations and headphones.
  • Custom Server Hosting / Server Browsers: For online games, supporting match-making is nice, but it should never be the only option in a PC game. Traditionally, PC games which offer the option to host custom servers and browse servers by various criteria have a much longer active online life and foster a stronger sense of community.

One thing I did certainly not expect is to get feedback from some developers within a few hours of the article going live. I know of at least three who are forwarding it to the relevant parts of their team (some having it translated even), and others have said that it’s nice to have something “official” (even if it’s just an article) to show the decision makers when discussing PC features. This is honestly already a much better outcome than I had expected!

Development on GeDoSaTo and PtBi

As some of you might have noticed, development on these projects has slowed down considerably over the past few weeks. This is primarily due to my “real world” work load, which has increased significantly due to the unfortunate confluence of the semester starting in October here (teaching), paper deadlines (research), and project proposals in-flight (shit).

I still try to merge external contributions to both projects regularly, so please help out if you can. My own situation should normalize somewhat in November, and allow me to work on them once again. (By the way, I actually wrote most of the article discussed above roughly two weeks ago)

Nvidia “Dynamic Super Resolution”

It looks like Nvidia has been implementing real driver support for higher-quality downsampling:

They have a much nicer name for it – Dynamic Super Resolution – even though I still don’t see what exactly is dynamic about it. If you read their description, it does sound like it sets out to fix many of the issues I also tried to circumvent when I first started working on GeDoSaTo:

Enthusiasts with compatible monitors and technical knowledge refer to this process as Downsampling, and for some time they’ve been applying a basic version to improve fidelity in games. DSR improves upon this process by applying a high-quality Downsampling filter that significantly improves image quality, by making Downsampling compatible with all monitors, by removing the need for technical know-how, and by integrating DSR into GeForce Experience, enabling gamers to apply DSR Optimal Playable Settings with a single click.

Improving downsampling quality and making it independent from monitor hardware compatibility have always been two of the most essential goals of GeDoSaTo. Obviously, with driver integration you are also in a position to make things much easier for non-technical users, something which was never a real target for GeDoSaTo.

However, the largest advantages of a driver-based method are the following:

  • Compatibility - since you can act after the 3D API, and not on its level, you get compatibility with any API, including all versions of DirectX and OpenGL.
  • Input Independence – a lot of the hard parts both in writing GeDoSaTo and in configuring it come with making mouse input work, since the OS knows it’s actually running at resolution X while the game thinks it’s running at Y. When operating on the driver level, OS and applications will be on the same page again, removing a major source of issues and need for implementation work.

These are things which are far harder to achieve in GeDoSaTo, and will likely never be possible on the same level.

Nonetheless, GeDoSaTo has evolved a lot from its initial role as just a downsampling tool, with HuD-less screenshot taking, postprocessing, texture replacement and other features taking a major role. Also, it seems like, at least for now, it will remain the only option for larger than 2×2 downsampling. And of course, it will always be more highly configurable – and obviously less vendor dependent – than a driver tool.

In any case, I’m really happy that high-quality downsampling is finally acknowledged by a hardware vendor (and, if history is any indication, it won’t be too long before AMD catches up). And I’m even happier to think that perhaps the reason it happened now is at least partly because of GeDoSaTo.

GeDoSaTo shader development features, Dark Souls 2 SSAO improvements

I just pushed an update to GeDoSaTo which makes it significantly easier to work on shaders and effects (i.e. downsampling, SSAO, postprocessing). It’s now possible to bind a key for reloading shaders. The magic thing however, and what really saves time, is that if loading the new shader fails the old one will continue to be used instead, and the error will be reported:

screenshot_2014-08-23_14-58-34_0This really saves a lot of time restarting games. My workflow is now to have the game running in a window in the corner of the screen, and have Visual Studio take up the other half. This way, I can make changes to the shader and see the result in-game in about 3 seconds. It’s not a GUI, but it’s much more flexible and almost as fast in terms of iteration.

To prove the claim that this makes shader development much easier, I set out to improve GeDoSaTo’s SSAO. While better than the built-in monstrosity, this was never really high quality, particularly considering its performance impact. Well, it’s a whole lot better now:

_prev _curThat’s the old version on top and the new one in the bottom. Look in particular at the detail in the distance, the lack of pixelation on the grass, the much better definition on objects like the staircase and the lack of polygonal artifacts on the floor.

Now, you might ask “But Durante, the AO was already really heavy, can I really afford to run the new version performance-wise?”. The answer is yes, absolutely. For the result shown above, the previous version took around 9 ms of GPU time on my 770. The new one takes 4.8 ms.  If you’re keeping track, that’s almost twice as fast as previously. While also looking better, and sporting fewer artifacts.

You can get the new version right now with the updater.

Oh, one more thing. Since someone asked in a donation message: yes, I do read all the donation messages :P

GeDoSaTo User Setting Profiles

While automatic updating seems to work out fine now, it introduces an issue for everyone who is not me: you have to recreate/restore your settings and keybindings every time you update. This sucks.

Therefore, the latest version introduces user profiles for both settings and keybindings. What does this mean? User profiles allow you to store settings and/or keybindings in additional _user files, which do not get distributed with GeDoSaTo and therefore persist across updates.

The loading for settings files and keybindings now proceeds like this:

configSo global user configuration extends/overrides the default configuration, is in turn overridden by game-specific configuration if it is available, which is finally extended by user game-specific configuration. This should hopefully let everyone do exactly what they want.

And even though I hate writing UIs, I even made a nice UI for managing profiles and user profiles:

settings2The “U” button creates a user profile (or switches to it if it already exists), the “+” creates a new profile and the “-” deletes the current file (and cleans up the directory if it’s empty afterwards).

The filter allows you to filter profiles shown in the selection with substring matching, so e.g. “Risen” will only show you profiles for Risen. I think this will get more relevant now with more people contributing profiles.

If you enjoy this update and want to support me doing boring stuff like UI for your convenience, you can always donate here. And of course, you can get the most recent GeDoSaTo version either by using the built-in updater, or by installing it from here.

GeDoSaTo Distribution Changes Mark II

Sadly the new method didn’t really work out all that well for many people, so I made everything automatic and as foolproof/convenient as I can:

updaterPlease go to the new GeDoSaTo page to learn more.

GeDoSaTo should now be supremely easy to install and keep up to date for everyone!

In the future, I’ll do blog updates about GeDoSaTo whenever there is a new interesting feature, but without an accompanying release, as it should now be very easy for everyone to always get the latest version.