[PATCH 1/5] winebus.sys: Report WINEBUS\WINE_COMP_HID compatible id.
rbernon at codeweavers.com
Wed Aug 18 11:50:20 CDT 2021
On 8/18/21 5:52 PM, Zebediah Figura (she/her) wrote:
> I have a few questions:
> * How will dinput (or winmm) expose these devices?
For dinput, it should enumerate the HID device interface class, so for
XInput compatible devices, it will enumerate the bogus "&IG_" devices,
in addition to non-XInput compatible devices. Applications are expected
to check this marker to de-duplicate the XInput gamepads, as described
I don't know about winmm, but if it can be implemented on top of HID
then it'll be the same.
Both will then be limited by the XInput bogus HID support, like on
Windows. And they won't have force-feedback support for them for
instance (although XInput, using the internal device, will have it).
We could decide to overcome that limitation by enumerating the XINPUT
device interface class, but I don't think it's how it's supposed to work.
> * How will we expose composite vs. non-composite devices from winebus?
I don't know, is there going to be any?
On winebus.sys I think composite devices are just going to be enumerated
on the unix bus level as separate devices, with different "input"
numbers. So we should see a "&MI_00", "&MI_01", "&MI_02" winebus.sys
device and so on.
If one of those is supposed to be XInput compatible, the xinput.sys
driver should match the compatible ID, and take it over instead of
winehid.sys, create a corresponding "&IG_00" (or "&IG_01", etc) HID
device, and an internal device on the XINPUT\ bus.
> * What potential need is there to duplicate winebus devices that you
> refer to? As far as I understand we don't currently duplicate anything.
We don't, but then we have to decide whether a device is exposed as a
"mapped" gamepad, or not. The "mapped" version is supposed to mimic the
XInput bogus HID devices, in order for applications to be happy when the
look at the HID capabilities and reports.
Because of this, the "mapped" devices are limited, possibly not exposing
all their axes and buttons in the HID report descriptor, and changing
anything there may break applications.
Duplicating the devices, or forking them like done here, let us have a
full featured HID device for internal use, while exposing the same bogus
thing native exposes publicly (and not use it ourselves).
> * And perhaps more generally: from my time working on Proton, although I
> haven't worked on controller support recently, I vaguely
> understand/remember that some games are very picky about what is and
> isn't reported as an xinput device, and also whether the same device is
> reported via dinput. Would it be possible for you to summarize the
> relevant problems there, so that we have that additional context?
Well as far as I could see there's all sorts of issues, starting with
SDL enabling various hacks when they detect XInput devices. I believe
they support the XInput API, but not only, and they also have support
for the XInput HID devices through WM_INPUT messages.
They are trying very hard to support their bogus HID reports, and I
think we can expect other input middleware to do as well.
More specifically, they try to workaround two issues:
* The guide button of the XBox controller, which is not supposed to be
exposed on the bogus HID reports, but should be obviously supported
internally by XInput.
* The two triggers axes, which are supposed to be combined together in
the bogus HID report, in a single Z axis. This allows compatibility for
XBox gamepads with old games still using DInput, and where the triggers
were effectively combined in a single DInput axis.
However, XInput needs to have the two separate triggers internally, so
we already report them separately, as an incompatible hack, and
implementing our DInput on top of that would break such old games which
depend on the triggers to be combined.
> * In this patch specifically, is there any reason to keep the old
> hardware IDs around?
The internal bus hardware IDs are probably not really useful, and I
intend to replace them with a common "WINEBUS\VID_xxxx&PID_xxxx"
hardware IDs later on, in order to match these in xinput.sys and remove
the need to check for XBox gamepad VID/PID in winebus.sys.
The internal bus names in the device IDs may be helpful to determine
which bus a device comes from, although I don't really think it matters.
I was kind of going to keep them around though.
Rémi Bernon <rbernon at codeweavers.com>
More information about the wine-devel