Last year at GDC 2014, we announced DirectX 12. Since then, we have made amazing progress, and we were excited to showcase this progress at GDC 2015.
At the GDC 2015 Expo, we had a range of live demos including Lionhead Studio’s next beautiful game Fable Legends, Epic Games’ Unreal Engine 4, Unity Technologies’ 3D game engine, Futuremark’s “Farandole” performance benchmark, and Oxide Games’ new game Ashes of the Singularity; all running using DirectX 12 on all the PC hardware you care about: AMD, Intel, and NVIDIA.
To help developers get started in using our API, we featured a Quick Start Challenge, where developers could bring their Unity or Unreal Engine games to port them to DirectX 12. Developers also had the option of attending three sponsored sessions to learn how to effectively use the power of DirectX 12 in their games.
The industry’s leading game developers, engine developers, and hardware vendors are all aligning around DirectX 12. Read on to find out why.
20% performance improvements in GPU bound games
One question that has been asked is “I know DirectX 12 provides great CPU and power efficiency, but what if my game is GPU bound? Can DirectX 12 still help me get performance improvements?” Our answer to that is “Yes, absolutely!”
We worked closely with Lionhead Studio’s to show this in action with their new AAA title, Fable Legends. Below, we have screenshots of an in-game scene; only the first image is rendering using DirectX 11 and the second image DirectX 12. We also have an FPS overlay to show the difference in performance.
Fable Legends DX11 – 44.5 FPS
Fable Legends DX12 – 53 FPS
This game is GPU bound and by using optimizations only possible in DirectX 12, we see a significant 20% boost in FPS here.
How does this work? In DirectX 12 the app has lower level access to the hardware and when combined with higher level app knowledge of when things like resource synchronization need to happen, the app has the power to make optimizations specific to its use case.
An important thing to note is that these gains are not occurring on some motley hand-picked mix of hardware. We went and found one of the most powerful gaming configurations you can buy – an 8-core Intel i7 CPU with a NVIDIA GeForce GTX 980, and DirectX 12 still manages to raise the performance bar.
Oxide Games’ Ashes of the Singularity
We also wanted to take the opportunity to show you how DirectX 12’s CPU performance gains can enable gameplay that was never possible before. Oxide Games announced their new game, Ashes of the Singularity and with this, they wanted to redefine what ‘large scale’ meant in the world of RTS games. Working closely together with Oxide, we found that DirectX 12 in conjunction with their massively scalable Nitrous engine cut CPU usage to a fraction of what it was on DirectX 11 and improved overall FPS in their live demo flythrough by 20%. More importantly, certain parts of the game which simply would be unplayable due to scene complexity in DirectX 11 can be rendered in its full glory on DirectX 12.
Finally, to drive the performance story home, we showed Futuremark’s new “Farandole” API overhead benchmark on all our booth hardware: the NVIDIA and AMD machines mentioned above as well as the incredibly compact Brix Pro machine powered by Intel Iris Pro Graphics 5200.
“Farandole” demonstrates how we can extract the raw power of the hardware far more efficiently with DirectX 12 over DirectX 11. On the Intel’s Iris Pro Graphics demo machine, this increased of the number of possible draw calls by a factor of 3x.
How we make both GPU and CPU performance magic happen using DirectX 12
One of the things that we are particularly excited about is the fact that DirectX 12 can help you squeeze that extra GPU and CPU performance out of hardware that over 50% of PC Gamers already have! (Based on Steam survey).
We held a few talks at GDC to tell you exactly how you as developers can bring those performance wins to your content. Here are the highlights.
Currently, there are three key areas where GPU improvements can be made that weren’t possible before: Explicit resource transitions, parallel GPU execution, and GPU generated workloads. Let’s take a quick look at all three.
Explicit resource transitions
In DirectX 12, the app has the power of identifying when resource state transitions need to happen. For instance, a driver in the past would have to ensure all writes to a UAV are executed in order by inserting ‘Wait for Idle’ commands after each dispatch with resource barriers.
If the app knows that certain dispatches can run out of order, the ‘Wait for Idle’ commands can be removed.
Using the new Resource Barrier API, the app can also specify a ‘begin’ and ‘end’ transition while promising not to use the resource while in transition. Drivers can use this information to eliminate redundant pipeline stalls and cache flushes.
Parallel GPU execution
Modern hardware can run multiple workloads on multiple ‘engines’. Three types of engines are exposed in DirectX 12: 3D, Compute, and Copy. It is up to the app to manage dependencies between queues.
We are really excited about two notable compute engine scenarios that can take advantage of this GPU parallelism: long running but low priority compute work; and tightly interleaved 3D/Compute work within a frame. An example would be compute-heavy dispatches during shadow map generation.
Another notable example use case is in texture streaming where a copy engine can move data around without blocking the main 3D engine which is especially great when going across PCI-E.
ExecuteIndirect is a powerful new API for executing GPU-generated Draw/Dispatch workloads that has broad hardware compatibility. Being able to vary things like Vertex/Index buffers, root constants, and inline SRV/UAV/CBV descriptors between invocations enables new scenarios as well as unlocking possible dramatic efficiency improvements.
In mid 2014, we worked with Intel to show how DirectX 12 can provide both power efficiency and performance gains (http://blogs.msdn.com/b/directx/archive/2014/08/13/directx-12-high-performance-and-high-power-savings.aspx).
With DirectX 12’s ability to scale efficiently across multiple CPU cores, Oxide’s game Ashes was also able to put an unprecedented number of units, particles, and effects on screen without sacrificing performance.
The Ashes live demo was also shown on one of the highest end gaming configurations you can have, the same 8-core Intel i7 CPU and an AMD R9 290X; once more showing how DirectX 12 can raise the highest of performance bars.
We also announced a shader caching feature which allows app controlled serialization and deserialization of Pipeline State Objects. This will help apps optimize startup and level load times while also reducing in-game glitches.
Where can I learn more about improving GPU and CPU efficiency using DirectX 12?
All of the above is covered in Bennett Sorbo’s “Better Power, Better Performance: Your Game on DirectX12” and Max McMullen’s “Advanced DirectX12 Graphics and Performance” GDC 2015 technical talks linked below:
We’re making it easy for you to dive right into DirectX 12!
DirectX 12 is a new API and as developers, we understand that learning a new API takes work. That’s why we brought you the DirectX 12 Quick Start Challenge (QSC) booths at GDC 2015.
We worked closely with Epic Games and Unity to back their respective engines with DirectX 12. We then encouraged all of you to bring your Unreal Engine 4 or Unity 5 Beta projects to our QSC booths where you could get your content running on DirectX 12 right there and then! We were ecstatic that some of you managed to bring your content in and get it working.
Keep in touch and up to date with DirectX 12!
As a result of GDC, we have seen a surge of applications to our DirectX 12 Early Access Program and we want to continue to encourage game developers to apply.
If you think your game will benefit from DirectX 12, just fill in the online OneDrive survey at https://aka.ms/dxeap. Make sure to fill out as much of the survey as possible to let us know what cool things you want to do with DirectX 12!
In the meantime, stay tuned to this blog and follow us @DirectX12 for all of the latest!