[PATCH 2/2] hid: Don't sign-extend 16-bit values.

Kai Krakow kai at kaishome.de
Sun Feb 10 12:02:16 CST 2019


Hello!

This change seems to introduce odd behavior in at least some games:
Gamepad axis are mirrored to one side only now. This happens in Shadow
of War (found by me) and Rocket League (reported by a user). I expect
other games to fail in a similar way but didn't test those yet.

I guess the clue is in "_may_ report a logical range"...

I'm using the xpadneo driver with an Xbox One S wireless controller,
and it reports -32768..32767 according to the driver (which follows
the Linux spec on joysticks for this). This used to work perfectly
before this change.

Regards,
Kai

Am Mi., 6. Feb. 2019 um 19:42 Uhr schrieb Aric Stewart <aric at codeweavers.com>:
>
> Signed-off-by: Aric Stewart <aric at codeweavers.com>
>
> On 2/5/19 1:09 PM, Zebediah Figura wrote:
> > From: Zebediah Figura <zfigura at codeweavers.com>
> >
> > Some controllers (including, with the previous patch, any reported
> > through SDL) may report a logical range of [0,65535], which takes up
> > 16 bits but should not be sign-extended.
> >
> > Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
> > ---
> >   dlls/hid/hidp.c | 4 ----
> >   1 file changed, 4 deletions(-)
> >
> > diff --git a/dlls/hid/hidp.c b/dlls/hid/hidp.c
> > index f9978038e3..15d827edf1 100644
> > --- a/dlls/hid/hidp.c
> > +++ b/dlls/hid/hidp.c
> > @@ -277,8 +277,6 @@ NTSTATUS WINAPI HidP_GetScaledUsageValue(HIDP_REPORT_TYPE ReportType, USAGE Usag
> >                                element->valueStartBit, element->bitCount, &rawValue);
> >           if (rc != HIDP_STATUS_SUCCESS)
> >               return rc;
> > -        if (element->caps.value.BitSize == 16)
> > -            rawValue = (short)rawValue;
> >           *UsageValue = rawValue;
> >       }
> >
> > @@ -925,8 +923,6 @@ NTSTATUS WINAPI HidP_GetData(HIDP_REPORT_TYPE ReportType, HIDP_DATA *DataList, U
> >                                        element->valueStartBit, element->bitCount, &v);
> >                   if (rc != HIDP_STATUS_SUCCESS)
> >                       return rc;
> > -                if (element->caps.value.BitSize == 16)
> > -                    v = (short)v;
> >                   DataList[uCount].DataIndex = element->caps.value.u.NotRange.DataIndex;
> >                   DataList[uCount].u.RawValue = v;
> >               }
> >
>
>



More information about the wine-devel mailing list