http://bugs.winehq.org/show_bug.cgi?id=60207 Bug ID: 60207 Summary: VirtualDJ 2026: persistent skin corruption (ghost hover highlights, flickering) because d3d11_swapchain_Present1 ignores DXGI_PRESENT_PARAMETERS Product: Wine Version: 11.0 Hardware: x86-64 OS: Linux Status: UNCONFIRMED Severity: normal Priority: P2 Component: d3d Assignee: wine-bugs@list.winehq.org Reporter: bghome@gmail.com Target Milestone: --- Distribution: --- Created attachment 81893 --> http://bugs.winehq.org/attachment.cgi?id=81893 WINEDEBUG=+dxgi, DXVK disabled Overview -------- dlls/dxgi/swapchain.c:d3d11_swapchain_Present1() discards the DXGI_PRESENT_PARAMETERS argument entirely: static HRESULT STDMETHODCALLTYPE d3d11_swapchain_Present1(IDXGISwapChain4 *iface, UINT sync_interval, UINT flags, const DXGI_PRESENT_PARAMETERS *present_parameters) { struct d3d11_swapchain *swapchain = d3d11_swapchain_from_IDXGISwapChain4(iface); TRACE("iface %p, sync_interval %u, flags %#x, present_parameters %p.\n", iface, sync_interval, flags, present_parameters); if (present_parameters) FIXME("Ignored present parameters %p.\n", present_parameters); return d3d11_swapchain_present(swapchain, sync_interval, flags); } That struct carries DirtyRectsCount, pDirtyRects, pScrollRect and pScrollOffset. The FIXME is widely seen and generally assumed to be cosmetic, because for most applications it only costs an optimisation. For an application that presents *incrementally* on a flip-model swap chain it is not cosmetic: it produces permanent, highly visible rendering corruption, and no error is 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 responsibility, and Wine never performs it. Consequence: as the flip chain rotates, each back buffer only ever receives the damage that happened to be drawn while it was the current buffer. The buffers diverge permanently and the display alternates between two partially-updated frames, forever. Application ----------- VirtualDJ 2026 (build 9583), https://download.virtualdj.com/b9583/89CED1AB/install_virtualdj_2026_b9583_p... - free to download and run without a licence, so the bug is reproducible without a purchase. The defect is in its "experimental skin engine" feature, which is enabled by default. Symptoms visible to the user: - a button stays highlighted after the cursor has moved to a different button, so two or more controls appear hovered at once; - dialog window borders flicker continuously; - tooltips and hint balloons blink on and off at frame rate. Steps to reproduce ------------------ 1. Install and start VirtualDJ 2026 (no need to load a track). 2. Make sure Settings -> Performance -> experimentalSkinEngine is "auto" or "yes" (the default). 3. Move the mouse onto deck B's CUE button, then onto the SYNC button next to it, and hold the cursor still. 4. Both CUE and SYNC are shown highlighted, and stay that way. Setting experimentalSkinEngine to "no" makes every symptom disappear. Environment ----------- wine-staging 11.0 under Bottles 66.7, win10 mode, X11 (WINEPREFIX has wayland driver disabled). Intel Arc (MTL), Mesa 26.1.6. Reproduced with Wine's own dxgi + wined3d, i.e. with DXVK disabled. It also reproduces with DXVK 3.0.2, because DXVK has the same gap (dxgi_swapchain.cpp: PresentBase() calls m_presenter->Present(SyncInterval, PresentFlags, nullptr)). So this is not a DXVK-specific problem; both paths discard the struct. Expected behaviour ------------------ d3d11_swapchain_Present1 should 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 present_parameters is non-NULL, ensure the incoming back buffer contains the previously presented frame before returning, so that an application which redraws only its damaged regions still produces a coherent frame. Actual behaviour ---------------- The parameters are dropped, no copy is performed, no error or warning is returned to the application, and the swap chain's buffers diverge permanently. -- Do not reply to this email, post in Bugzilla using the above URL to reply. You are receiving this mail because: You are watching all bug changes.