Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53947
Improve performance of GdipDrawImagePointsRect by:
1. avoiding multiplication and use addition where it is possible.
2. avoid calculating `GdipInvertMatrix` if it is not used.
3. avoid not needed TransformMatrixPoints
I divided MR to several commits, to better undestand what is going on.
Application for testing (it needs logo.jpg file):
[gdiplusdrawimagepoints.exe](/uploads/545ff7d8ab1d60386366f64999346825/gdiplusdrawimagepoints.exe)
--
v11: gdiplus: Improve performance of DrawImagePointsRect by avoid TransformMatrixPoints
gdiplus: use float increment instead of calculation to impove perf
gdiplus: use iterator instead calculate pointer position every time
https://gitlab.winehq.org/wine/wine/-/merge_requests/2864
This fixes a performance regression introduced during state redesign shortly after Wine 5.0.
Some games create a great amount of lights (around 1000 and growing) and touch them quite often. That results in each light being relayed to CS thread before each draw which is taking a great amount of time (performance drop in Nosferatu: The Wrath of Malachi from ~150 fps to ~10-15 at start location; that's with another unrelated regression related to streaming buffer management sorted out).
It is also possible to use bitmasks like for other states, but then with these lights amount even iterating over the full set of lights during stateblock apply leads to noticable performance drop.
With this patchset Nosferatu reaches ~180 fps on the same place (~115 on Windows on the same machine, with the difference being probably due to SWVP).
--
v4: wined3d: Use RB tree for storing lights.
wined3d: Track per light state changes in stateblock.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2833
Toolbar buttons won't adjust its size to fit the DPI setting. This two patches set a DPI-considered size to those buttons to make them look better in HiDPI.
Here are some comparisons on Wine with 192 DPI:
![get_open_file_before](/uploads/3e786396666fd84d824a4fa1e881d712/get_open_file_before.png)
vs
![get_open_file_after](/uploads/f6f3ed910e026d94635ba9cae8f1cc81/get_open_file_after.png)
![item_dialog_before](/uploads/936fab928adb54a3bdf055190332c30d/item_dialog_before.png)
vs
![item_dialog_after](/uploads/f74242d52dc461097368897982b0273b/item_dialog_after.png)
--
v2: comdlg32: Set a size for toolbar buttons of the file access dialog.
comdlg32: Calculate button height of toolbar with DPI for item dialog.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2849
Pass struct hlsl_constant_value to folding functions, in preparation for
creating the destination constant instruction from that value.
--
v2: vkd3d-shader/hlsl: Pass hlsl_constant_value and hlsl_type pointers to fold_nequal().
vkd3d-shader/hlsl: Pass hlsl_constant_value and hlsl_type pointers to fold_mul().
vkd3d-shader/hlsl: Pass hlsl_constant_value and hlsl_type pointers to fold_add().
vkd3d-shader/hlsl: Pass hlsl_constant_value and hlsl_type pointers to fold_neg().
vkd3d-shader/hlsl: Pass hlsl_constant_value and hlsl_type pointers to fold_cast().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/205
Fix Cafe Stella (SteamID: 1829980) Flowchart crashes once there are 2 things on it.
--
v4: gdiplus: Support playing back pen custom end line cap.
gdiplus: Support playing back pen custom start line cap.
gdiplus: Support recording pen custom end line cap.
gdiplus: Support recording pen custom start line cap.
gdiplus/tests: Add pen custom line cap record and play back tests.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2870
We test once above that the source does not use the existing allocator, but then
implicitly release the allocator we are testing against (when the source assigns
a new allocator to the sink). As a result, these ok() statements were testing
that newly allocated allocators had a different address than the original
allocator, which of course sometimes fails.
Since we don't need to perform this test more than once anyway, just get rid of
the offending ok() statements.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/2885
This MR introduces the driver mechanisms to handle dynamic events from the Wayland compositor, using wl_output events as the guiding use case (i.e., we want to update the win32u display settings when the host settings change).
In this design we create a dedicated thread to read and dispatch Wayland events received from the compositor. If a Wayland event handler wants some code to be run in the context of a particular HWND's thread, it can add an internal event to a custom queue we have for each (GUI enabled) thread. The ProcessEvents driver callback processes internal events from that queue. In order to wake up waiting threads we use a pipe to notify about new internal events, with the read end acting as the thread's host queue fd. This is similar to how winemac.drv works.
We use the aforementioned mechanisms to queue win32u display device updates to the desktop window thread. Since there are many pieces that need to fall into place, this MR gradually reaches the final design:
1. We first introduce the dedicated read/dispatch thread and handle events (and also display device updates if in the desktop process) in that thread.
2. We ensure access to Wayland output information is thread-safe and consistent (since in step 3 we will need to access it from a different thread).
3. We finally introduce per-thread internal event queues and, if we are in the desktop process, queue the display device update to the desktop window thread internal event queue. Note that the main portion of the wl_output event code is still handled in the dedicated read/dispatch thread.
--
v5: winewayland.drv: Update desktop window size on display changes.
winewayland.drv: Update display devices from the desktop window thread.
https://gitlab.winehq.org/wine/wine/-/merge_requests/2712