Announcing WARP preview with Shader Model 6.7 support

Luke Olsen

Jesse Natalie

The D3D team is pleased to announce the availability of a downloadable preview version of WARP, also known as Microsoft Basic Render Adapter.

What is WARP?

This software rasterizer is a key component of Windows and is leveraged for rendering 2D and 3D graphics on Windows PCs that don’t have any GPU available or don’t have a suitable GPU driver, as well as for offloading rendering work to the CPU to free up GPU resources. You can read more about WARP and how to use it in your application here: Windows Advanced Rasterization Platform (WARP) Guide – Win32 apps | Microsoft Learn.

But WARP is more than just a fallback – it can also be a valuable tool for testing. If your system has one hardware GPU, perhaps you’d like to compare behaviors between that GPU and another to investigate potential driver quirks or bugs, and WARP can fill that role. Or maybe you want to run some graphics workloads on a server machine for continuous integration testing, and there’s no GPU available on that server. Thanks to WARP, you can.

The latest version of WARP included in Windows 11 supports D3D12 and feature level 12.1, but it only supports up to shader model 6.2, and there are also some known issues in places from the shader compiler, to the texture sampler, to the rasterizer, which limited its utility as a truly reliable test tool for the latest GPU workloads.

That’s about to change

With this release, there’s been a significant investment in WARP, aiming to help it better fulfill its role as a test tool. We’ve paid off much of the technical debt in the shader compiler, making it capable of supporting all of the optional features in shader models 6.3 thru 6.7, including:

  • 64-bit loads, stores, and atomics on all available types of resources
  • Descriptor heap indexing, aka shader model 6.6 dynamic resources
  • Quad ops and sampling derivatives in compute shaders
  • “Advanced texture ops,” featuring integer texture point sampling, raw gather, dynamic texel offsets, and MSAA UAVs

While we were at it, we squashed several bugs that could produce incorrect results, or would trigger device removal or a crash on what was actually well-formed shader code. Notably, WARP had several wave ops that produced incorrect results, and all wave ops incorrectly included helper lanes – now you’ll only get that behavior if you ask for it via the Shader Model 6.7 annotation!

On top of all of that, WARP has been updated to include many of the other features from the Agility SDK 1.606 and the preview features from 1.706, including (but not necessarily limited to):

  • Enhanced barriers
  • Relaxed resource format casting via ID3D12Device10::CreateCommittedResource3
  • Independent front/back stencil refs and masks
  • Triangle fans
  • Relaxed buffer/texture copy pitches
  • Independent D3D12 devices via ID3D12DeviceFactory::CreateDevice

Note that WARP does not implement some of the larger new optional D3D features such as raytracing or mesh shaders, and there is no timeframe for when these features might be supported.

Pairs well with the DirectX 12 Agility SDK

We’re making all of these fixes available in a NuGet package, meaning that you can download the Agility SDK and WARP together, and be able to run and test new features made available by the Agility SDK on any OS that’s capable of supporting the Agility SDK.

You can find both the WARP and Agility SDK packages here: NuGet Gallery | Direct3D

To use the packaged version of WARP, simply copy the appropriate version of d3d10warp.dll into the same folder as your test application, or alternatively have your code load it directly from a designated location via LoadLibrary. The package binary version supports Windows October 2018 Update (version 17763) and later versions of Windows.

If you have any feedback you’d like to share, please reach out to us via the Feedback Hub under Developer Platform > Graphics and DirectX 12 (make sure to mention WARP in the feedback title), or on the DirectX Discord.