들어가는 글
필자는 리눅스를 쓴다. 리눅스에서 VR 게임을 하기 위해 깻잎님의 추천을 받아 WiVRn와 OpenComposite1를 설치했다.
깔고 설정해본 결과 리눅스 네이티브 VR 프로그램(예시: xrgears)과 스팀 게임들은 잘 작동했다.
그러나 문제가 있었다. 非스팀 윈도우 게임들은 작동하지 않았다.
첫시도
스팀 게임들은 VR이 잘 작동한다. 스팀은 Proton을 쓴다. 그러면 非스팀 게임들에서도 Proton을 써보면 되겠네?
umu-launcher
그래서 umu-launcher를 시도해보았다. 스팀에 없는 게임을 Proton으로 실행하고 싶을 때 이용하는 프로그램이다. (다만 정확히는 Value의 Proton이 아닌 Proton GE를 이용하긴 하지만... 이 글에서는 중요하지 않다.)
Proton은 OpenXR/VR 지원이 내장되어 있다. 그래서 WiVRn의 SteamVR 문서에 따라 아래 환경변수만 설정하고 실행하면 되리라 예상했는데 안 됐다.
PRESSURE_VESSEL_FILESYSTEMS_RW=/run/user/1000/wivrn/comp_ipc
XR_RUNTIME_JSON=/run/host/usr/share/openxr/1/openxr_wivrn.json
왜일까?
원인
열심히 검색을 해보니 Proton에서 OpenVR/XR를 쓰려면 Steam이 실행되어야 하고, umu launcher는 Steam을 기본적으로 실행하지 않기 때문이다.
이걸 어떻게 하면 최소한의 수정으로 해결할 수 있을까?
해결책: 그러면 Steam을 실행하면 되잖아?
간단하다. 그냥 Steam을 실행하면 된다.
일단 Proton이 어디 있는 지 확인해야 한다. 다음 명령어를 실행해서 디버그 로그를 확인하자. (뒤에 /tmp/2q3ef32t
부분은 아무렇게나 치면 된다.)
UMU_LOG=debug umu-run /tmp/2q3ef32t
그러면 다음과 같이 콘솔 로그에서 proton
위치를 확인할 수 있다. (예시: /home/foo/.local/share/Steam/compatibilitytools.d/UMU-Proton-9.0-4e/proton
)
[umu.umu_run:887] DEBUG: (PosixPath('/home/foo/.local/share/umu/steamrt3/umu'), '--verb', 'waitforexitandrun', '--', PosixPath('/home/foo/.local/share/umu/steamrt3/umu-shim'), PosixPath('/home/foo/.local/share/Steam/compatibilitytools.d/UMU-Proton-9.0-4e/proton'), 'waitforexitandrun', './asdf')
해당 proton
파일을 에디터로 열면 다음 코드를 확인할 수 있다.
# CoD: Black Ops 3 workaround
if os.environ.get("SteamGameId", 0) in [
"311210", # CoD: Black Ops 3
"1549250", # Undecember
]:
argv = [g_proton.wine_bin, "c:\\Program Files (x86)\\Steam\\steam.exe"]
이걸 다음과 같이 수정한다.
if os.environ.get("UMU_RUN_STEAM", 0) == "1":
argv = [g_proton.wine64_bin, "c:\\windows\\system32\\steam.exe"]
# CoD: Black Ops 3 workaround
elif os.environ.get("SteamGameId", 0) in [
"311210", # CoD: Black Ops 3
"1549250", # Undecember
]:
argv = [g_proton.wine_bin, "c:\\Program Files (x86)\\Steam\\steam.exe"]
그리고 UMU_RUN_STEAM
환경변수와 WiVRn 환경변수를 설정하여 umu launcher로 게임을 실행한다. 다음 스크립트를 참고하자.
#!/bin/sh
export UMU_RUN_STEAM=1
export PRESSURE_VESSEL_FILESYSTEMS_RW=/run/user/1000/wivrn/comp_ipc
export XR_RUNTIME_JSON=/run/host/usr/share/openxr/1/openxr_wivrn.json
export PRESSURE_VESSEL_IMPORT_OPENXR_1_RUNTIMES=1
umu-run ./Game.exe
그러면 잘 된다.
소감
근본적인 해결책은 아니지만 일단 간단히 해결할 수 있는 방법이다. 다른 분들에게 도움이 됐으면 좋겠다...