[PATCH] hidclass.sys: Overwrite queued reports as FIFO instead of LIFO.

Rémi Bernon rbernon at codeweavers.com
Mon Oct 4 03:20:19 CDT 2021


Based on a patch from Ivo Ivanov <logos128 at gmail.com>.

The issue causes severe skipping and non smooth movement tracking in
apps/games, when the HidP/HidD APIs are used to control the device
(joysticks, controllers, steering wheels, etc.).

Usually such devices use constant stream of INPUT reports to report
their coords, so any report skipping or change of the sequence,
when the interested apps are reading, would lead to such issues.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51824
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/hidclass.sys/device.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/dlls/hidclass.sys/device.c b/dlls/hidclass.sys/device.c
index ae8d80c2e95..39ae678d111 100644
--- a/dlls/hidclass.sys/device.c
+++ b/dlls/hidclass.sys/device.c
@@ -190,10 +190,12 @@ static void hid_queue_push_report( struct hid_queue *queue, struct hid_report *r
     KeAcquireSpinLock( &queue->lock, &irql );
     prev = queue->reports[i];
     queue->reports[i] = report;
-    if (next != queue->read_idx) queue->write_idx = next;
+    if (next == queue->read_idx) queue->read_idx = next + 1;
+    if (queue->read_idx >= queue->length) queue->read_idx = 0;
     KeReleaseSpinLock( &queue->lock, irql );
 
     hid_report_decref( prev );
+    queue->write_idx = next;
 }
 
 static struct hid_report *hid_queue_pop_report( struct hid_queue *queue )
-- 
2.33.0




More information about the wine-devel mailing list