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:
DXVA_ModeAV1_VLD_Profile0: Baseline 8-bit or 10-bit decoding with 4:2:0 chroma subsampling.DXVA_ModeAV1_VLD_Profile1: 8-bit or 10-bit decoding with 4:4:4 chroma subsampling.DXVA_ModeAV1_VLD_Profile2: 12-bit decoding or alternative subsampling formats (such as 4:2:2).DXVA_ModeAV1_VLD_12bit: Specific configurations accommodating 12-bit high-bitdepth pipelines.
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:
- Profile Enumeration: The application calls
GetVideoDecoderProfileCount()andGetVideoDecoderProfile(). The driver reports an array of supported profile GUIDs, including the AV1 decode GUIDs. - Format Verification: The application verifies
surface formats via
CheckVideoDecoderFormat(). For AV1 Profile 0, the driver confirms support forDXGI_FORMAT_NV12(8-bit) andDXGI_FORMAT_P010(10-bit). - Configuration Retrieval: The application queries
GetVideoDecoderConfigCount()andGetVideoDecoderConfig(). 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:
- The application queries
GetDecoderDeviceGuids(), where the driver responds with supported DXVA device types. - The format is validated through
GetDecoderRenderTargets(), ensuring target textures (such as NV12 surfaces) can be rendered directly by the hardware decoder engine. - 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:
- Picture Parameters
(
DXVA_PicParams_AV1): The application passes a structured representation of the AV1 frame header. This includes frame type, reference frame indexes, spatial resolutions, quantization parameters (base_q_idx), loop filter strengths, CDEF (Constrained Directional Enhancement Filter) parameters, Loop Restoration modes, and Film Grain synthesis metadata. - Tile Command Buffers (
DXVA_Tile_AV1): AV1 frames can be split into independent tiles. This buffer specifies the number of tiles, byte offsets, and row/column configurations so the hardware decoder can parse them in parallel. - Bitstream Data Buffers: The raw compressed entropy-coded data of the AV1 tiles (Tile Group OBUs).
- Film Grain Buffer: If the driver supports hardware-accelerated film grain application, an auxiliary structure containing grain synthesis lookup parameters is supplied.
Kernel Dispatch and Hardware Execution
Once the application submits these buffers via
ID3D11VideoContext::SubmitDecoderBuffers or
IDirectXVideoDecoder::Execute:
- User-Mode Driver Translation: The UMD converts the
standard
DXVA_PicParams_AV1and tile buffers into proprietary command packets tailored for the GPU's fixed-function video processing engine. - WDDM Submission: The UMD passes these command
packets down to the Kernel-Mode Driver (KMD) via Direct3D runtime calls
(
D3DKMTSubmitCommand). - 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
NV12orP010surface in video memory. - 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.