How Windows GPU Drivers Expose AV1 via DXVA2 and D3D11

Modern Windows graphics drivers expose hardware-accelerated AV1 decoding by bridging fixed-function media processing silicon with the operating system's video APIs: DirectX Video Acceleration 2.0 (DXVA2) and Direct3D 11 (D3D11) Video APIs. This article details the structural mechanisms GPU drivers use to advertise AV1 support, negotiate decode profiles using standardized Globally Unique Identifiers (GUIDs), exchange parameter buffers for frame reconstruction, and dispatch bitstream commands to the hardware via the Windows Display Driver Model (WDDM).

AV1 Decoder Profiles and GUID Registration

To make AV1 decoding accessible to applications like web browsers and media players, GPU drivers must register standard decoder GUIDs defined by Microsoft in the DirectX Video Acceleration specifications.

The primary profiles exposed include:

When the GPU driver initializes its User-Mode Driver (UMD) layer, it registers support for these GUIDs based on the underlying hardware engine (e.g., Intel Quick Sync, NVIDIA NVDEC, or AMD VCN). If the physical hardware lacks dedicated AV1 hardware logic, the driver simply omits these GUIDs from its supported list.

Driver Capability Negotiation

The driver exposes discovery endpoints through either D3D11 Video or DXVA2 interfaces:

Direct3D 11 Video API

Under Direct3D 11, capability discovery revolves around the ID3D11VideoDevice interface:

  1. Profile Enumeration: The application calls GetVideoDecoderProfileCount() and GetVideoDecoderProfile(). The driver reports an array of supported profile GUIDs, including the AV1 decode GUIDs.
  2. Format Verification: The application verifies surface formats via CheckVideoDecoderFormat(). For AV1 Profile 0, the driver confirms support for DXGI_FORMAT_NV12 (8-bit) and DXGI_FORMAT_P010 (10-bit).
  3. Configuration Retrieval: The application queries GetVideoDecoderConfigCount() and GetVideoDecoderConfig(). The driver returns supported decoder configurations, specifying parameters such as encrypted bitstream support or slice control limits.

DXVA2 (DirectX Video Acceleration 2)

In the older DXVA2 API (built on Direct3D 9Ex), discovery is handled via IDirectXVideoDecoderService:

  1. The application queries GetDecoderDeviceGuids(), where the driver responds with supported DXVA device types.
  2. The format is validated through GetDecoderRenderTargets(), ensuring target textures (such as NV12 surfaces) can be rendered directly by the hardware decoder engine.
  3. The configuration is obtained through GetDecoderConfigurations(), allowing the driver to define input buffer requirements (DXVA2_ConfigPictureDecode).

AV1 Bitstream Buffers and Parameter Structures

AV1 is an Open Bitstream Unit (OBU) based standard requiring significant frame-level and tile-level parameters. The driver exposes its capabilities to accept structured picture parameters and raw bitstream slices, offloading the heaviest computational steps while relying on the application to perform lightweight bitstream demuxing.

When decoding a frame, the driver requires specific buffers sent through the interface:

Kernel Dispatch and Hardware Execution

Once the application submits these buffers via ID3D11VideoContext::SubmitDecoderBuffers or IDirectXVideoDecoder::Execute:

  1. User-Mode Driver Translation: The UMD converts the standard DXVA_PicParams_AV1 and tile buffers into proprietary command packets tailored for the GPU's fixed-function video processing engine.
  2. WDDM Submission: The UMD passes these command packets down to the Kernel-Mode Driver (KMD) via Direct3D runtime calls (D3DKMTSubmitCommand).
  3. Hardware Processing: The GPU's hardware video engine reads the raw bitstream buffer, parses the entropy-coded symbols, applies inverse quantization and transforms, executes in-loop filtering (Deblocking, CDEF, and Loop Restoration), and outputs the decoded planar image directly to the allocated NV12 or P010 surface in video memory.
  4. Synchronization: The driver issues fences/events back through the DirectX runtime, signaling the completion of the decode operation so the resulting surface can be bound as an input to a swapchain, a video processor for scaling/color conversion, or a 3D rendering pipeline.