ValveSoftware / Proton

Compatibility tool for Steam Play based on Wine and additional components
Other
24.63k stars 1.07k forks source link

Add some option or approach to use taskset to single CPU but recursively, such that it actually works, but for Proton #7719

Closed ell1e closed 6 months ago

ell1e commented 6 months ago

Feature Request

I confirm:

Description

Divinity Original Sin 2 is completely broken on some setups with Proton, unless limited to one CPU. It is basically impossible for even an advanced user to figure out how to do this via the "Launch Options":

  1. taskset -c 0 %command% doesn't seem to apply and the game crashes anyway, I assume since it probably only applies to the launcher and not the game started from within the launcher.

  2. taskset -c 0 "Z:/path/to/game/bin/EoCApp.exe" doesn't work because proton doesn't seem to understand what to do with that

There seem to be multiple big annoyances that ultimately make this near impossible to figure out:

  1. There is no info available in the "Launch Options" dialog what I need to enter into "Launch Options" to launch a different exe with proton but to still prefix it with something else that is a linux-native command.

  2. There is no info available in the "Launch Options" dialog on how to specify a command relative to the app's install dir, like via something like %installdir% (made-up suggestion, i don't think it exists or works that way but it would make specifying the .exe path less of a nuisance to figure out).

  3. There is no toggle of any kind for limiting a game to one CPU core without such manual launch command changes, which seems to be a commonly required workaround.

  4. The page on the "Launch Options" generally seems pretty useless and doesn't even explain %command% let alone anything proton related: https://help.steampowered.com/en/faqs/view/7D01-D2DD-D75E-2955

Justification [optional]

Would make games playable if any way to make this work actually worked out. Like Divinity Original Sin 2 where it doesn't seem like Proton devs can reliably figure out how to not make it crash if running multithreaded.

Risks [optional]

There could probably be many confusing ways to implement this that would confuse users. Easiest for the user would probably be a simple toggle in the compatibility options tab that applies a one core limit to the launched process and all subprocesses in the whole pressure vessel sandbox, which I heard you're supposedly using on Linux. Second best would be to somehow recognize taskset -c 0 "Z:/.../some/path/to/windowsprogram.exe" and run that via proton rather than directly, but maybe that's too specific and weird to implement. Third best to provide any sort of tooltip or info inside the "Launch Options" dialog on how to write such a command manually.

References [optional]

kisak-valve commented 6 months ago

Hello @ell1e, please see the discussion on #5927. You can use the WINE_CPU_TOPOLOGY environment variable to limit the CPU cores available to games.

ell1e commented 6 months ago

Thanks so much for responding! Does that mean WINE_CPU_TOPOLOGY=0 %command% should work? Sadly it also doesn't seem to, inside Steam this still crashes. Since taskset -c 0 wine ... outside of Steam works, is it possible that something with e.g. pressure vessel is conflicting with this?

kisak-valve commented 6 months ago

Total core count should start with 1, not index 0. Blind guess that you're seeing a regression or other issue that's unrelated to CPU core count.

ell1e commented 6 months ago

You're right, I just retried outside of Steam and it's also crashing no matter if taskset is used or not. The one time it didn't was probably just random.

ell1e commented 6 months ago

For what it's worth, it still looks like an obvious way to launch a different .exe in proton is missing. This can be required e.g. to skip launchers.

Also, it would be nice if https://help.steampowered.com/en/faqs/view/7D01-D2DD-D75E-2955 listed common workaround options like WINE_CPU_TOPOLOGY (while it didn't end up helping me, it seems to be a common workaround).