Changelog
Source: https://github.com/ryzendew/Affinity-Wine-Builder/commits/main/
Scope: Wine 11.18 added as a new build target. Wine 11.19 added as a new build target with the Affinity 3.3 patch set rebased and extended to 0085. CI now builds only 11.18 and 11.19.
Attribution below follows commit authorship. jfacemyer is his work. Mattscreative is my work.
His work — jfacemyer
Wine 11.16 baseline, for context — 2026-10-02 — d4502f1
Build-Wine-11.16.sh plus patches/wine-11.16/0001-0049. ElementalWarrior base carried as 0001-0031. Affinity set added as 0032-0049. This is the set both later versions build on. Tested with Affinity 3.3.0.4850 on Intel Arc A750 with vkd3d-proton.
Wine 11.18 base — 2026-10-02 — 88b674f
New Build-Wine-11.18.sh. patches/wine-11.18/0001-0031 is the ElementalWarrior base, carried over unchanged.
0001-downgrade-dxcore-to-10_8: skipped on 11.18, reports reversed. Leaves 10.8 sources for0002/0006. Same result as 11.16.0004-vkd3d-shader-zero-pad-output-signature: skipped on 11.18. Upstream bundled vkd3d already has all seven hunks.
0032-0049 is the Affinity set. Fifteen files byte-identical to 11.16. Three ported for upstream 09eba117, which moved winmd data into struct winmd. 0033 drops one fix, now upstream as 8b963e98.
What each patch does:
0032-wintypes-implement-RoResolveNamespace: implements namespace-to-winmd lookup, most-specific to least-specific. Lets a running Affinity accept a document handed to it, such as double-click in a file manager.0033-widl-metadata-two-fixes: NULL-safe contract lookup for parameterized interfaces such asIMap<K,V>andIIterable<T>. Emitsstatic()MemberRefs for every attribute, not only the first.0034-widl-metadata-fix-sizeofimage: computesSizeOfImagefrom section virtual address plus virtual size. Fixes loader rejection withSTATUS_INVALID_IMAGE_FORMAT.0035-widl-metadata-assembly-name-not-path: assembly and module names use the file name, not the-ooutput path. Required for0032, otherwise the CLR fails later and harder than a stub.0036-widl-metadata-assemblyref-nested-namespaces: resolves nested namespaces to the parent assembly with ancestor walk-up. Excludes the current module namespace.0037-widl-metadata-encode-interfaces-and-generics: keeps type arguments forELEMENT_TYPE_GENERICINSTviawinmd_params. Correct generic interface encoding.0038-winex11-move-owned-tool-windows-internally: owned tool windows use win32u move loop instead of window-manager move. Restores mouse messages during drag so floating panels can find dock targets. Main windows still use the window manager.0039-win32u-end-move-loop-when-button-released: polls button state each loop iteration for mouse-initiated moves. Fixes stuckGUI_INMOVESIZEcapture when the app consumesWM_LBUTTONUP.0040-win32u-end-move-loop-when-the-window-is-destroyed: ends move/size loop when the moved window is destroyed mid-drag. Fixes panel docking then jumping back out, and swallowedWM_LBUTTONUPleaving drag adornments up.0041-server-do-not-treat-the-desktop-window-as-a-foreground-process: stops recording explorer.exe as foreground when focus leaves Wine. FixesSetForegroundWindowreturning access denied on file-manager double-click open.0042-winex11-set-net-wm-state-modal-for-modal-dialogs: adds_NET_WM_STATE_MODALand recomputes it when ownerWS_DISABLEDchanges. Fixes modal dialog stacking below its disabled owner, seen on Export dialog under Plasma 6.0043-comdlg32-portal-dialog-modal-parented-and-titled: portal file path disables the owner for the dialog lifetime, pumps messages to stay repainting, blocks re-entrant input. Prevents second Export while chooser is open.0044-winex11-take-focus-offered-for-disabled-windows: acceptsWM_TAKE_FOCUSeven when disabled. Fixes dead keyboard when portal returns focus to a disabled owner under KWin null-focus.0045-comdlg32-affinity-file-chooser-folders: tracks real appSetDefaultFoldervs synthesized Desktop default. UnescapesRecentFiles.xmlentities so portal gets absolutecurrent_folder. Fixes Save As folder and dialog opening in wrong place.0046-comdlg32-restore-focus-after-the-portal-dialog: saves and restores focused control across portal dialog. Enable-disable cycle otherwise leaves focus nowhere. Distinct from focus-loss fixes.0047-ole32-dodragdrop-handles-mouse-input-itself: drag loop tracks mouse itself instead of dispatching. Fixes Studio tab reorderNullReferenceExceptionwhen Affinity recaptures mouse mid-drag.0048-comdlg32-name-the-application-in-every-portal-dialog-title: appends(exe)to app-titled portal dialogs. Lets keep-above window rules match, needed under Wayland where portal ignores X11 parent.0049-ntdll-finish-process-exit-instead-of-waiting-on-orphaned-srw-locks: from GE-Proton. Finishes termination instead of blocking on orphaned SRW during detach. Fixes Affinity 3.3 never exiting.
Verified in commit message: no fuzz on pristine wine-11.18.tar.xz, winmds validate, prefix upgrade keeps fonts, cold and warm opens work, close exits.
Wine 11.19 rebase, 0032-0073 — 2026-10-05 — 8ba7871, merged 2026-10-10 as PR 10 d31bc05
ElementalWarrior 0001-0031 unchanged. 0001 and 0004 skipped as on 11.18. Affinity set rebased to 0032-0073, applies with no fuzz.
New since 11.18 in this range, by file:
0049-d2d1-cache-path-geometry-close-and-cut-its-quadratic-work: cachesClose()results keyed on full input, LRU 24 MiB. Skips distant segment pairs, buckets polygon edges by y, double-precision in-circle filter. Fixes about 0.4 s per redraw on ruler-label heavy documents.0050-opencl-deliver-event-callbacks-from-a-dispatcher-thread-and-flush: registers host-driver callbacks, queues them, runs them on one Wine thread in order. Restores realclFlush. AddsclSVMAlloc/clSVMFree. Fixes startup hang with OpenCL on real GPU. Filter exports about 30 percent faster on Arc A750.0051-wined3d-report-the-vulkan-fixed-function-caps-again: restores upstream FFP caps reverted by base0009. Lifts WPF from tier 0 CPU raster to tier 2 D3D9. Must ship with presentation fixes that follow.0052-wined3d-offset-the-vulkan-viewport-for-d3d9-pixel-centers: half-pixel viewport shift for integer pixel centers, matching GL backend. Fixes blurred edges and soft text on Vulkan d3d9.0053-wined3d-clear-vulkan-swapchain-handles-when-destroying-them: NULLs destroyed swapchain handles and pointers. Fixes crash on failed recreate and divide-by-zero blit during popup teardown.0054-wined3d-create-vulkan-swapchains-on-first-use-present-partial-copies-whole: defers Vulkan swapchain creation to first present. Fixes layered WPF popups showing as black boxes. Presents whole client area for eligible partial COPY presents.0055-wined3d-present-a-copy-swapchains-last-frame-again: re-presents COPY frame at 5 ms and 45 ms on empty command queue. Pushes frame out under Xwayland Mesa WSI. Fixes one-click-behind tool highlight and empty studio panels.0056-win32u-wait-for-offscreen-vulkan-presents-before-copying-them: waits withVK_KHR_present_wait, capped at 100 ms, before offscreen copy. Fixes canvas showing previous frame and stale color-picker zoom.0057-winex11-manage-owned-windows-that-are-neither-popups-nor-topmost: manages borderless owned windows such as sub-tool panel. Fixes panel staying above other apps on Wayland. Keeps it out of pager and Alt-Tab.0058-winex11-drop-window-manager-attention-for-owned-windows-shown-inactive: clears wrongful attention mark onSWP_NOACTIVATEowned windows unlessFlashWindowExasked. Fixes orange taskbar highlight when panel is up.0059-winex11-the-modal-dialog-is-the-owners-last-active-popup: uses last active popup instead of first enabled popup for modal state. Fixes palette wrongly marked modal and nested dialogs losing modal state.0060-winex11-offered-focus-for-a-disabled-window-activate-its-dialog: focuses last active popup when offered window is disabled. Raises dialog. Fixes recovery prompt going behind startup dialog on click or Alt-Tab.0061-winex11-do-not-draw-a-window-surface-over-client-surface-windows: draws withClipByChildren. Fixes 572-725 ms white flash at startup between splash and interface.0062-win32u-do-not-copy-window-surface-bits-over-a-client-surface: leaves client area out of old-surface copy when client surface takes over. Fixes white prompts for 1-2 s on busy thread.0063-wined3d-only-send-the-state-that-changed-when-switching-device-context-state: diffs device-context state and sends changed ranges only. UI thread 2.87 s to 1.95 s and command thread 3.73 s to 2.74 s over a 4 s brush stroke in commit measurement.0064-win32u-copy-presents-to-offscreen-surfaces-on-a-helper-thread: moves offscreen present wait plus copy off presenting thread. Brush lag 193-253 ms to 110-122 ms in commit measurement. BumpsWINE_VULKAN_DRIVER_VERSIONto 49.0065-winex11-move-owned-windows-without-a-caption-internally-too: captionless owned windows use internal move loop. Restores dock adorner and pinning for sub-tool panel grip drags.0066-winex11-keep-a-client-windows-last-frame-while-its-surface-goes-offscreen: clears background before redirect so last frame persists until first copy. Fixes 65-90 ms black or white flash opening first document.0067-win32u-winex11-clip-a-new-window-surface-before-its-first-flush: sets clip before shape flush, clips empty region out. Fixes white frame when surface goes offscreen and on dialogs.0068-ntdll-fail-to-create-a-stream-of-an-existing-file: returns invalid name forfile:streamwhen base exists. Stops leaving<name>~lock~:com.dropbox.ignoredfiles beside every opened document. Existing colon names still open and delete.0069-win32u-dont-activate-a-noactivate-window-when-the-active-one-goes: skipsWS_EX_NOACTIVATEincan_activate_window. Fixes studio list closing after every reorder.0070-wined3d-put-small-buffers-in-mappable-device-memory: places small GPU-only buffers up to 64 KiB in host-visible device memory on resizable BAR. Removes about 3000 staging copies per frame. Brush behind cursor 106 ms to 49 ms with OpenCL off and 121 ms to 61 ms with OpenCL on in commit measurement, together with0051.0071-wined3d-present-vsynced-swapchains-in-mailbox-mode: uses mailbox where available for non-zero intervals. Present queue 37-51 ms to under 1 ms in commit measurement.MailboxPresentregistry value restores FIFO.0072-winex11-draw-unclipped-child-windows-in-their-toplevel: draws unclipped child client window as X child of toplevel. Canvas no longer pays offscreen copy plus Xwayland timer. Brush behind cursor 51 ms to 35 ms with OpenCL off and 62 ms to 54 ms with OpenCL on in commit measurement. Fixes size-vs-origin clipping comparison.0073-win32u-winex11-mouse-leave-when-another-application-covers-the-pointer: driver reports leave onLeaveNotifyand cross-app focus change. SendsWM_MOUSELEAVE. Fixes tooltips staying above other apps after Alt-Tab.
Direct2D throughput, 0074 — 2026-10-06 — 8285013
0074-d2d1-upload-geometry-through-a-reused-dynamic-buffer: one dynamic buffer per device context, singleNO_OVERWRITEmap per draw, rename on wrap. Replaces per-primitive index plus vertex buffer create, upload, release. Conformance unchanged. Panning CPU per frame 7.4 ms to 6.3 ms on command thread and 6.6 ms to 5.7 ms on UI thread in commit measurement. Brush behind cursor 59 ms to 51 ms.
Draw overhead and heap stall, 0075-0077 — 2026-10-06 — 94384a7
0075-d2d1-keep-our-device-context-state-bound-across-draws: keeps D2D state bound from first draw toEndDraw,Flush,SetTarget, destroy, or competing context. Removes two full state switches per primitive.WINE_D2D_NO_STATE_BATCHING=1restores old path.0076-d2d1-write-constant-data-to-a-reused-buffer-bound-with-offsets: appends constants to one dynamic buffer withNO_OVERWRITE, binds slices withVSSetConstantBuffers1/PSSetConstantBuffers1. Removes per-draw rename allocation.0077-ntdll-bound-the-free-list-scan-in-find_free_block: checks at most 32 blocks in first list, then takes next non-empty list. Fixes UI thread at 96 percent in heap scan opening 100 MB SVG with 1.87 M rectangles.
Stroke path and command rate, 0078-0081 — 2026-10-07 — da482df
0078-d2d1-build-path-outlines-when-first-stroked: builds stroke outline on first stroke, not atEndFigure. Removes outline array churn on fill-only paths. Glyph and ruler rebuild path cited in commit.0079-d2d1-draw-lines-without-a-path-geometry: builds line outline directly, four vertices and two triangles. Removes per-line geometry, sink, figure,Close, and release. Ruler ticks path. Median brush behind cursor 30 ms to 26 ms on top of prior work in commit measurement.0080-d2d1-wined3d-fewer-commands-per-direct2d-draw: skips identical viewport commands, binds upload buffer at offset zero with start index plus base vertex, packs vertex plus pixel constants into one map. d2d1, d3d11, and d3d9 visual conformance unchanged.0081-wined3d-spin-less-before-the-command-thread-sleeps: spins 200 times instead of 2000 on empty queue. Command-thread CPU per frame lower across drag, node edit, zoom, and typing in commit measurement. Frame rate and latency unchanged.
Color, printing, login on 11.19, 0082-0085 — 2026-10-08 — aac1555
0082-win32u-report-the-sdr-white-level: reports default 80 nits, value 1000. FixesDXRenderer.cpp(1014)E_NOTIMPLpath during device creation.0083-dxgi-d3d11-color-space-semi-stubs: accepts default sRGB inCheckColorSpaceSupportandSetColorSpace1, mirrors d3d12 stubs. Rejects others with invalid argument.0084-winspool-map-printer-connections-to-local-printers: mapsPRINTER_ENUM_CONNECTIONSto local CUPS printers. Fixes Affinity print dialog showing no printers while Notepad lists them.0085-twinapi-appcore-implement-shared-storage-access-manager: implementsSharedStorageAccessManagerwith interfaces, class, and registration. Lets second-instance file handoff path resolve. Commit notes file-handoff case not yet tested on 11.19.
My work — Mattscreative
Login the right way plus performance, 11.18 — 2026-10-09 — 3803d5a
Message: Fix login the right way. no janky loader and push performance.
0050-win32u-implement-get-sdr-white-level.patch: same problem as 11.190082. Affinity queries SDR white level during D3D device creation. Wine returned invalid parameter. Reports default 80 nits so hardware path proceeds instead of falling back withDXRenderer.cpp(1014)error.0051-dxgi-d3d11-colorspace-semi-stubs.patch: same problem as 11.190083. Accepts default SDR colorspace, 7 calls and 7 errors in traced session before fix. Wide-gamut and HDR left for later.0052-d2d1-cache-geometry-upload-buffers.patch: per-context freelists, 8 index plus 8 vertex entries, 4 MB cap each. Refills withUpdateSubresourceand explicitD3D11_BOXbounded to request size. Falls back to create and destroy path for uncacheable sizes. Removes about 14k pairedCreateBufferand destroy churn seen in traces. Records bufferByteWidth, not last-write size, so larger reused entries stay safe.- Second
0052-winspool-map-printer-connections-to-local.patch: same problem as 11.190084. Verified with virtual queueAffinityTestover socket. Local query returned 1 printer, connections-only query returned 0 before fix. Later renumbered to0059on 11.18 with no content change. 0053-twinapi-appcore-SharedStorageAccessManager-loginfix.patch: declaresSharedStorageAccessManagerruntime class and static factory.ProcessCommandLineArgumentsreferencesRedeemTokenForFileAsync. CLR resolves all types in a method body at JIT time, so missing type threwTypeLoadExceptioneven on the unrelatedaffinity://OAuth callback path forwarded over named pipe toSingleInstanceThread. Stub lets JIT succeed and login callback proceed. Open-file token branch itself returns failure.- Tooling in same commit: new
Fix-Wine-TLS.sh:58lines, newLog-Affinity-Login.sh:26lines,build-wine.shreworked, new.github/workflows/build-wine-11.18.yml,.circleci/config.ymlupdated, removed bundled PDF.
Merge more patches, 11.18 — 2026-10-10 — f385272
0052-d2d1-cache-geometry-upload-buffers.patchmodified, 50 additions and 18 deletions.0054-RoGetParameterizedTypeInstanceIID.prototype.patchOFFadded but disabled. Prototype only, not applied by build.0055-opencl-populate-info-cache-when-ret-size-is-null.patch: changes info-cache lookup to return hit data and stored size even when caller passes NULL size pointer. Fixes cache miss path for size-query-then-read pattern.0056-opencl-cache-immutable-clgetmemobjectinfo.patch: adds device, platform, and memory-object immutable info cache with hit, miss, and too-small states. Avoids repeated PE to Unix round trips for hammered values.0057-wined3d-vk-add-legacy-ffp-state-representatives.patch: addsstate_noprepresentatives for legacy fixed-function render states on Vulkan fragment pipe. Stopsvalidate_state_tablerepresentative warnings and spurious dirty bit from fallback path.0058-dxgi-do-not-hold-wined3d-mutex-across-window-creation.patch: unlocks global wined3d mutex acrossCreateWindowAin device-window path. Window creation dispatches app code and can fault without releasing the mutex. Device is still private with refcount 1, factory kept alive by caller, inner helper locks wined3d itself. Fixes present thread stalling behind leaked mutex.0059renumber, no content change. See numbering note below.0060-winex11-revert-pass-fullscreen-flag.patch: rebased from 10.11 set onto 11.18. Reverts upstreamis_window_managedfullscreen-flag change. Fixes Affinity Sub-Tools panel appearing above File Explorer and other desktop windows. Eleven of thirteen winex11 hunks and two of three Wayland hunks applied clean, three reworked for 11.18 locals and renamed Wayland owner variable.0061-ntdll-heap-large-block-retention-cache.patch: rebased Neutron large-block retention work verbatim onto 11.18 heap. Ships disabled unlessNEUTRON_HEAP_LARGE_CACHE=1. Added as churn probe withWINEDEBUG=neutronheapcounter path, because perf, gdb,/proc/PID/syscall, and strace were unavailable. Does not collide with0049, which touchessync.cwhile this touchesheap.c.patches/wine-11.18/README.mdupdated with numbering notes:0024/0025are deliberate gaps carried from alt 11.11 set, not deletions. Former duplicate0052winspool entry is now0059.0054ships disabled..gitignoreupdated.
Build scope cut — 2026-10-10 — 75d1b2c
.circleci/config.yml: 9 additions, 9 deletions..github/workflows/build-wine-11.19.yml: renamed path with 13 additions and 13 deletions.- Net effect: build only Wine 11.18 and 11.19.
Counts on main
patches/wine-11.18:0001-0023,0026-0061, plus disabled0054.patchOFFandREADME.md.0024/0025intentionally absent.patches/wine-11.19:0001-0023,0026-0085.0024/0025intentionally absent. 85 patch files total including base.