protonscr

DXGI_PRESENT_PARAMETERS is discarded, causing permanent corruption in applications that present incrementally (VirtualDJ 2026)

dxvkclosed feature set
doitsujin/dxvk#5853 · opened 2026-08-21 by elvetemedve · updated 2026-08-23 · 1 comments · github
1 matching comments, n / p to jump
Eelvetemedve 2026-08-21 github

DxgiSwapChain::PresentBase discards the DXGI_PRESENT_PARAMETERS argument:

hr = m_presenter->Present(SyncInterval, PresentFlags, nullptr);

Present1 forwards the struct to PresentBase, which passes nullptr onward;
DirtyRectsCount, pDirtyRects, pScrollRect and pScrollOffset are never
read.

For most applications that only costs an optimisation. For an application that
presents incrementally on a flip-model swap chain it produces permanent,
highly visible corruption, with no error returned. Per Microsoft's flip-model
presentation documentation the scroll rectangle is "the area of the previous
frame that the operating system needs to copy to the current frame before it
renders the current frame" — that copy is the runtime's job, and it never
happens.

The result is that as the flip chain rotates, each back buffer only ever
receives the damage that was drawn while it was the current buffer. The buffers
diverge permanently and the display alternates between two partially-updated
frames indefinitely.

Software information

VirtualDJ 2026, build 9583 — https://download.virtualdj.com/b9583/89CED1AB/install_virtualdj_2026_b9583_pc.msi. Free to download and
run without a licence, so this is reproducible without a purchase. Default
settings; no mods or add-ons.

The relevant application setting is Settings → Performance →
experimentalSkinEngine (default auto). That engine is what presents
incrementally. Setting it to no makes every symptom disappear, which is the
current workaround.

System information

  • GPU: Intel Arc (MTL), 8086:7d55
  • Driver: Intel open-source Mesa driver 26.1.6 (ANV)
  • Wine version: wine-staging 11.0 (ge-proton11-5, via Bottles 66.7), win10 mode, X11
  • DXVK version: 3.0.2

Steps to reproduce

  1. Install and launch VirtualDJ 2026. Do not load a track — a static skin
    makes the artefact far easier to see.
  2. Leave experimentalSkinEngine at its default.
  3. Move the mouse onto deck B's CUE button, then onto SYNC next to it, and hold
    the cursor still.
  4. CUE and SYNC are both shown highlighted and stay that way. Dialog borders
    flicker, and tooltips/hint balloons blink on and off continuously.

What the application does

From a WINEDEBUG=+dxgi trace of the same session (see note below):

count
Present1 calls 372
…of which with a NULL present_parameters 0
legacy Present calls 8 (startup / one popup)
GetBuffer calls 382
…of which with buffer_idx != 0 0
CreateSwapChainForHwnd 3

Every present carries present parameters — there is no full-frame fallback path.
GetBuffer is only ever called for index 0, and the swap chain carries
DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT (0x40); both are the
flip-model idiom where DXGI rotates the physical buffers behind index 0.

This is not avoidable by switching off DXVK

The same corruption occurs with DXVK disabled, because Wine's own
d3d11_swapchain_Present1 has the identical gap (FIXME("Ignored present parameters %p.\n", ...)). Filed there as
https://bugs.winehq.org/show_bug.cgi?id=60207. Reporting here separately
because the DXVK path is what most users of this application actually run.

Expected behaviour

Honour DXGI_PRESENT_PARAMETERS — at minimum pScrollRect / pScrollOffset,
which the runtime is documented to copy from the previously presented buffer
before the application renders the current frame.

A conservative alternative that would also fix the corruption: when
pPresentParameters is non-NULL, ensure the incoming back buffer contains the
previously presented frame before returning, so an application that redraws only
its damaged regions still produces a coherent frame.

Apitrace file(s)

I do not have one yet.

Log files

  • virtualdj_dxgi.log, virtualdj_d3d11.logDXVK_LOG_LEVEL=info from the
    affected session. Shows the three swap chains (5120x2816, 834x750, 667x250),
    all VK_PRESENT_MODE_FIFO_KHR with Image count: 4.
  • dxgi.logWINEDEBUG=+dxgi from a DXVK-disabled run, source of the call
    counts above.
Ddoitsujin maintainer 2026-08-21 github

Yes, we're aware that we don't support the feature, no need to post thousands of lines of LLM vomit.

Might do it at some point, but it's not a high priority. There's no direct Vulkan equivalent and the only real way to do this is to add yet another internal copy of the back buffer, which is obviously a big no-go for actual games.

Proton versions

Launch options

Upstream links