Certain games have started using the newest GameInput API and linking to GameInput.dll. Adding a stub library allows these games to launch and enables them to fall back to the DirectInput API if `GameInputCreate` returns an error.
Affected games: Le Mans Ultimate
--
v2: gameinput: Add stub dll.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8338
When using native xinput in WRC9, vccorlib is needed to make sure xinput doesn't crash.
--
v2: wincorlib: Add stub for platform_details_uninit_data.
wincorlib: Add stub for platform_details_init_data.
vccorlib140: Add stub dll.
wincorlib: Add stub dll.
https://gitlab.winehq.org/wine/wine/-/merge_requests/3334
@alexhenrie @zhiyi
The corresponding Windows test demo is as follows:
[test_DrawTextExW.exe](/uploads/ff1eafc9c58ac03b598699a93136484c/test_DrawTextExW.exe)
[test_DrawTextExW.c](/uploads/a41719a33c2ee0e057c911933bf55180/test_DrawTextExW.c)
Signed-off-by: chenjiangyi <chenjiangyi(a)uniontech.com>
Change-Id: I64052ba8aa8161ad83c1811d642aedbe462ef5ea
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/8177
This is not the right fix, and I need some help. Let me explain.
`session_submit_command` checks that:
1. `session->commands` is empty, and
2. `SESSION_FLAG_PENDING_COMMAND` is NOT set
before submitting the `session_op`. The assumption is, if there are queued commands, or if there is a command currently running, that pending command will submit subsequent commands when it completes.
However, in this call chain:
```
#0 0x00006fffe1d27ad7 in create_async_result (object=object@entry=0x0, callback=callback@entry=0x7e62489f1c08,
state=state@entry=0x7e61cb5322b0, out=out@entry=0x7e6242bac7a0) at ../dlls/rtworkq/queue.c:1229
#1 0x00006fffe1d222d5 in RtwqCreateAsyncResult (object=object@entry=0x0, callback=callback@entry=0x7e62489f1c08,
state=state@entry=0x7e61cb5322b0, out=out@entry=0x7e6242bac7a0) at ../dlls/rtworkq/queue.c:1245
#2 0x00006fffd45e2096 in MFPutWorkItem (queue=queue@entry=1, callback=callback@entry=0x7e62489f1c08,
state=state@entry=0x7e61cb5322b0) at ../dlls/mfplat/queue.c:46
#3 0x00006fffe41244ee in session_command_complete (session=0x7e62489f1be0) at ../dlls/mf/session.c:975
#4 0x00006fffe412d00f in session_reset (session=session@entry=0x7e62489f1be0) at ../dlls/mf/session.c:1051
#5 0x00006fffe41299fc in session_handle_source_shutdown (session=session@entry=0x7e62489f1be0)
at ../dlls/mf/session.c:2957
#6 0x00006fffe4126e90 in session_events_callback_Invoke (iface=0x7e62489f1c20, result=<optimized out>)
at ../dlls/mf/session.c:4445
```
nowhere was the `SESSION_FLAG_PENDING_COMMAND` flag set. In addition to that, `session_events_callback_Invoke` is not a command. So this could happend:
```
Thread 1 | Thread 2
call session_events_callback_Invoke |
| call session_submit_command
| <critical section>
| list_empty(&session->commands) is true, and PENDING_COMMAND not set
| MFPutWorkItem(op)
| list_add(&session->commands, op) <- (1)
| </critical_section>
call session_handle_source_shutdown |
<critical_section> |
call session_reset |
call session_command_complete |
list_head(&session->commands) |
op is returned because of (1) |
MFPutWorkItem(op) again |
</critical_section> |
```
The result is this op will be executed twice, and also double freed, because `session_commands_callback_Invoke` releases the `op`.
* * *
There is even another way an `op` can be submitted twice, `session_handle_start_error` calls `session_reset`, which already calls `session_command_complete`, and later it calls `session_command_complete_with_event` again. I think a missing return?
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/8270
FFB Autocenter introduced in https://gitlab.winehq.org/wine/wine/-/merge_requests/4911
had one major misunderstanding.
The USB PID standard doesn't actually define any explicit way to
autocenter a device. One could of course use the spring effect with a
deadzone of 0 and dead band of 0. This is what I'm actually working on
for the Linux PID driver (spring + friction/damper).
Some devices implement autocenter in firmware when they receive the
DC Disable Actuators command. Very few, if not just one, implement this
weird autocenter effect on slot 1. This is, from what I can gather, only
implemented on the MS SideWinder joystick(s) and the Windows' USB PID
driver is created around these devices.
Windows PID driver is a bit out of spec, is quite permissive when it
comes to fields missing in the descriptor (basically, only effect types
and their effect type blocks are optional). Another thing it does is
handling of this out-of-spec autocentering for their joysticks.
Funnliy enough, the creator of the Linux PID driver based the initial
code on testing with MS Sidewinder so it's autocentering is supported.
This is where the autocentering mentioned in the MR comes from. It's not
the directinput api that does it but the Windows PID driver. As such,
autocentering on reset should be left to the drivers, not handeled by
Wine.
SDL lacks full reset support and Linux is even more barebones, whre it's
not even possible to query the device state, effects etc (something I'm
working on slowly). As such, when games send out RESET to prepare the
device, the device starts autocentering for no good reason and the
effect is not removed once other effect are uploaded and played which
would be the case for MS sidewinder.
In any case, even Windows in inconsistent and I think the directinput
documentation has some errors. directinput ffb api is largely based on
USB PID but:


Testing with my Moza Racing R9 wheelbase, the DC Reset PID command is
sent, but there's no DC Disable Actuators in sight. The games still
call reset then enable actuators though.
tl;dr
Set autocentering to 0 instead of max value when DISFFC_RESET is
received to remove the unwanted autocenter behavior.
Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny(a)gmail.com>
--
v5: winebus: Do not touch autocenter on device init and device reset
https://gitlab.winehq.org/wine/wine/-/merge_requests/8605
--
v3: wined3d: Always divide 1.x projected textures by W in the FFP.
wined3d: Always divide 1.x projected textures by W for shaders.
wined3d: Initialize all remaining FFP texture coordinates to zero.
wined3d: Copy the projective divisor in the FFP vertex pipeline.
wined3d: Alter the texture matrix even for non-projected textures.
wined3d: Pass 3 as the attribute count for generated texcoords.
wined3d: Pass the attribute coordinate count to get_texture_matrix().
wined3d: Handle all invalid values in compute_texture_matrix().
d3d9/tests: Add comprehensive D3DTSS_TEXTURETRANSFORMFLAGS tests.
https://gitlab.winehq.org/wine/wine/-/merge_requests/8641