ValveSoftware / steam-runtime

A runtime environment for Steam applications
Other
1.17k stars 86 forks source link

Steam Linux Runtime does not recognize steering wheel for car games (layer of compatibility) #503

Open geluxred opened 2 years ago

geluxred commented 2 years ago

Hi,

I tried to play with DiRT Rally activating the layer of compatibility Steam Linux Runtime and the game recognize as input a gamepad but not a steering wheel (my wheel is logitech g29)

If I play on linux without this layer of compatibility the game recognize the wheel properly

smcv commented 2 years ago

For input issues, it is usually useful to use steam-runtime-input-monitor. This is a diagnostic tool that comes with the Steam Runtime.

Unplug the steering wheel, then run steam-runtime-input-monitor from a terminal as:

~/.steam/root/ubuntu12_32/steam-runtime/run.sh -- steam-runtime-input-monitor

You'll get lots of JSON describing your other input devices, which you can ignore, followed by {"all-for-now": true}.

Plug in your steering wheel, and you should see some more JSON appear. Press Ctrl+C to exit from the steam-runtime-input-monitor. Everything from {"all-for-now": true} down to the point where you pressed Ctrl+C will be a description of your steering wheel.

Please provide the output as an attachment, gist or code block.

smcv commented 2 years ago

Are you referring to DiRT Rally from 2015, or a later entry from the series?

Many games that were ported to Linux by Feral Interactive bundle their own version of SDL. I suspect that what's happening here might be that the game's bundled version of SDL is too old to have https://github.com/libsdl-org/SDL/issues/3889 and https://github.com/libsdl-org/SDL/pull/4098 included in it.

If that's the problem, then the Steam Runtime developers cannot fix it - only the game's developers can. However, you might be able to work around it by setting the launch options to

SDL_DYNAMIC_API=/usr/lib/x86_64-linux-gnu/libSDL-2.0.so.0 %command%

if it's a 64-bit game, or

SDL_DYNAMIC_API=/usr/lib/i386-linux-gnu/libSDL-2.0.so.0 %command%

if it's 32-bit.

TTimo commented 2 years ago

Note that the compatibility report for Dirt 4 has it set to run under Proton (a specific version even). So the problems may lie with the title to begin with. (I can't confirm if this nugget is relevant without more information from @geluxred, but it seems intentionally switched from it's recommended default runtime)

geluxred commented 2 years ago

Hi,

The game is DiRT Rally from 2015 and it was ported by feral interactive. The game works ok when I activate the layer of compatibility Steam Linux Runtime. The only problem is that the game does not recognize as input a steering wheel, although it recognize a gamepad correctly.

The reason for using Steam Linux Runtime is because the game has stopped working by default but it works fine if I activate Steam Linux Runtime. I have spoken with Feral support and they didn't know anything about Steam Linux Runtime and they have provided me a beta version to activate on Steam which has worked

However it is not the first time that a linux game breaks in some update (of the system or the game) and it works fine if I active Steam Linux Runtime. I also tried to use proton but the game does not start with the last version of proton (I only test with this). But in the protondb.com the comments says that online does not working.

That's why I think it would be interesting if there were no problems with any type of input because it seems that the games are more stable by not breaking so easily with Steam Linux Runtime. I can try to test other similar games like DiRT 5 or F2017 to see if the problem with wheel is only with DiRT Rally or if it's generic. I have no tried with others games with others devices (X4, Everspace..) to test it (pedals, joystick...), but I could.

The steering wheel does appear in the steam-runtime-input-monitor log, so perhaps nothing can be done by Steam developers. As I already mentioned, Feral support did not know anything about Steam Linux Runtime.

I have tried change the launch options (SDL_DYNAMIC_API) but the result is the same. The game works fine but it does not recognize as input the wheel.

