DirectX 12, Asynchronous Compute, and Hardware Compliance

This is something that bugs me from time to time, that people say DirectX 12 and possibly Vulkan require a certain hardware feature that certain GPUs do not have. Thus it’s a lie to say said GPU is compliant with the API. That certain hardware feature is known as asynchronous compute.

Where did this idea come from?

Back in 2015, AMD had a press release regarding how its GPUs work with DirectX 12, which was something gamers were interested before the release of Windows 10. The standout feature was something they called back then as “asynchronous shading.”[1] This press release, along with the controversy surrounding benchmarks for the upcoming Ashes of the Singularity, a DirectX 12 “launch title” if you will, likely stoked the idea that asynchronous shading was some hardware feature that AMD had, but NVIDIA did not. [2][3][4]

This may have also been further fueled by Vulkan being the competitor to DirectX 12 and that AMD contributed a lot to the project.

What does it mean for a graphics processor to be compliant with DirectX 12?

Microsoft defined a hardware level feature set that graphics processors must support in order to meet some requirement of DirectX 12 [5]. I’m being careful with my choice of words here because said hardware level features need not actually be baked into the hardware itself, as Microsoft made a software renderer that’s compliant with DirectX 12 [6] known as WARP.

Basically, as far as I understand it, the API asks the graphics processor driver “can you do this?” and if the driver says “yes”, then the API tells the application the graphics processor meets the requirements for what it wants. Whether or not the graphics processor can actually do that is another question. But given that DirectX is more or less a standard, there’s the assumption graphics processors have to go through a qualification process before the company making it says “yes, it’s compatible with this.” Otherwise, imagine the flak said company would get if they said “yes we’re compatible with this” only to really not be.

What about asynchronous compute then?

Taking a look at DirectX 12’s hardware feature requirement list, there’s something that’s lacking. There is no explicit call to support asynchronous compute. The hardware must support DirectCompute, or basically compute in general, but not a specific form of it. Thus even if a graphics processor does not support the feature in hardware, as long as it supports all of the other features as necessary, it’s compliant.

It helps to understand what was introduced then that allowed for asynchronous compute: the ability to create multiple command queues to the graphics processor as necessary. [7] What this means is instead of one queue that has everything in, developers can create multiple queues for certain types of work. For example, one queue could be for graphics, another for compute, and another for requesting data transfers. What makes asynchronous compute… well, asynchronous, is that the work that’s submitted in these queues doesn’t have to be done in the order they were submitted. They can be done out of order as long as there’s no other dependency. Even AMD themselves said it:

A basic requirement for asynchronous shading is the ability of the GPU to schedule work from multiple queues of different types across the available processing resources.

— AMD, Asynchronous Shaders White Paper

Another way to look at it is saying that single-core CPUs are incapable of multitasking since they can only do one thing at a time. At the risk of using some weasel words, a lot of people generally agree that multitasking means that the computer can handle several programs at once and splitting how much time each program gets on the CPU, rather than requiring a program, any program, to run from start to finish.

Another point to poke at is that asynchronous compute, at least as far as AMD has presented it, is an implementation detail. It’s a “how it’s done” rather than “what is done.” A standard should not say “how it’s done”. If a standard does this, then it can stifle innovation. If someone comes up with another solution that’s just as good, it’s not compliant with the standard simply because it wasn’t done the “standard” way even if the result is practically the same.

What’s the ultimate point?

Asynchronous compute is not a hardware requirement of DirectX 12. As Vulkan was meant to compete with DirectX 12 in terms of feature set, I’m going to assume Vulkan has the same hardware requirements, even though I cannot find a list from Khronos similar to what Microsoft provided for hardware requirements.

Basically, the next time someone says “this graphics processor doesn’t have true DirectX 12 comparability because it doesn’t have true asynchronous compute” they probalby shouldn’t be taken seriously.



Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Create your website at
Get started
%d bloggers like this: