EXPLAINER · TECHNICAL, BUT READABLE · DXVK 3.1.1
How DXVK turns DirectX into Vulkan
How we checked this
Direct3D is the set of calls a game uses to ask for pictures. Vulkan is a different set, used by most graphics drivers on Linux and available on Windows too. DXVK sits between them. This page follows one frame through that translation, so you can see where time goes and why some things (first-run stutter, odd GPU names, a missing dxgi.dll) happen.
The path of one frame
Click a step. Each one names the HUD item that measures it, so you can watch the same numbers on your own screen.
- Step 1 of 6. Shows the HUD item drawcalls.
- Step 2 of 6. Shows the HUD item devinfo.
- Step 3 of 6. Shows the HUD item cs.
- Step 4 of 6. Shows the HUD item compiler.
- Step 5 of 6. Shows the HUD item submissions.
- Step 6 of 6. Shows the HUD item frametimes.
Step 1: Game calls Draw. The game asks Direct3D to draw something. Because DXVK’s DLLs sit where Microsoft’s would, the call lands in DXVK instead.
HUD item DXVK_HUD=drawcalls Draw calls, dispatches, render passes and barriers counted per frame.
Step 2: D3D front end checks state. DXVK’s Direct3D front end (d3d9, d3d10core or d3d11) validates the call and tracks state: bound shaders, textures, blend modes. This part runs on the game’s own thread, so it costs the same CPU time the game would have spent in Microsoft’s code.
HUD item DXVK_HUD=devinfo GPU name and driver: which Vulkan driver DXVK is talking to.
Step 3: CS thread records Vulkan. The game thread hands work to DXVK’s command stream (CS) thread in chunks. That thread turns it into Vulkan commands, so the game thread can move on.
HUD item DXVK_HUD=cs CS chunks: how much work is queued for the command stream thread, and its load.
Step 4: Shaders translated, pipelines built. The game’s shaders (DXBC bytecode for Direct3D 10 and 11, a different bytecode for Direct3D 9) become SPIR-V. The GPU driver then compiles a pipeline for each state combination. In DXVK 3.x this happens on worker threads, with results kept in a disk cache.
HUD item DXVK_HUD=compiler “Compiling shaders” appears only while shader work runs; the pipelines and shaders counters rise as new ones are created.
Step 5: Submit to the GPU queue. Recorded Vulkan commands go to the GPU’s queue in batches. The GPU draws; the CPU does not wait for it unless the game asks to read results back.
HUD item DXVK_HUD=submissions Queue submissions and queue syncs.
Step 6: Present. DXVK’s DXGI layer hands the finished image to a Vulkan swap chain, which puts it on screen at the pace your sync settings allow.
HUD item DXVK_HUD=frametimes FPS and the frame time graph show the result of the whole path.
Simplified illustration of the flow, not a measurement. The HUD items are listed on the HUD page.
Here is the full HUD on a Direct3D 11 test program under Wine. Draw calls, pipelines, shaders and CS chunks are the lines that map to steps 1, 3, 4 and 5.
Why shaders are the hard part
A shader is a small program that runs on the GPU. Games ship them as DXBC bytecode (Direct3D 10 and 11) or the older Direct3D 9 shader bytecode. Vulkan drivers do not accept either: they want SPIR-V, Vulkan’s own format. So DXVK translates every shader it sees.
Translation is only half the job. A GPU runs a complete pipeline, which bundles the shaders with state such as blending and the vertex layout. The driver has to compile one pipeline for each combination the game uses, and a game can ask for a new combination at any moment. If that compile happens while a frame is being drawn, the frame waits: that is shader stutter.
DXVK 2.0 added support for the Graphics Pipeline Library (GPL), a Vulkan extension that lets the driver compile pipeline parts ahead of time, while the game is still loading its own shaders. The README says games that only reveal their shaders at draw time, such as most Unreal Engine titles, will still stutter somewhat, though less than without it. Our shader stutter page shows what this looks like and what you can change.
What changed in 3.0
According to the 3.0 release notes:
- dxbc-spirv. A new compiler, kept in its own repository, handles every shader model, including Direct3D 9, and replaces the older translators. All compilation now happens on worker threads.
- A shader cache on disk. We saw it create a
.dxvk.binand a.dxvk.lutfile per game in%LOCALAPPDATA%\dxvk, and a log line startingCreated cache file:(F19). - A new binding model. On drivers with descriptor heap support DXVK uses it; otherwise our 3.1.1 log on a software driver printed
Binding model: Descriptor bufferandGraphics pipeline libraries supported(F20).
The notes do not describe 3.0 as a general FPS gain, and we have not measured one. The point is smoother loading and less work on the thread that draws. See DXVK 3.x for who should upgrade.
DXGI: the piece people forget
Direct3D does not draw to a window by itself. A second API, DXGI, lists your GPUs (adapters) and owns the swap chain: the set of images that are drawn into while another is on screen. DXVK ships its own dxgi.dll and maps swap chains onto a Vulkan swap chain.
Two things follow from that, and we tested both:
- A Direct3D 11 game needs
dxgi.dllas well asd3d11.dll. With onlyd3d11.dllcopied, device creation failed withD3D11CreateDevice: Failed to create swap chainand the app received error0x887A0004, on Windows Server 2025, Windows Server 2022 and Wine (F06). The DLL page lists which files each API needs. - The GPU name can differ by API. On a GPU whose vendor DXVK does not treat as AMD, NVIDIA or Intel, Direct3D 9 reported
AMD Radeon RX 6700 XTand loggedD3D9: Hiding actual GPU, reporting, while Direct3D 11 reported the real name (F28). This is a compatibility choice, not a bug, and it can be changed with dxvk.conf.
Where the CPU time goes
Every draw call a game makes passes through DXVK’s front end. In some games DXVK spends less CPU per call than the layer it replaces, so it can help when the CPU is the limit. In others it adds work: it validates state, records commands and compiles shaders, and some of that cannot be moved to another thread.
That is why there is no honest one-line answer. Our lab machines have no real GPU, so we cannot give game numbers here. We did measure draw-call scaling on a software renderer, and we publish it only as a demonstration of method on How we test: on a CPU renderer it says nothing about games. For measured game results see Does DXVK increase FPS? once it has data, and DXVK vs WineD3D.
Built-in game profiles
DXVK carries 263 built-in profiles at version 3.1.1 (262 in its profile table plus one for Steam Deck, counted from its source). When a game’s executable name matches, DXVK sets options for it automatically. Five from our extract of 100 well-known titles:
| Watch Dogs 2 | d3d11.forceComputeUavBarriers = True | Adds synchronisation the game needs to render correctly |
|---|---|---|
| Borderlands 2 | d3d9.lenientClear = True, d3d9.supportDFFormats = False, d3d9.floatEmulation = Strict | Direct3D 9 behaviour tweaks for this engine |
| The Sims 2 (and spin-offs) | d3d9.customDeviceDesc = GeForce 7800 GTX, d3d9.maxAvailableMemory = 2048 and more | Presents an era-appropriate GPU and limits memory in a 32-bit game |
| Skyrim Special Edition | d3d11.cachedDynamicResources = a | Changes how dynamic buffers are cached |
| Crysis / Crysis Warhead | d3d9.maxFrameRate = -1, dxgi.maxFrameRate = -1 | Turns off any DXVK frame cap for these games |
No rows match.
The last column is our interpretation of the option names, not upstream’s stated reason. Options are explained in the options reference and how to add your own is on the dxvk.conf page.
Glossary
Vulkan
A graphics and compute API from the Khronos Group. Most GPU drivers on Linux, and many on Windows, expose it. It is lower level than Direct3D 9 to 11, so the translator has to do work the old APIs hid.
SPIR-V
Vulkan’s shader format. DXVK converts every game shader into it.
DXBC
The bytecode Direct3D 10 and 11 games ship their shaders in. Direct3D 9 uses an older format.
GPL (Graphics Pipeline Library)
A Vulkan extension that allows pipelines to be compiled in parts and ahead of time. In the DXVK release notes “GPL” always means this, not the GNU licence.
Swap chain
The queue of images a game draws into, one at a time, while the previous one is shown on screen.
DXGI
The Windows layer that lists graphics adapters and manages swap chains. DXVK replaces it with its own dxgi.dll.
ICD and loader
The Vulkan loader finds the driver (the installable client driver, ICD) your GPU maker supplies and passes DXVK’s Vulkan calls to it. If no working ICD is found, DXVK cannot start; see error messages.
wined3d
Wine’s own Direct3D implementation. It is what runs Direct3D games under Wine when DXVK is not installed.
Questions people ask
Is DXVK an emulator?
No. Nothing is emulated: the game's own code runs normally on your CPU. DXVK only replaces the graphics API the game calls, turning Direct3D calls into Vulkan calls.
Why does DXVK stutter the first time?
Each combination of shaders and render state needs a pipeline compiled by your GPU driver. If that happens in the middle of a frame, the frame waits. DXVK 2.0 and newer can compile earlier with the Graphics Pipeline Library, and 3.x keeps a shader cache on disk, but games that only reveal their shaders at draw time can still stutter.
Does DXVK use more CPU?
It does extra work on the CPU to translate calls, but spreads some of it over worker threads. Whether that is a net gain or loss depends on the game and the driver. We have no real-game measurements yet, so we make no claim either way.
What is GPL in DXVK?
GPL means Graphics Pipeline Library, a Vulkan extension that lets a driver compile parts of a pipeline early. It has nothing to do with the GNU licence. DXVK 2.0 introduced support for it.
Why does my Direct3D 9 game think I have an AMD card?
DXVK hides GPUs it does not recognise from Direct3D 9 games. In our test on a GPU with an unknown vendor, Direct3D 9 reported an AMD Radeon RX 6700 XT while Direct3D 11 reported the real name (F28).
Sources
- DXVK README at v3.1.1 · accessed 2026-11-07
- DXVK 3.0 release notes · accessed 2026-11-07
- dxbc-spirv repository · accessed 2026-11-07
- Khronos: VK_EXT_graphics_pipeline_library · accessed 2026-11-07