The differences in the json off steam-runtime-input-monitor when I plug the wheel is the next text: ``` { "added" : { "interface_flags" : [ "raw-hid" ], "type_flags" : [ ], "dev_node" : "/dev/hidraw10", "subsystem" : "hidraw", "sys_path" : "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4/1-4:1.0/0003:046D:C24F.000F/hidraw/hidraw10", "bus_type" : "0x0003", "vendor_id" : "0x046d", "product_id" : "0xc24f", "version" : "0x8900", "udev_properties" : [ "DEVNAME=/dev/hidraw10", "DEVPATH=/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4/1-4:1.0/0003:046D:C24F.000F/hidraw/hidraw10", "MAJOR=506", "MINOR=10", "SUBSYSTEM=hidraw" ], "hid_ancestor" : { "sys_path" : "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4/1-4:1.0/0003:046D:C24F.000F", "name" : null, "bus_type" : "0x0003", "vendor_id" : "0x046d", "product_id" : "0xc24f", "uniq" : null }, "usb_device_ancestor" : { "sys_path" : "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4", "vendor_id" : "0x046d", "product_id" : "0xc24f", "version" : "0x8900", "manufacturer" : "Logitech", "product" : "G29 Driving Force Racing Wheel", "serial" : null } } } { "added" : { "interface_flags" : [ "event", "readable", "read-write" ], "type_flags" : [ "joystick" ], "dev_node" : "/dev/input/event19", "subsystem" : "input", "sys_path" : "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4/1-4:1.0/0003:046D:C24F.000F/input/input40/event19", "bus_type" : "0x0003", "vendor_id" : "0x046d", "product_id" : "0xc24f", "version" : "0x0111", "evdev" : { "types" : [ "SYN", "KEY", "ABS", "MSC", "FF" ], "absolute_axes" : [ "X", "Y", "Z", "RZ", "HAT0X", "HAT0Y" ], "relative_axes" : [ ], "keys" : [ "BTN_TRIGGER", "BTN_THUMB", "BTN_THUMB2", "BTN_TOP", "BTN_TOP2", "BTN_PINKIE", "BTN_BASE", "BTN_BASE2", "BTN_BASE3", "BTN_BASE4", "BTN_BASE5", "BTN_BASE6", "BTN_DEAD", "BTN_TRIGGER_HAPPY" ], "input_properties" : [ ] }, "udev_properties" : [ "DEVLINKS=/dev/input/by-path/pci-0000:01:00.0-usb-0:4:1.0-event-joystick /dev/input/by-id/usb-Logitech_G29_Driving_Force_Racing_Wheel-event-joystick", "DEVNAME=/dev/input/event19", "DEVPATH=/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4/1-4:1.0/0003:046D:C24F.000F/input/input40/event19", "ID_BUS=usb", "ID_FOR_SEAT=input-pci-0000_01_00_0-usb-0_4_1_0", "ID_INPUT=1", "ID_INPUT_JOYSTICK=1", "ID_MODEL=G29_Driving_Force_Racing_Wheel", "ID_MODEL_ENC=G29\\x20Driving\\x20Force\\x20Racing\\x20Wheel", "ID_MODEL_ID=c24f", "ID_PATH=pci-0000:01:00.0-usb-0:4:1.0", "ID_PATH_TAG=pci-0000_01_00_0-usb-0_4_1_0", "ID_REVISION=8900", "ID_SERIAL=Logitech_G29_Driving_Force_Racing_Wheel", "ID_TYPE=hid", "ID_USB_DRIVER=usbhid", "ID_USB_INTERFACES=:030000:", "ID_USB_INTERFACE_NUM=00", "ID_VENDOR=Logitech", "ID_VENDOR_ENC=Logitech", "ID_VENDOR_ID=046d", "LIBINPUT_DEVICE_GROUP=3/46d/c24f:usb-0000:01:00.0-4", "MAJOR=13", "MINOR=83", "SUBSYSTEM=input", "TAGS=:snap_scummvm_daemon:seat:snap_scummvm_scummvm:snap_antstream-arcade_antstream-arcade:uaccess:", "USEC_INITIALIZED=17499974563" ], "hid_ancestor" : { "sys_path" : "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4/1-4:1.0/0003:046D:C24F.000F", "name" : null, "bus_type" : "0x0003", "vendor_id" : "0x046d", "product_id" : "0xc24f", "uniq" : null }, "input_ancestor" : { "sys_path" : "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4/1-4:1.0/0003:046D:C24F.000F/input/input40", "name" : "Logitech G29 Driving Force Racing Wheel", "bus_type" : "0x0003", "vendor_id" : "0x046d", "product_id" : "0xc24f", "version" : "0x0111" }, "usb_device_ancestor" : { "sys_path" : "/sys/devices/pci0000:00/0000:00:01.1/0000:01:00.0/usb1/1-4", "vendor_id" : "0x046d", "product_id" : "0xc24f", "version" : "0x8900", "manufacturer" : "Logitech", "product" : "G29 Driving Force Racing Wheel", "serial" : null } } } ```
smcv commented 2 years ago

it seems that the games are more stable by not breaking so easily with Steam Linux Runtime

Yes, that's the idea. Unfortunately it isn't a straightforward "this is always better", because the Steam Linux Runtime needs to use containers to do what it does, and that can interfere with things like device detection, particularly if games bundle their own copy of libraries like SDL.

I have spoken with Feral support and they didn't know anything about Steam Linux Runtime

Please could you give them the address of this issue? It would be useful if I could to talk to someone at Feral, either here or by private email.

and they have provided me a beta version to activate on Steam which has worked

Did they tell you what was different in that beta? I'm hoping that the answer might be as simple as "we upgraded SDL" or something like that...

geluxred commented 2 years ago

Hi, I can reply to the last email whit Support Feral (support@feralinteractive.com) and I can write about this issue and put your email in copy or only sent your address, or I can write a new email only with the subject of layer of compatibility Steam Linux Runtime and Dirt Rally. I do not know what is the better way.

Anyway I think the Feral support people does not seem developers but more like front line customer support, so I don't think it's useful to you if they don't forward you to the developers.

They didn't give me any explanation about the differences, except that the beta version was older. In fact, I asked them if I could publish the solution for other users (I'm reading similar problems in the forums) and they told me that they prefer that each user contact them.

jlegg0 commented 2 years ago

Feral Developer here. I think DiRT Rally includes SDL 2.0.5 as a shared library in the lib directory. I can't remember which SDL version introduced SDL_DYNAMIC_API and saw no mention of it in WhatsNew.txt, but if it is too old for that you can override it by replacing the .so file.

smcv commented 2 years ago

Feral Developer here.

Thanks for responding! I play several Feral-ported games myself, so I'd like to make sure they work nicely with the container runtime - particularly if there are things that we or Feral can do to make a whole category of similar ports work better.

I think the copy of SDL 2.0.5 that DiRT Rally uses by default should be the lib/x86_64/libSDL2-2.0.5.so listed in https://steamdb.info/depot/311365/, am I correct? Also, from the filename it looks like the Linux port of DiRT Rally is a 64-bit game. Is that right?

It looks like SDL_DYNAMIC_API was in SDL 2.0.2 and up, so it should work here. I don't have DiRT Rally in my Steam account, but I use the free/demo version of Hitman (2016) as one of my usual tests for new Steam Runtime versions, and that seems to have the same setup with (a Feral-modified version of?) SDL 2.0.5 in https://steamdb.info/depot/439876/.

However, looking back at my earlier comment, I think the problem is that I got the filename wrong (I wrote libSDL- where I should have said libSDL2-). The launch options that force use of a newer SDL in the Steam Linux Runtime, if this is a 64-bit game, should be:

SDL_DYNAMIC_API=/usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 %command%

or maybe

SDL_DYNAMIC_API="$STEAM_RUNTIME/usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0" %command%

@geluxred, please could you try one of those? (Or @jlegg0, if you have access to a steering wheel or other non-gamepad joystick to try this with.)

I'm hoping that one of those will work in the short term as a workaround to get the container-friendly device detection to be used, and then we can discuss a more long-term-supportable way to achieve the same thing.

jlegg0 commented 2 years ago

I think the copy of SDL 2.0.5 that DiRT Rally uses by default should be the lib/x86_64/libSDL2-2.0.5.so listed in https://steamdb.info/depot/311365/, am I correct? Also, from the filename it looks like the Linux port of DiRT Rally is a 64-bit game. Is that right?

Yes, correct on both accounts.

geluxred commented 2 years ago

Hi,

The request of support is 197301

I tried both options but the game does not recognize steering wheel. Only the version beta has worked .

berarma commented 1 year ago

Put the steering wheel in G27 mode using Oversteer or pyLinuxWheel. Feral ports don't support the G29.