[Bug 60207] New: VirtualDJ 2026: persistent skin corruption (ghost hover highlights, flickering) because d3d11_swapchain_Present1 ignores DXGI_PRESENT_PARAMETERS
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.
http://bugs.winehq.org/show_bug.cgi?id=60207 --- Comment #1 from Géza Búza <bghome@gmail.com> --- Created attachment 81894 --> http://bugs.winehq.org/attachment.cgi?id=81894 shows the two-button ghost and blinking balloon -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 --- Comment #2 from Géza Búza <bghome@gmail.com> --- Created attachment 81895 --> http://bugs.winehq.org/attachment.cgi?id=81895 the two alternating button states side by side -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 --- Comment #3 from Géza Búza <bghome@gmail.com> --- Created attachment 81896 --> http://bugs.winehq.org/attachment.cgi?id=81896 Inconsistent state of buttons -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 Zeb Figura <z.figura12@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |z.figura12@gmail.com --- Comment #4 from Zeb Figura <z.figura12@gmail.com> --- All of those parameters are only supposed to be hints. I don't think that can be the cause, unless the application is doing naughty things. -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 --- Comment #5 from Zeb Figura <z.figura12@gmail.com> ---
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.
The documentation also states that you're not supposed to touch any pixel outside of that area, though. And retrieving the old data is not trivial. Once we present a swapchain with DISCARD it's gone; we have no idea if the next one is going to use dirty rects or not. If we store a copy we've given up the point of using DISCARD in the first place and pessimized performance for every application. -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 Stian Low <wineryyyyy@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |wineryyyyy@gmail.com --- Comment #6 from Stian Low <wineryyyyy@gmail.com> --- Is this analysis/diagnostic AI generated? If so then please state when AI is used for bug reports in the future so that devs are aware that hallucination mistakes may be likely and account for details accordingly. Please retest with at least wine-staging v11.9 or just this one patch from staging v11.9 applied atop latest non-staging: - https://gitlab.winehq.org/wine/wine-staging/-/blob/master/patches/wined3d_un... I recently confirmed this patch seems to still fix most rendering bugs especially flickering for brief test for DJ 2026: - https://bugs.winehq.org/show_bug.cgi?id=55538#c8 - https://bugs.winehq.org/show_bug.cgi?id=57473#c7 If you confirm it also resolves most of your VirtualDJ 2026 rendering bugs then MR-10567 is in process which will eventually replace staging hack and provide an official solution for non-staging: - https://gitlab.winehq.org/wine/wine/-/merge_requests/10567 -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 Géza Búza <bghome@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |FIXED Status|UNCONFIRMED |RESOLVED --- Comment #7 from Géza Búza <bghome@gmail.com> --- Thank you both for looking into this issue.
Is this analysis/diagnostic AI generated? Yes, I used AI to analyze wine logs. Sorry I haven't mentioned that it's not 100% sure, but rather a suspicion.
Please retest with at least wine-staging v11.9 or just this one patch from staging v11.9 applied atop latest non-staging
I compiled wine 11.9 with that patch applied. I am happy to confirm that all previous UI glitches have disappeared and I haven't noticed any new one when testing VirtualDJ. I'm looking forward to see it in the stable branch. Thank you very much for all the effort went into this. -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 --- Comment #8 from Rafał Mużyło <galtgendo@o2.pl> --- (In reply to Géza Búza from comment #7)
I compiled wine 11.9 with that patch applied. I am happy to confirm that all previous UI glitches have disappeared and I haven't noticed any new one when testing VirtualDJ.
For the future, you should usually wait with resolving as FIXED till such mr is actually merged. -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 --- Comment #9 from Stian Low <wineryyyyy@gmail.com> --- (In reply to Rafał Mużyło from comment #8)
For the future, you should usually wait with resolving as FIXED till such mr is actually merged.
Agreed but it may be more appropriate to close as duplicate of bug-57473. Technically the description seems wider scoped than bug-57473 but all seem to fall within the same bug and fix. -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 Zeb Figura <z.figura12@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Resolution|FIXED |DUPLICATE --- Comment #10 from Zeb Figura <z.figura12@gmail.com> --- *** This bug has been marked as a duplicate of bug 57473 *** -- 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.
http://bugs.winehq.org/show_bug.cgi?id=60207 Alistair Leslie-Hughes <leslie_alistair@hotmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |CLOSED --- Comment #11 from Alistair Leslie-Hughes <leslie_alistair@hotmail.com> --- Closing duplicate. -- 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.
participants (1)
-
WineHQ Bugzilla