games-on-whales / wolf Goto Github PK
View Code? Open in Web Editor NEWStream virtual desktops and games running in Docker
Home Page: https://games-on-whales.github.io/wolf/stable/
License: MIT License
Stream virtual desktops and games running in Docker
Home Page: https://games-on-whales.github.io/wolf/stable/
License: MIT License
See this recent change in Moonlight: moonlight-stream/moonlight-common-c@dc18608
The basic idea is to properly separate the core of Wolf from the Moonlight protocol:
The main benefit of this approach is that the same underlying core methods (create virtual remote sessions and stream them) could be accessed by any other kind of client, for example:
This would also allow controlling multiple distributed servers (aka: Kubernetes support, as requested by many)
So... a REST API?
A typical REST API could work, but it doesn't cover all the events that are starting from the backend and that needs to be sent to clients, ex: an application stopped running, a pipeline failed, or a remote controller received rumble data.
So... a WebSocket?
A WebSocket allows having a communication channel that is bidirectional, and has the good advantage that can also be used natively by browser based languages. This might be one way forward, but then I discovered something that might be a better fit:
MQTT:
My only concern is how well it'll be suited for carrying mouse/keyboard/joypad inputs where latency is absolutely fundamental.
This still needs to be fleshed out properly, in the meantime, here are a few interesting links:
I've completely forgot about the appassets
API call. We should add (optional) images as paths or base64 to the config file.
We can already parse and decrypt the control stream, we should use the user information that Moonlight is sending.
We should probably use libevdev
to control uinput
; see: kernel.org
At the moment users have to specify the "state" folder in the config.toml
ex: /home/ale/retro:/home/retro:rw
.
Ideally, we should have a way to mount different folders for different sessions so that it resolves to something like: <HOST_STATE_FOLDER>/<SESSION_ID>/<APP_NAME>:/home/retro:rw
.
To keep this as flexible as possible I think we should add an extra option under [[paired_clients]]
:
[[paired_clients]]
app_state_folder = "12345" # Defaults to session_id (which is hash(client_cert))
That app_state_folder
will be concatenated with HOST_STATE_FOLDER
which is a new env variable (so that users don't have to fiddle with the config.toml
when first starting).
This way, by default each user will have his own state folder, but if you want to share the same folders with multiple users you can just override the config.toml
file.
Many moonlight platforms (like Android TV or Apple TVs) will capture the GUIDE button of an attached controller. It would be nice if wolf provided a way to translate a weird combination like Hold select for 5 seconds
or Start+Select
into this button to bring up the Steam Overlay for example more easily.
Anyone wants to craft some nice logo for the project?
On a fresh install of Wolf, the config file has the app_state_folder for each paired client is set to
app_state_folder = ""
This results in that paired client using /etc/wolf as the root folder instead of /etc/woft//
Work Around
This is an issue that has been spun off from the Discord channel.
@Murazaki : It might be good to find a better workflow for providing drivers to Wolf.
On Debian, drivers are pretty old in the main stable repo, and updated ones can be found on CUDA drivers, but do not exactly match manual installation ones.
@ABeltramo : I guess I should go back to look into the Nvidia Docker Toolkit for people that would like to use that
I agree though, it's a bit of a pain point at the moment
@Murazaki : Cuda drivers repo :
https://developer.download.nvidia.com/compute/cuda/repos/
Linux manual installer :
https://download.nvidia.com/XFree86/Linux-x86_64/
right now, latest in cuda packaged installs is 545.23.08.
It doesn't exist as a manual installer.
that breaks the dockerfile and renders wolf unusable
I wanted to make a docker image for debian packages install, but it uses apt-add-repository which is installing a bunch of supplementary stuff
Here it is for Debian Bookworm :
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Debian&target_version=12&target_type=deb_network
More thorough installation steps here :
https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
@juliosueiras : There is one problem though, nvidia driver toolkit doesn’t inject driver in the container and still require a driver installed in the container image itself,
And here, I start with what interventions I made with NVIDIA for the last three years to not require the NVIDIA drivers to run Wayland inside the NVIDIA container toolkit.
What NVIDIA container toolkit does: it's pretty simple. It injects (1) kernel devices, and (2) userspace libraries, into a container. (1) and (2) compose a subset of the driver.
(1) kernel devices: /dev/nvidiaN
, /dev/nvidiactl
, /dev/nvidia-modeset
, /dev/nvidia-uvm
, and /dev/nvidia-uvm-tools
. In addition, /dev/dri/cardX
and /dev/dri/renderDY
, where N, X, and Y depend on the GPU the container toolkit provisions. The /dev/dri
devices were added with NVIDIA/libnvidia-container#118.
(2) userspace libraries:
OpenGL libraries including EGL: '/usr/lib/libGL.so.1', '/usr/lib/libEGL.so.1', '/usr/lib/libGLESv1_CM.so.525.78.01', '/usr/lib/libGLESv2.so.525.78.01', '/usr/lib/libEGL_nvidia.so.0', '/usr/lib/libOpenGL.so.0', '/usr/lib/libGLX.so.0', and '/usr/lib/libGLdispatch.so.0', '/usr/lib/libnvidia-tls.so.525.78.01'
Vulkan libraries: '/usr/lib/libGLX_nvidia.so.0' and the configuration '/etc/vulkan/icd.d/nvidia_icd.json'
EGLStreams-Wayland and GBM-Wayland libraries: '/usr/lib/libnvidia-egl-wayland.so.1' and the config '/usr/share/egl/egl_external_platform.d/10_nvidia_wayland.json' '/usr/lib/libnvidia-egl-gbm.so.1' and the config '/usr/share/egl/egl_external_platform.d/15_nvidia_gbm.json'
NVENC libraries: /usr/lib/libnvidia-encode.so.525.78.01
, which depends on /usr/lib/libnvcuvid.so.525.78.01
, which depends on /usr/lib/x86_64-linux-gnu/libcuda.so.1
VDPAU libraries: /usr/lib/vdpau/libvdpau_nvidia.so.525.78.01
NVFBC libraries: /usr/lib/libnvidia-fbc.so.525.78.01
OPTIX libraries: /usr/lib/libnvoptix.so.1
Not very relevant but of note, perhaps for XWayland: NVIDIA X.Org driver: /usr/lib/xorg/modules/drivers/nvidia_drv.so
, NVIDIA X.org GLX driver: /usr/lib/xorg/modules/extensions/libglxserver_nvidia.so.525.78.01
In many cases, things don't work because the below configuration files are absent inside the container. Without these, applications inside the container don't know which library to call (what each file does is self-explanatory):
The contents of /usr/share/glvnd/egl_vendor.d/10_nvidia.json
:
{
"file_format_version" : "1.0.0",
"ICD" : {
"library_path" : "libEGL_nvidia.so.0"
}
}
The contents of /etc/vulkan/icd.d/nvidia_icd.json
(note that api_version
is variable based on the Driver version):
{
"file_format_version" : "1.0.0",
"ICD": {
"library_path": "libGLX_nvidia.so.0",
"api_version" : "1.3.205"
}
}
The contents of /etc/OpenCL/vendors/nvidia.icd
:
libnvidia-opencl.so.1
The contents of /usr/share/egl/egl_external_platform.d/15_nvidia_gbm.json
:
{
"file_format_version" : "1.0.0",
"ICD" : {
"library_path" : "libnvidia-egl-gbm.so.1"
}
}
The contents of /usr/share/egl/egl_external_platform.d/10_nvidia_wayland.json
:
{
"file_format_version" : "1.0.0",
"ICD" : {
"library_path" : "libnvidia-egl-wayland.so.1"
}
}
I'm pretty sure that now (was different a few months ago), the newest NVIDIA container toolkit provisions all of the required libraries plus the json
configurations for Wayland (not for X11 but you don't have to care).
If only the json
configurations are absent, it's trivial to manually add the above template.
About GStreamer:
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3108
Now, it is correct that NVENC does require CUDA. But that doesn't mean that it requires the whole CUDA Toolkit (separate from the CUDA drivers). The CUDA drivers are the four following libraries installed with the display drivers, independent of the CUDA Toolkit: libcuda.so
, libnvidia-ptxjitcompiler.so
, libnvidia-nvvm.so
, libcudadebugger.so
These versions go with the display drivers, and are all injected into the container by the NVIDIA container toolkit.
GStreamer 1.22 and before in nvcodec
requires just two files of the CUDA Toolkit: libnvrtc.so
and libnvrtc-bulletins.so
. This can be installed from the network repository like the current approach, or be extracted from a PyPi package:
# Extract NVRTC dependency, https://developer.download.nvidia.com/compute/cuda/redist/cuda_nvrtc/LICENSE.txt
cd /tmp && curl -fsSL -o nvidia_cuda_nvrtc_linux_x86_64.whl "https://developer.download.nvidia.com/compute/redist/nvidia-cuda-nvrtc/nvidia_cuda_nvrtc-11.0.221-cp36-cp36m-linux_x86_64.whl" && unzip -joq -d ./nvrtc nvidia_cuda_nvrtc_linux_x86_64.whl && cd nvrtc && chmod 755 libnvrtc* && find . -maxdepth 1 -type f -name "*libnvrtc.so.*" -exec sh -c 'ln -snf $(basename {}) libnvrtc.so' \; && mv -f libnvrtc* /opt/gstreamer/lib/x86_64-linux-gnu/ && cd /tmp && rm -rf /tmp/*
One thing to note here is that libnvrtc.so
is not minor version compatible with CUDA. Thus, it will error on any display driver version older than its corresponding display driver version. However, backwards compatibility always works. Thus, it is a good idea to use the oldest possible libnvrtc.so
version.
Display CUDA
545 - 12.3
535 - 12.2
530 - 12.1
525 - 12.0
520 - 11.8
515 - 11.7
(and so on...)
https://docs.nvidia.com/deploy/cuda-compatibility/
So, I have moderate to high confidence that if you guys try the newest NVIDIA container toolkit again, you won't need to install the drivers, assuming that you ensure the json
files are present or written.
Environment variables that currently work for me:
RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf
# Expose NVIDIA libraries and paths
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/lib/x86_64-linux-gnu:/usr/lib/i386-linux-gnu${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
# Make all NVIDIA GPUs visible by default
ENV NVIDIA_VISIBLE_DEVICES all
# All NVIDIA driver capabilities should preferably be used, check `NVIDIA_DRIVER_CAPABILITIES` inside the container if things do not work
ENV NVIDIA_DRIVER_CAPABILITIES all
# Disable VSYNC for NVIDIA GPUs
ENV __GL_SYNC_TO_VBLANK 0
Hi,
I'm in the process of setting up a small retro game server and came across the "gow" project. Then I came across this project. But unfortunately the output of the emulation station “Server” is corrupted.
Some specs of my server
Wolf Log:
[2023-10-05 14:57:30]
[2023-10-05 14:57:30] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
[2023-10-05 14:57:30] **** Configure default user ****
[2023-10-05 14:57:30] Container running as root. Nothing to do.
[2023-10-05 14:57:30] DONE
[2023-10-05 14:57:30]
[2023-10-05 14:57:30] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
[2023-10-05 14:57:30] **** Configure devices ****
[2023-10-05 14:57:30] Exec device groups
[2023-10-05 14:57:30] Adding user 'root' to groups: gow-gid-106,root
[2023-10-05 14:57:31] DONE
[2023-10-05 14:57:31]
[2023-10-05 14:57:31] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
[2023-10-05 14:57:31]
[2023-10-05 14:57:31]
[2023-10-05 14:57:31] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
[2023-10-05 14:57:31] **** Setting up Gamescope ****
[2023-10-05 14:57:31] Launching the container's startup script as user 'root'
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
0:00:00.302829809 83 0x5603ec78f9d0 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
0:00:00.303631545 83 0x5603ec78f9d0 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
0:00:00.304971545 83 0x5603ec78f9d0 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
0:00:00.373203948 83 0x5603ec78f9d0 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x5603ec6b5d60> Could not set value on item: format-version
0:00:00.373319656 83 0x5603ec78f9d0 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x5603ec7c1d20> Could not set value on item: format-version
0:00:00.373375787 83 0x5603ec78f9d0 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x5603ec7c24d0> Could not set value on item: format-version
0:00:00.375318331 83 0x5603ec78f9d0 WARN structure gststructure.c:2334:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype
0:00:00.514929339 83 0x5603ec78f9d0 WARN default gstvaapi.c:231:plugin_init: Cannot create a VA display
0:00:00.518486509 83 0x5603ec78f9d0 WARN GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
0:00:00.625562292 83 0x5603ec78f9d0 WARN cudaloader gstcudaloader.c:169:gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory
0:00:00.625613598 83 0x5603ec78f9d0 WARN nvcodec plugin.c:93:plugin_init: Failed to load cuda library
0:00:00.830298712 83 0x5603ec78f9d0 WARN GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
14:57:32.088505639 INFO | Gstreamer version: 1.22.0-0
14:57:32.093558093 INFO | Reading config file from: /wolf/cfg/config.toml
0:00:00.930457280 1 0x563b07b65920 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh264enc"!
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
14:57:32.207282496 INFO | Selected H264 encoder: qsv
0:00:01.005504260 1 0x563b07b65920 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh265enc"!
14:57:32.207535474 INFO | Selected HEVC encoder: qsv
14:57:32.210521645 INFO | RTSP server started on port: 48010
14:57:32.210597091 INFO | HTTP server listening on port: 47989
14:57:32.210932412 WARN | [PULSE] Unable to connect, Access denied
14:57:32.211077857 INFO | Starting PulseAudio docker container
14:57:32.211313625 INFO | RTP server started on port: 48000
14:57:32.211321237 INFO | RTP server started on port: 47998
14:57:32.211784691 INFO | Control server started on port: 47999
14:57:32.213460119 INFO | HTTPS server listening on port: 47984
14:58:06.399474336 INFO | Starting container: /WolfES-DE_2422947761925974632
0:00:36.470339327 1 0x7f86ec001050 WARN audioencoder gstaudioencoder.c:1014:gst_audio_encoder_finish_frame:<opusenc0> Can't copy metadata because input buffer disappeared
0:02:09.872976069 1 0x7f86c4002470 WARN audiosrc gstaudiosrc.c:227:audioringbuffer_thread_func:<pulsesrc0> error reading data -1 (reason: Success), skipping segment
14:59:49.648466542 INFO | Stopped container: /WolfES-DE_2422947761925974632
Emulationstation Container
[2023-10-05 15:11:21]
[2023-10-05 15:11:21] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
[2023-10-05 15:11:21] **** Configure default user ****
[2023-10-05 15:11:21] Setting default user uid=1000(retro) gid=1000(retro)
[2023-10-05 15:11:21] Setting umask to 000
[2023-10-05 15:11:21] Ensure retro home directory is writable
[2023-10-05 15:11:21] Ensure XDG_RUNTIME_DIR is writable
[2023-10-05 15:11:21] DONE
[2023-10-05 15:11:21]
[2023-10-05 15:11:21] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
[2023-10-05 15:11:21] **** Configure devices ****
[2023-10-05 15:11:21] Exec device groups
[2023-10-05 15:11:22] Adding user 'retro' to groups: gow-gid-109,gow-gid-106,video
[2023-10-05 15:11:22] DONE
[2023-10-05 15:11:22]
[2023-10-05 15:11:22] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
[2023-10-05 15:11:22]
[2023-10-05 15:11:22]
[2023-10-05 15:11:22] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
[2023-10-05 15:11:22] **** Setting up Gamescope ****
[2023-10-05 15:11:22]
[2023-10-05 15:11:22] [ /etc/cont-init.d/setup-de.sh: executing... ]
[2023-10-05 15:11:22] Starting Application preparation
[2023-10-05 15:11:22] Copying custom config - retroarch.cfg, if not edited
[2023-10-05 15:11:22] Copying custom config - ES-DE Custom Scripts Platform, if not edited
[2023-10-05 15:11:22] Copying custom gamelist - ES-DE Custom Scripts Platform, if not edited
[2023-10-05 15:11:22] Copying custom config - RPCS3 Controller Bindings for Wolf and disable Auto-Update pop-up, if not edited
[2023-10-05 15:11:22] Copying custom config - PCSX2 settings, if not edited
[2023-10-05 15:11:22] Copying custom config - XEMU settings, if not edited
[2023-10-05 15:11:22] Copying hdd for XEMU if it is present in bioses or newer
[2023-10-05 15:11:22] Copying keys for YUZU if it is present in bioses or newer
[2023-10-05 15:11:22] Copying custom config - YUZU QT settings, if not edited
[2023-10-05 15:11:22] Copying default config - EmulationStation settings, if not edited
[2023-10-05 15:11:22] Change media directory for EmulationStation to /media
[2023-10-05 15:11:22] Change ROMs directory for EmulationStation to /ROMs
[2023-10-05 15:11:22] Copying custom launch scripts for emulators and programs, if not edited
[2023-10-05 15:11:22] Checking RA Assets presence, if none - install them
[2023-10-05 15:11:22] Symlinking AppImage Emulators from /Applications
[2023-10-05 15:11:22] Symlinking Bioses from /Bioses
[2023-10-05 15:11:22] Launching the container's startup script as user 'retro'
[2023-10-05 15:11:22] Launching EmulationStation-Desktop Edition
No CAP_SYS_NICE, falling back to regular-priority compute and threads.
Performance will be affected.
wlserver: [backend/headless/backend.c:68] Creating headless backend
Couldn't open plugin directory: No such file or directory
No plugins found, falling back on no decorations
vulkan: selecting physical device 'Intel(R) HD Graphics 530 (SKL GT2)': queue family 0
vulkan: physical device supports DRM format modifiers
vulkan: supported DRM formats for sampling usage:
vulkan: AR24 (0x34325241)
vulkan: XR24 (0x34325258)
vulkan: AB24 (0x34324241)
vulkan: XB24 (0x34324258)
vulkan: NV12 (0x3231564E)
vulkan: AB4H (0x48344241)
vulkan: XB4H (0x48344258)
vulkan: AB48 (0x38344241)
vulkan: XB48 (0x38344258)
vulkan: AB30 (0x30334241)
vulkan: XB30 (0x30334258)
vulkan: AR30 (0x30335241)
vulkan: XR30 (0x30335258)
wlserver: Running compositor on wayland display 'gamescope-0'
wlserver: [backend/headless/backend.c:16] Starting headless backend
wlserver: [xwayland/sockets.c:118] Created /tmp/.X11-unix ourselves -- other users will be unable to create X11 UNIX sockets of their own
wlserver: [xwayland/server.c:108] Starting Xwayland on :0
wlserver: [types/wlr_compositor.c:681] New wlr_surface 0x5581a5cf2780 (res 0x5581a5c1f330)
wlserver: [xwayland/server.c:273] Xserver is ready
[W][04629.649822] pw.conf | [ conf.c: 939 try_load_conf()] can't load config client.conf: No such file or directory
[E][04629.650013] pw.conf | [ conf.c: 963 pw_conf_load_conf_for_context()] can't load default config client.conf: No such file or directory
pipewire: pw_context_new failed
Warning: failed to setup PipeWire, screen capture won't be available
xwm: Failed to load host cursor. Falling back to left_ptr.
WARNING: Kernel has no file descriptor comparison support: Operation not permitted
wlserver: [types/wlr_compositor.c:681] New wlr_surface 0x5581a5d9f560 (res 0x5581a5c22580)
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning: Unsupported maximum keycode 708, clipping.
> X11 cannot support keycodes above 255.
Errors from xkbcomp are not fatal to the X server
ALSA lib confmisc.c:855:(parse_card) cannot find card '0'
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_card_inum returned error: No such file or directory
ALSA lib confmisc.c:422:(snd_func_concat) error evaluating strings
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_concat returned error: No such file or directory
ALSA lib confmisc.c:1334:(snd_func_refer) error evaluating name
ALSA lib conf.c:5180:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5703:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2666:(snd_pcm_open_noupdate) Unknown PCM default
Oct 05 15:11:26 Error: Unable to open audio device: ALSA: Couldn't open audio device: No such file or directory
Moonlight Stream:
I should mention that the Firefox container, for example, works fine.
There's a new horizontal scroll input packet, see this pr: LizardByte/Sunshine#793
This introduces a new 7.1.431.-1
protocol version.
After my first attempt to use Wolf on my main PC, I decided to give it another try on a different PC with different specs. The goal was to figure out why I can't use Steam with Wolf. I installed Archlinux on the second PC and after setting things up, I tested Wolf again. Unfortunately, I encountered the exact same problems as with my other PC. Just as a reminder, the issues I'm facing on both PCs are:
When I launch the Steam docker and connect to it via Moonlight, there's a significant delay between starting the docker and the screen transitioning from black to the UI. On my new PC, I had to wait for more than 10 minutes before being able to log in to Steam.
After installing a game in the Steam docker, the download completes successfully. However, once the download is finished, the screen turns completely black, and I'm unable to do anything except exit the Steam docker and restart it.
Games are not functioning, particularly when using Proton (since I don't have native Linux games).
Here's my configuration:
$ sudo lshw -short
Chemin matériel Périphérique Classe Description
============================================================
system GL502VMZ
/0 bus GL502VMZ
/0/0 memory 64KiB BIOS
/0/8 memory 8GiB Mémoire Système
/0/8/0 memory 8GiB SODIMM DDR4 Synchrone 2400 MHz (0,4 ns)
/0/8/1 memory Project-Id-Version: @(#) $Id: fr.po 2151 2010-03-15 20:26:20Z lyone
/0/8/2 memory Project-Id-Version: @(#) $Id: fr.po 2151 2010-03-15 20:26:20Z lyone
/0/8/3 memory Project-Id-Version: @(#) $Id: fr.po 2151 2010-03-15 20:26:20Z lyone
/0/e memory 256KiB L1 cache
/0/f memory 1MiB L2 cache
/0/10 memory 6MiB L3 cache
/0/11 processor Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz
/0/100 bridge Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers
/0/100/1 bridge 6th-10th Gen Core Processor PCIe Controller (x16)
/0/100/1/0 display GP106M [GeForce GTX 1060 Mobile]
/0/100/1/0.1 card1 multimedia GP106 High Definition Audio Controller
/0/100/1/0.1/0 input16 input HDA NVidia HDMI/DP,pcm=3
/0/100/1/0.1/1 input17 input HDA NVidia HDMI/DP,pcm=7
/0/100/1/0.1/2 input18 input HDA NVidia HDMI/DP,pcm=8
/0/100/1/0.1/3 input19 input HDA NVidia HDMI/DP,pcm=9
/0/100/4 generic Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor Thermal Subsystem
/0/100/14 bus 100 Series/C230 Series Chipset Family USB 3.0 xHCI Controller
/0/100/14/0 usb1 bus xHCI Host Controller
/0/100/14/0/4 multimedia USB2.0 HD UVC WebCam
/0/100/14/0/8 input6 input Asus Keyboard
/0/100/14/0/9 communication Bluetooth wireless interface
/0/100/14/1 usb2 bus xHCI Host Controller
/0/100/14.2 generic 100 Series/C230 Series Chipset Family Thermal Subsystem
/0/100/15 generic 100 Series/C230 Series Chipset Family Serial IO I2C Controller #0
/0/100/15.1 generic 100 Series/C230 Series Chipset Family Serial IO I2C Controller #1
/0/100/16 communication 100 Series/C230 Series Chipset Family MEI Controller #1
/0/100/17 storage HM170/QM170 Chipset SATA Controller [AHCI Mode]
/0/100/1c bridge 100 Series/C230 Series Chipset Family PCI Express Root Port #1
/0/100/1c.2 bridge 100 Series/C230 Series Chipset Family PCI Express Root Port #3
/0/100/1c.2/0 wlan0 network Wireless 8260
/0/100/1c.3 bridge 100 Series/C230 Series Chipset Family PCI Express Root Port #4
/0/100/1c.3/0 enp4s0 network RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
/0/100/1d bridge 100 Series/C230 Series Chipset Family PCI Express Root Port #9
/0/100/1d/0 /dev/nvme0 storage BT58SSD13E
/0/100/1d/0/0 hwmon3 disk NVMe disk
/0/100/1d/0/2 /dev/ng0n1 disk NVMe disk
/0/100/1d/0/1 /dev/nvme0n1 disk 1TB NVMe disk
/0/100/1d/0/1/1 /dev/nvme0n1p1 volume 511MiB Windows FAT volume
/0/100/1d/0/1/2 /dev/nvme0n1p2 volume 931GiB EFI partition
/0/100/1f bridge HM175 Chipset LPC/eSPI Controller
/0/100/1f/0 system Motherboard registers
/0/100/1f/1 system Motherboard registers
/0/100/1f/2 system AT Real-Time Clock
/0/100/1f/3 generic PnP device INT3f0d
/0/100/1f/4 generic PnP device ATK3001
/0/100/1f/5 system Motherboard registers
/0/100/1f/6 system Motherboard registers
/0/100/1f/7 system Motherboard registers
/0/100/1f/8 system Motherboard registers
/0/100/1f.2 memory Memory controller
/0/100/1f.3 card0 multimedia CM238 HD Audio Controller
/0/100/1f.3/0 input20 input HDA Intel PCH Headphone
/0/100/1f.4 bus 100 Series/C230 Series Chipset Family SMBus
/1 /dev/fb0 display EFI VGA
/2 input0 input Lid Switch
/3 input1 input Sleep Button
/4 input10 input PC Speaker
/5 input11 input Asus WMI hotkeys
/6 input14 input ELAN1200:00 04F3:3049 Mouse
/7 input15 input ELAN1200:00 04F3:3049 Touchpad
/8 input2 input Power Button
/9 input3 input Power Button
/a input35 input Wolf mouse virtual device
/b input36 input Wolf touchpad virtual device
/c input37 input Wolf keyboard virtual device
/d input38 input Wolf X-Box One (virtual) pad
/e input39 input Wolf X-Box One (virtual) pad
/f input4 input Video Bus
/10 input40 input Wolf X-Box One (virtual) pad
/11 input41 input Wolf X-Box One (virtual) pad
/12 input5 input AT Translated Set 2 keyboard
/13 input9 input Asus Wireless Radio Control
$ nvidia-smi
Wed Aug 23 13:26:17 2023
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.98 Driver Version: 535.98 CUDA Version: 12.2 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce GTX 1060 Off | 00000000:01:00.0 On | N/A |
| N/A 56C P8 8W / 78W | 382MiB / 6144MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
Here are the steps I took to install Wolf:
I began by using Pacman to install the following packages:
Next, I enabled Docker using the command:
sudo systemctl enable docker.service
To prevent permission issues with Docker, I added myself to the Docker group:
sudo usermod -aG docker ${USER}
After that, I rebooted the system.
Following the Nvidia section of the Wolf wiki's quickstart guide, I did the following:
curl https://raw.githubusercontent.com/games-on-whales/gow/master/images/nvidia-driver/Dockerfile | docker build -t gow/nvidia-driver:latest -f - --build-arg NV_VERSION=$(cat /sys/module/nvidia/version)
docker run --name nvidia-driver-container --rm --mount source=nvidia-driver-vol,destination=/usr/nvidia gow/nvidia-driver:latest sh
I verified everything was in order by executing the following commands:
$ docker volume ls | grep nvidia-driver
local nvidia-driver-vol
$ sudo cat /sys/module/nvidia_drm/parameters/modeset
[sudo] Password for david:
Y
I also ran the script to start nvidia_uvm devices:
$ #!/bin/bash
## Script to initialize nvidia device nodes.
## https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#runfile-verifications
/sbin/modprobe nvidia
if [ "$?" -eq 0 ]; then
# Count the number of NVIDIA controllers found.
NVDEVS=`lspci | grep -i NVIDIA`
N3D=`echo "$NVDEVS" | grep "3D controller" | wc -l`
NVGA=`echo "$NVDEVS" | grep "VGA compatible controller" | wc -l`
N=`expr $N3D + $NVGA - 1`
for i in `seq 0 $N`; do
mknod -m 666 /dev/nvidia$i c 195 $i
done
mknod -m 666 /dev/nvidiactl c 195 255
else
exit 1
fi
/sbin/modprobe nvidia-uvm
if [ "$?" -eq 0 ]; then
# Find out the major device number used by the nvidia-uvm driver
D=`grep nvidia-uvm /proc/devices | awk '{print $1}'`
mknod -m 666 /dev/nvidia-uvm c $D 0
mknod -m 666 /dev/nvidia-uvm-tools c $D 0
fiexit 1
mknod: /dev/nvidia0: Le fichier existe
mknod: /dev/nvidiactl: Le fichier existe
mknod: /dev/nvidia-uvm: Le fichier existe
mknod: /dev/nvidia-uvm-tools: Le fichier existe
For those not speaking french, the last 4 lines say "The file exists"
I also followed the steps to utilize uinput by executing the following two commands:
$ ls -la /dev/uinput
crw-rw----+ 1 root input 10, 223 Aug 23 13:06 /dev/uinput
sudo usermod -a -G input $USER
Subsequently, I created the file 85-wolf-virtual-inputs.rules in the directory /etc/udev/rules.d/ and included the following lines in it:
KERNEL=="uinput", SUBSYSTEM=="misc", MODE="0660", GROUP="input", OPTIONS+="static_node=uinput"
SUBSYSTEMS=="input", ATTRS{id/vendor}=="ab00", MODE="0660", GROUP="input", ENV{ID_SEAT}="seat9"
SUBSYSTEMS=="input", ATTRS{id/vendor}=="045e", ATTRS{id/product}=="02d1", ATTRS{id/version}=="ab00", MODE="0660", GROUP="input"
After completing these steps, I proceeded to start Wolf:
docker run \
--name wolf \
--network=host \
-e XDG_RUNTIME_DIR=/tmp/sockets \
-v /tmp/sockets:/tmp/sockets:rw \
-e NVIDIA_DRIVER_VOLUME_NAME=nvidia-driver-vol \
-v nvidia-driver-vol:/usr/nvidia:rw \
-e HOST_APPS_STATE_FOLDER=/etc/wolf \
-v /etc/wolf/wolf:/wolf/cfg \
-v /var/run/docker.sock:/var/run/docker.sock:rw \
--device-cgroup-rule "c 13:* rmw" \
--device /dev/nvidia-uvm \
--device /dev/nvidia-uvm-tools \
--device /dev/dri/ \
--device /dev/nvidia-caps/nvidia-cap1 \
--device /dev/nvidia-caps/nvidia-cap2 \
--device /dev/nvidiactl \
--device /dev/nvidia0 \
--device /dev/nvidia-modeset \
--device /dev/uinput \
-v /dev/shm:/dev/shm:rw \
-v /dev/input:/dev/input:rw \
-v /run/udev:/run/udev:rw \
ghcr.io/games-on-whales/wolf:stable
Subsequently, I encountered an issue where Wolf wouldn't start properly, and I quickly received the following error:
ERRO[0000] error waiting for container:
Error response from daemon: error gathering device information while adding custom device "/dev/nvidia-caps/nvidia-cap1": no such file or directory
To resolve this, I discovered that running the following command before launching the container helped:
sudo nvidia-container-cli --load-kmods info
With this command in place, I can successfully start the Wolf container without any issues, but this workaround is necessary after each computer restart. Upon restart, I need to execute the aforementioned command (the one with nvidia-container-cli) again.
To initiate the Wolf container after its initial installation, I utilize the following command:
docker start wolf -a
As detailed here: https://github.com/games-on-whales/wolf/issues/38, I also made modifications to /etc/wolf/wolf/config.toml to configure it for the initial launch like this:
[[apps]]
title = "Steam"
start_virtual_compositor = true
[apps.runner]
type = "docker"
name = "WolfSteam"
image = "ghcr.io/games-on-whales/steam:edge"
mounts = ["/run/udev:/run/udev:ro"]
env = [
"STEAM_STARTUP_FLAGS=-nogamepadui","PROTON_LOG=1","RUN_GAMESCOPE=true","GOW_REQUIRED_DEVICES=/dev/uinput /dev/input/event* /dev/dri/* /dev/nvidia*",
]
devices = []
ports = []
base_create_json = """
{
"HostConfig": {
"IpcMode": "host",
"CapAdd": ["SYS_ADMIN", "SYS_NICE"],
"Privileged": true
}
}
\
"""
After successfully logging in, I only removed the "STEAM_STARTUP_FLAGS=-nogamepadui" from the file.
Now that the setup is operational, I'm able to connect to Wolf using Moonlight. Most applications work relatively well, although I haven't extensively explored them. The one application I'm particularly interested in is Steam, and that's where I encountered the issues I initially mentioned in this message.
I would also like to provide some logs, but I'm unsure where they might exist and where to locate them.
So, for example, for retroarch -- where do you put your games? I'm using docker-compose, and.. I've attempted to set up my games folder like so /server/games/:/home/retro/
and yet, it doesn't show games in there -- but I suspect this is because of how complex GOW/Wolf is -- I'm still getting used to even docker, lol.
Is streaming games through the browser possible with this repo? As for moonlight the closest thing to that is Moonlight for ChromeOS but is there anything on the browser like what webRTC could? Thank you.
Currently, it only works by inserting the PIN in the console; we should implement something better (and secure).
Wolf starts an app today and if the image is not present it'll pull; after that we have no way to automatically update images when we release updates in GOW.
I think we should add it, and possibly add a way to configure it; ex: cron style cadency for updates.
This has been reported by a couple users; when starting an app it gets stuck on startup spamming the following error:
vblankmanager: write failed: Resource temporarily unavailable
it seems to be a well known issue on Gamescope with the latest Nvidia drivers: ValveSoftware/gamescope#497
Downgrading to 535.x
seems to fix the issue.
i'm running moonlight 4.3.1
i have noticed, that when i up the bandwidth in the moonlight client, i get a RTSP handshake error.
in another ticket, you mentioned that you cannot reproduce the error. Perhaps now you can.
for me, The max bitrate seems to be 14 and works fine. Above 14 i always get the RTSP error.
Here is is a Trace log.
11:03:08.789252581 DEBUG | [RTSP] received command SETUP
11:03:08.789262930 TRACE | [RTSP] setup type: audio
11:03:08.789277367 TRACE | [RTSP] sending reply:
RTSP/1.0 200 OK
CSeq: 3
Session: DEADBEEFCAFE;timeout = 90
Transport: server_port=48000
11:03:08.789313904 TRACE | [RTSP] sent reply of size: 94
11:03:08.792855603 TRACE | [RTP] Received ping from 192.168.11.38:52607
11:03:08.792869485 TRACE | [PING] audio from 192.168.11.38:52607
11:03:08.794414154 TRACE | [RTSP] received connection from IP: 192.168.11.38
11:03:08.794840912 TRACE | [RTSP] received message 214 bytes
SETUP streamid=video/0/0 RTSP/1.0
CSeq: 4
X-GS-ClientVersion: 14
Host: 192.168.10.253
Session: DEADBEEFCAFE
Transport: unicast;X-GS-ClientPort=50000-50001
If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT
11:03:08.799286165 DEBUG | [RTSP] received command SETUP
11:03:08.799304233 TRACE | [RTSP] setup type: video
11:03:08.799321054 TRACE | [RTSP] sending reply:
RTSP/1.0 200 OK
CSeq: 4
Session: DEADBEEFCAFE;timeout = 90
Transport: server_port=47998
11:03:08.799373125 TRACE | [RTSP] sent reply of size: 94
11:03:08.799419869 DEBUG | 192.168.11.38 [GET] HTTP://192.168.10.253/serverinfo
11:03:08.799443811 TRACE | Header: {"uuid": "143a605282d040f5ac17775d2a4b8f1f", "uniqueid": "0123456789ABCDEF"}
11:03:08.800737210 TRACE | Response: <?xml version="1.0" encoding="utf-8"?>
<root status_code="200"><hostname>Wolf</hostname><appversion>7.1.431.-1</appversion><GfeVersion>3.23.0.74</GfeVersion><uniqueid>7a63d314-30a6-44f8-ad7b-05977f2249ca</uniqueid><MaxLumaPixelsHEVC>1869449984</MaxLumaPixelsHEVC><ServerCodecModeSupport>259</ServerCodecModeSupport><HttpsPort>47984</HttpsPort><ExternalPort>47989</ExternalPort><mac>48:21:0b:3e:a2:e8</mac><LocalIP>192.168.10.253</LocalIP><SupportedDisplayMode><DisplayMode><Width>1920</Width><Height>1080</Height><RefreshRate>60</RefreshRate></DisplayMode><DisplayMode><Width>1024</Width><Height>768</Height><RefreshRate>30</RefreshRate></DisplayMode></SupportedDisplayMode><PairStatus>0</PairStatus><currentgame>4</currentgame><state>SUNSHINE_SERVER_BUSY</state></root>
11:03:08.804673437 TRACE | [RTSP] received connection from IP: 192.168.11.38
11:03:08.806982028 TRACE | [RTSP] received message 217 bytes
SETUP streamid=control/13/0 RTSP/1.0
CSeq: 5
X-GS-ClientVersion: 14
Host: 192.168.10.253
Session: DEADBEEFCAFE
Transport: unicast;X-GS-ClientPort=50000-50001
If-Modified-Since: Thu, 01 Jan 1970 00:00:00 GMT
11:03:08.811337699 DEBUG | [RTSP] received command SETUP
11:03:08.811353000 TRACE | [RTSP] setup type: control
11:03:08.811367299 TRACE | [RTSP] sending reply:
RTSP/1.0 200 OK
CSeq: 5
Session: DEADBEEFCAFE;timeout = 90
Transport: server_port=47999
11:03:08.811426467 TRACE | [RTSP] sent reply of size: 94
11:03:08.820650448 TRACE | [RTSP] received connection from IP: 192.168.11.38
11:03:08.821115002 TRACE | [RTSP] received message 512 bytes
ANNOUNCE streamid=control/13/0 RTSP/1.0
CSeq: 6
X-GS-ClientVersion: 14
Host: 192.168.10.253
Session: DEADBEEFCAFE
Content-type: application/sdp
Content-length: 1348
v=0
o=android 0 14 IN IPv4 192.168.10.253
s=NVIDIA Streaming Client
a=x-nv-video[0].clientViewportWd:1920
a=x-nv-video[0].clientViewportHt:1080
a=x-nv-video[0].maxFPS:60
a=x-nv-video[0].packetSize:1392
a=x-nv-video[0].rateControlMode:4
a=x-nv-video[0].timeoutLengthMs:7000
a=x-nv-video[0].framesWithInvalidRefThreshold:0
11:03:08.826180808 ERROR | [RTSP] error parsing message
11:03:08.826208619 TRACE | [RTSP] sending reply:
RTSP/1.0 400 BAD REQUEST
CSeq: 0
11:03:08.826265091 TRACE | [RTSP] sent reply of size: 37
11:03:08.833145442 TRACE | X509 certificate verification error: self-signed certificate
11:03:08.833320525 DEBUG | 192.168.11.38 [GET] HTTPS://192.168.10.253/serverinfo
11:03:08.833339730 TRACE | Header: {"uuid": "01a694470a3d469697e00124df9b7c7a", "uniqueid": "0123456789ABCDEF"}
11:03:08.834374496 TRACE | Response: <?xml version="1.0" encoding="utf-8"?>
Use netstat
to illustrate the issue. When you first start streaming using moonlight:
sudo nsenter -t "$(docker inspect -f '{{.State.Pid}}' "[WOLF_CONTAINER_ID]")" -n netstat -anup
Within the list of records will be an entry describing the established connection for wolf:
udp 0 0 192.168.0.207:53602 192.168.0.141:44965 ESTABLISHED 1404/wolf
Terminate the stream session and issue the command again. The record will still be present.
The issue is highlighted when creating a new stream with the same client -- another connection will be established without terminating the previous one:
udp 0 0 192.168.0.207:53602 192.168.0.141:44965 ESTABLISHED 1404/wolf
udp 0 0 192.168.0.207:39660 192.168.0.141:58315 ESTABLISHED 1404/wolf
The connections will release upon stopping the wolf container.
The UI falsely displays network scanning errors during setup. This causes the inability to properly set up Steam.
Possibly related, the UI shows the following exception:
One workaround is to use the normal desktop UI initially to log into Steam by setting the startup flag -nogamepadui
. Example section in config.toml
:
[[apps]]
title = "Steam"
start_virtual_compositor = true
[apps.runner]
type = "docker"
name = "WolfSteam"
image = "ghcr.io/games-on-whales/steam:edge"
mounts = ["/run/udev:/run/udev:ro"]
env = [
"STEAM_STARTUP_FLAGS=-nogamepadui","PROTON_LOG=1","RUN_GAMESCOPE=true","GOW_REQUIRED_DEVICES=/dev/uinput /dev/input/event* /dev/dri/* /dev/nvidia*",
]
devices = []
ports = []
base_create_json = """
{
"HostConfig": {
"IpcMode": "host",
"CapAdd": ["SYS_ADMIN", "SYS_NICE"],
"Privileged": false
}
}
\
"""
After logging in, Steam can continue to be used with the flag omitted if desired.
wolf-1 | [2024-02-13 23:10:32]
wolf-1 | [2024-02-13 23:10:32] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
wolf-1 | [2024-02-13 23:10:32] **** Configure default user ****
wolf-1 | [2024-02-13 23:10:32] Container running as root. Nothing to do.
wolf-1 | [2024-02-13 23:10:32] DONE
wolf-1 | [2024-02-13 23:10:32]
wolf-1 | [2024-02-13 23:10:32] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
wolf-1 | [2024-02-13 23:10:32] **** Configure devices ****
wolf-1 | [2024-02-13 23:10:32] Exec device groups
wolf-1 | [2024-02-13 23:10:34] Adding user 'root' to groups: root,gow-gid-174
wolf-1 | [2024-02-13 23:10:35] DONE
wolf-1 | [2024-02-13 23:10:35]
wolf-1 | [2024-02-13 23:10:35] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
wolf-1 | [2024-02-13 23:10:35]
wolf-1 | [2024-02-13 23:10:35]
wolf-1 | [2024-02-13 23:10:35] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
wolf-1 | [2024-02-13 23:10:35] **** Setting up Gamescope ****
wolf-1 | [2024-02-13 23:10:35] Launching the container's startup script as user 'root'
wolf-1 | 0:00:00.031637433 143 0x55e777241870 WARN default gstvaapi.c:231:plugin_init: Cannot create a VA display
wolf-1 | 0:00:00.054764632 143 0x55e777241870 WARN GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
wolf-1 | 0:00:00.097293497 143 0x55e777241870 WARN cudaloader gstcudaloader.c:169:gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory
wolf-1 | 0:00:00.097307267 143 0x55e777241870 WARN nvcodec plugin.c:93:plugin_init: Failed to load cuda library
wolf-1 | 0:00:00.101347323 143 0x55e777241870 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
wolf-1 | 0:00:00.101454083 143 0x55e777241870 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
wolf-1 | 0:00:00.101582594 143 0x55e777241870 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
wolf-1 | 0:00:00.124699284 143 0x55e777241870 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x55e7775ab510> Could not set value on item: format-version
wolf-1 | 0:00:00.124721164 143 0x55e777241870 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x55e7775e9120> Could not set value on item: format-version
wolf-1 | 0:00:00.124732724 143 0x55e777241870 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x55e7775e98d0> Could not set value on item: format-version
wolf-1 | 0:00:00.125341366 143 0x55e777241870 WARN structure gststructure.c:2334:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype
wolf-1 | amdgpu: os_same_file_description couldn't determine if two DRM fds reference the same file description.
wolf-1 | If they do, bad things may happen!
wolf-1 | 0:00:00.331289794 143 0x55e777241870 WARN vafilter gstvafilter.c:1727:gst_va_filter_has_compose:<vafilter0> VPP does not support alpha blending
wolf-1 | 0:00:00.353918972 143 0x55e777241870 WARN GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
wolf-1 | 23:10:35.667725162 INFO | Gstreamer version: 1.22.0-0
wolf-1 | 23:10:35.672037029 INFO | Reading config file from: /wolf/cfg/config.toml
wolf-1 | 23:10:35.672122599 WARN | Unable to open config file: /wolf/cfg/config.toml, creating one using defaults
wolf-1 | 0:00:00.548764277 1 0x559bd4f61da0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh264enc"!
wolf-1 | 0:00:00.548783437 1 0x559bd4f61da0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "qsvh264enc"!
wolf-1 | 0:00:00.574392216 1 0x559bd4f61da0 WARN vafilter gstvafilter.c:1727:gst_va_filter_has_compose:<vafilter0> VPP does not support alpha blending
wolf-1 | 23:10:35.728597238 INFO | Selected H264 encoder: vaapi
wolf-1 | 0:00:00.590368688 1 0x559bd4f61da0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh265enc"!
wolf-1 | 0:00:00.590378818 1 0x559bd4f61da0 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "qsvh265enc"!
wolf-1 | 23:10:35.735798876 INFO | Selected HEVC encoder: vaapi
wolf-1 | 23:10:35.736188078 INFO | x509 certificates not present, generating: /wolf/cfg/cert.pem /wolf/cfg/key.pem
wolf-1 | 23:10:35.908795207 INFO | RTSP server started on port: 48010
wolf-1 | 23:10:35.908889417 INFO | Control server started on port: 47999
wolf-1 | 23:10:35.909027298 INFO | HTTP server listening on port: 47989
wolf-1 | 23:10:35.909623290 WARN | [PULSE] Unable to connect, Access denied
wolf-1 | 23:10:35.909677060 INFO | Starting PulseAudio docker container
wolf-1 | 23:10:35.910931655 INFO | HTTPS server listening on port: 47984
wolf-1 | 23:10:35.911454327 WARN | [DOCKER] Image ghcr.io/games-on-whales/pulseaudio:master not present, downloading...
wolf-1 | 23:11:19.183446620 WARN | [PULSE] Unable to connect, Access denied
This needs to be fleshed out properly but ideally we don't need any of the followings:
If we implement a self-contained Wayland compositor and advertise it to applications we should be in a position of:
I need to learn more about this, here are a bunch of random links.
https://gitlab.freedesktop.org/wlroots/wlroots
https://drewdevault.com/2017/06/10/Introduction-to-Wayland.html
https://drewdevault.com/2018/02/17/Writing-a-Wayland-compositor-1.html
https://wayland-book.com/
https://wayland.app/protocols/
https://zamundaaa.github.io/wayland/2021/12/14/about-gaming-on-wayland.html
https://github.com/Hjdskes/cage
https://github.com/Plagman/gamescope
https://gitlab.freedesktop.org/mstoeckl/waypipe/
https://mstoeckl.com/notes/gsoc/blog.html
Hi,
I was trying to deploy Wolf, and all seems to be fine, until I reach the docker cli or compose instructions.
I get the following error and cannot continue:
docker: Error response from daemon: error gathering device information while adding custom device "/dev/nvidia-caps/nvidia-cap1": no such file or directory.
ERRO[0000] error waiting for container: context canceled
I have an RTX nVidia Quadro GPU with driver version: 545.29.06
And the devices nvidia-caps do not exist on my system.
Running on Ubuntu 22.04
Kernel: Linux 5.15.0-92-lowlatency x86_64
Thanks
It's difficult to manually configure and build plugins that aren't included in the standard available packages (ex: HEVC and Nvidia).
We should probably generate our own set of plugins and statically link Wolf to it or put the bundle under the GST_PLUGIN_PATH
.
See also: Generate a minimal GStreamer build
I'm happily running gow for months now :)
I thought, it would be nice to have multiple applications, and also work without a dummy plug, so i'm giving wolf a spin.
I'm running debian bookworm
root@debian:/# uname -a
Linux debian 6.1.0-10-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.38-1 (2023-07-14) x86_64 GNU/Linux
Consider the following compose (just a copy / paste from the docs :))
version: "3.8"
services:
wolf:
image: ghcr.io/games-on-whales/wolf:stable
environment:
- XDG_RUNTIME_DIR=/tmp/sockets
- HOST_APPS_STATE_FOLDER=/etc/wolf
volumes:
- /etc/wolf/wolf:/wolf/cfg
- /tmp/sockets:/tmp/sockets:rw
- /var/run/docker.sock:/var/run/docker.sock:rw
- /dev/shm:/dev/shm:rw
- /dev/input:/dev/input:rw
- /run/udev:/run/udev:rw
devices:
- /dev/dri
- /dev/uinput
device_cgroup_rules:
- 'c 13:* rmw'
network_mode: host
restart: unless-stopped
Wolf starts. i can connect with moonlight etc, and also the pin stuff worked :)
the logging from the wolf container looks like this:
[2023-08-30 06:31:17]
[2023-08-30 06:31:17] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
[2023-08-30 06:31:17] **** Configure default user ****
[2023-08-30 06:31:17] Container running as root. Nothing to do.
[2023-08-30 06:31:17] DONE
[2023-08-30 06:31:17]
[2023-08-30 06:31:17] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
[2023-08-30 06:31:17] **** Configure devices ****
[2023-08-30 06:31:17] Exec device groups
[2023-08-30 06:31:17] Adding user 'root' to groups: gow-gid-102,root
[2023-08-30 06:31:17] DONE
[2023-08-30 06:31:17]
[2023-08-30 06:31:17] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
[2023-08-30 06:31:17]
[2023-08-30 06:31:17]
[2023-08-30 06:31:17] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
[2023-08-30 06:31:17] **** Setting up Gamescope ****
[2023-08-30 06:31:17] Launching the container's startup script as user 'root'
0:00:00.008668538 121 0x55d6344aa520 WARN cudaloader gstcudaloader.c:169:gst_cuda_load_library: Could not open library libcuda.so.1, libcuda.so.1: cannot open shared object file: No such file or directory
0:00:00.008682509 121 0x55d6344aa520 WARN nvcodec plugin.c:93:plugin_init: Failed to load cuda library
0:00:00.049087777 121 0x55d6344aa520 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x55d634d49f90> Could not set value on item: format-version
0:00:00.049107117 121 0x55d6344aa520 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x55d634830a70> Could not set value on item: format-version
0:00:00.049114952 121 0x55d6344aa520 WARN default ges-meta-container.c:236:_set_value:<GESAsset@0x55d634831150> Could not set value on item: format-version
0:00:00.049343376 121 0x55d6344aa520 WARN structure gststructure.c:2334:priv_gst_structure_parse_fields: Failed to find delimiter, r=mimetype
0:00:00.057037098 121 0x55d6344aa520 WARN GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
0:00:00.068276825 121 0x55d6344aa520 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
0:00:00.068374330 121 0x55d6344aa520 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
0:00:00.068480866 121 0x55d6344aa520 WARN adaptivedemux2 gstadaptivedemuxelement.c:41:adaptivedemux2_base_element_init: Failed to load libsoup library
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
0:00:00.116867793 121 0x55d6344aa520 WARN default gstvaapi.c:231:plugin_init: Cannot create a VA display
0:00:00.118825913 121 0x55d6344aa520 WARN GST_PLUGIN_LOADING gstplugin.c:534:gst_plugin_register_func: plugin "/usr/local/lib/x86_64-linux-gnu/gstreamer-1.0/validate/libgstvalidatessim.so" failed to initialise
06:31:17.883901064 INFO | Gstreamer version: 1.22.0-0
06:31:17.884551159 INFO | Reading config file from: /wolf/cfg/config.toml
06:31:17.884593355 WARN | Unable to open config file: /wolf/cfg/config.toml, creating one using defaults
0:00:00.150018113 1 0x5611c102ea90 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh264enc"!
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/iHD_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
06:31:17.943254116 INFO | Selected H264 encoder: qsv
0:00:00.199723112 1 0x5611c102ea90 WARN GST_ELEMENT_FACTORY gstelementfactory.c:712:gst_element_factory_make_with_properties: no such element factory "nvh265enc"!
06:31:17.943390422 INFO | Selected HEVC encoder: qsv
06:31:17.943588567 INFO | x509 certificates not present, generating: /wolf/cfg/cert.pem /wolf/cfg/key.pem
06:31:18.001459867 INFO | RTSP server started on port: 48010
06:31:18.001502513 INFO | HTTP server listening on port: 47989
06:31:18.001517984 INFO | RTP server started on port: 48000
06:31:18.001514812 INFO | RTP server started on port: 47998
06:31:18.001574178 INFO | Control server started on port: 47999
06:31:18.001741509 WARN | [PULSE] Unable to connect, Access denied
06:31:18.001785872 INFO | Starting PulseAudio docker container
06:31:18.002461215 INFO | HTTPS server listening on port: 47984
Seems that wolf cannot connect to pulseaudio.
This is the log listing of the pulseaudio container.
[2023-08-30 06:31:18]
[2023-08-30 06:31:18] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
[2023-08-30 06:31:18] **** Configure default user ****
[2023-08-30 06:31:18] Container running as root. Nothing to do.
[2023-08-30 06:31:18] DONE
[2023-08-30 06:31:18]
[2023-08-30 06:31:18] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
[2023-08-30 06:31:18] **** Configure devices ****
[2023-08-30 06:31:18] Exec device groups
[2023-08-30 06:31:18] Not modifying user groups ()
[2023-08-30 06:31:18] DONE
[2023-08-30 06:31:18]
[2023-08-30 06:31:18] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
[2023-08-30 06:31:18]
[2023-08-30 06:31:18] Launching the container's startup script as user 'root'
[2023-08-30 06:31:18] Removing all files from /root/.config/pulse
[2023-08-30 06:31:18] Starting pulseaudio
W: [pulseaudio] main.c: This program is not intended to be run as root (unless --system is specified).
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [pulseaudio] core-util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
W: [pulseaudio] authkey.c: Failed to open cookie file '/root/.config/pulse/cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to load authentication key '/root/.config/pulse/cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to open cookie file '/root/.pulse-cookie': No such file or directory
W: [pulseaudio] authkey.c: Failed to load authentication key '/root/.pulse-cookie': No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
E: [null-sink] util.c: Failed to connect to system bus: Failed to connect to socket /run/dbus/system_bus_socket: No such file or directory
W: [pulseaudio] server-lookup.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
W: [pulseaudio] main.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable to autolaunch a dbus-daemon without a $DISPLAY for X11
The reason wolf cannot connect to pulse audio, is because the pulseaudio container doesn't seem to run properly ?
The container does keep running, however.
When i run the firefox app from moonlight, this is the error log from the Wolf container:
06:44:35.315159515 INFO | Starting container: /WolfFirefox_7518890674366070471
0:01:48.975311740 1 0x7fcd5c00c800 WARN pulse pulsesrc.c:1016:gst_pulsesrc_open:<pulsesrc1> error: Failed to connect: Connection refused
06:44:35.581917610 ERROR | [GSTREAMER] Pipeline error: Failed to connect: Connection refused
0:01:49.127863038 1 0x7fcd5c00c800 WARN pulse pulsesrc.c:1016:gst_pulsesrc_open:<pulsesrc1> error: Failed to connect: Connection refused
0:01:49.128217085 1 0x7fcd5c00c800 WARN pulse pulsesrc.c:1016:gst_pulsesrc_open:<pulsesrc1> error: Failed to connect: Connection refused
06:44:35.593150932 ERROR | [GSTREAMER] Pipeline error: Failed to connect: Connection refused
(wolf:1): GLib-CRITICAL **: 06:44:35.593: g_main_loop_quit: assertion 'g_atomic_int_get (&loop->ref_count) > 0' failed
06:44:35.593266201 ERROR | [GSTREAMER] Pipeline error: Failed to connect: Connection refused
(wolf:1): GLib-CRITICAL **: 06:44:35.593: g_main_loop_quit: assertion 'g_atomic_int_get (&loop->ref_count) > 0' failed
06:44:35.937384923 INFO | Stopped container: /WolfFirefox_7518890674366070471
06:44:35.960137438 WARN | [ENET] Received packet from unrecognised client 172.18.0.57:44512
Is there something i'm doing wrong ?
See the new protocol extension: LizardByte/Sunshine#1945
Moonlight recently added support for it, we should add it as well.
Video codecs make heavy use of previous frames as references to reduce the size of new frames. However, that means a frame can only be successfully decoded if prior frames were also successfully decoded. That means we have a problem if a frame gets dropped by the network, because a future frame could try to reference it.
There are 2 main ways of dealing with lost frames. The way we've dealt with this in the past is to just request a key frame (which contains no references to prior frames) to get the decoder back to a known state. That is the way most applications handle this situation (or they depend on periodic key frames to recover from any lost frames). The big downside is that key frames are huge and usually end up a much lower quality because they hit bitrate limits. You can sometimes see the blocky artifacts for a couple frames after a key frame while the encoder sends additional detail in following frames.
However, there is a more clever way of handling this that NVENC also supports. You can actually tell the host which exact frames you lost (reference frame invalidation or RFI) and it can avoid referencing those lost frames in newly encoded frames. That means recovering from a loss doesn't require re-encoding the entire screen, just the portion that was lost (and still relevant to what's currently on screen). This means much smaller recovery frames and smaller frames have better image quality (since they aren't hitting the bitrate ceiling) and are less prone to packet loss or network congestion.
RFI also allows us to do some other clever tricks. In the recent updates for Android and iOS, I implemented a feature that I called "speculative RFI". In the past, we would only know for sure that we lost frame N when we received the first packet in frame N+1. That means that we were already dropping a minimum of 2 frames (N which was dropped by the network and N+1 which has to be dropped because we haven't received an RFI recovery frame yet). There are also some cases where it could be much longer than 2 frames to recover, particularly if the network is unstable.
However, If we aren't seeing out of order packets from the host, we can predict if the current frame is likely to be successfully received based on the packets we've received so far. When we receive frame N, we are keeping track of what the latest sequence number of packet we've received is. If we see packets 1, 2, and 8, we can be pretty sure that packets 3-7 have been dropped (since we've never seen out of order packets from the host). That allows Moonlight to do clever things like predict whether it will be able to recover the frame based on what it knows about the number of packets remaining to be received. If we predict that we won't be able to reconstruct the frame because too many packets have been dropped, we can immediately send an RFI request to the host. That can allow us to potentially recover in a single frame.
To be tested
I tried setting WOLF_RENDER_NODE
to /dev/dri/renderD129
to use the GPU instead of Intel QuickSync. But it keeps using Intel and D128.
I verified that the environment variable is correctly set by running -ti ... bash
on the docker run
command:
root@game-srv:/wolf# env | grep WOLF_RENDER_NODE
WOLF_RENDER_NODE=/dev/dri/renderD129
The way I found out it is using Intel is because of the HEVC encoder selection: 19:11:16.370946074 INFO | Selected HEVC encoder: qsv
After pulling the latest image, I'm getting the following error:
[user@user-NAS:/aeternae/data_servers/wolf-GOW]$ sudo docker-compose up
[+] Running 1/1
✔ Container wolf-gow-wolf-1 Recreated 4.6s
Attaching to wolf-1
wolf-1 | [2024-02-17 21:33:58]
wolf-1 | [2024-02-17 21:33:58] [ /etc/cont-init.d/10-setup_user.sh: executing... ]
wolf-1 | [2024-02-17 21:33:58] **** Configure default user ****
wolf-1 | [2024-02-17 21:33:58] Container running as root. Nothing to do.
wolf-1 | [2024-02-17 21:33:58] DONE
wolf-1 | [2024-02-17 21:33:58]
wolf-1 | [2024-02-17 21:33:58] [ /etc/cont-init.d/15-setup_devices.sh: executing... ]
wolf-1 | [2024-02-17 21:33:58] **** Configure devices ****
wolf-1 | [2024-02-17 21:33:58] Exec device groups
wolf-1 | [2024-02-17 21:33:58] Adding user 'root' to groups: gow-gid-174
wolf-1 | [2024-02-17 21:33:59] DONE
wolf-1 | [2024-02-17 21:33:59]
wolf-1 | [2024-02-17 21:33:59] [ /etc/cont-init.d/30-nvidia.sh: executing... ]
wolf-1 | [2024-02-17 21:33:59]
wolf-1 | [2024-02-17 21:33:59]
wolf-1 | [2024-02-17 21:33:59] [ /etc/cont-init.d/init-gamescope.sh: executing... ]
wolf-1 | [2024-02-17 21:33:59] **** Setting up Gamescope ****
wolf-1 | [2024-02-17 21:33:59] Launching the container's startup script as user 'root'
wolf-1 | cp: cannot create regular file '/aeternae/data_servers/wolf-GOW/sessions/fake-udev': No such file or directory
wolf-1 exited with code 0
What can I do to fix it? Completely vanilla docker-compose file, for the most part, too...lemme include it just in-case.
version: "3.8"
services:
wolf:
image: ghcr.io/games-on-whales/wolf:stable
environment:
- XDG_RUNTIME_DIR=/tmp/sockets
- HOST_APPS_STATE_FOLDER=./sessions
volumes:
- ./wolf/:/etc/wolf
- /tmp/sockets:/tmp/sockets:rw
- /var/run/docker.sock:/var/run/docker.sock:rw
- /dev/shm:/dev/shm:rw
- /dev/input:/dev/input:rw
- /run/udev:/run/udev:rw
device_cgroup_rules:
- 'c 13:* rmw'
devices:
- /dev/dri
- /dev/uinput
network_mode: host
restart: unless-stopped
See this recent protocol addition: LizardByte/Sunshine#2025
Hi,
Firstly, thanks for making this all open source and sorry for the support "issue".
I've been looking for ways to run and expose GUI applications in containers and wolf seems really slick. I'm hoping to contribute to the project once I can get my "feet wet".
Issue:
After following the quickstart and installing moonlight I was able to stream the example firefox browser, great! However, the mouse cursor interaction was quite strange, with it being "pinned" to the left of the container window. I then tried changing the settings with Ctrl+Alt+Shift+M and then when entering the application window the mouse cursor is immediately sent to the location on the screen of the host PC.
I then noted the virtual devices support
section of the quickstart hoping that this might resolve the issue.
After following the guide https://games-on-whales.github.io/wolf/stable/user/quickstart.html#_virtual_devices_support, the firefox container crashes almost immediately after launching.
When firefox was running (prior to configuring virtual devices support
) the keyboard was working as expected.
Are there specific logs that would help you identify what might be going on here and how this might be resolved? I'm happy to help debug but I'm not sure where to start.
Host system OS is Ubuntu 22.04
Moonlight 4.3.1
Thanks,
Sam
Today when a client is registered it will have its own app_state_data and the default action is to create a new profile under /etc/wolf for each session.
As a feature enhancement would be good to be able to goto an admin portal created multiple profiles and associate registered devices to that profiles so that app_state_data is shared across devices. This portal could also be a means to more easily serve the device pin page when trying to register the device.
While today is possible to just go into the config.toml and set the app_state_data to be the same for all clients you want this shared, was thinking this could be a better way to more easily set this up.
It's missing, I guess we have to send this event via the control bus when the uinput device receives the event.
So that Wolf can be easily discovered over LAN
Per discussion, here is the testing of the mapping issues I am seeing using a Nintendo Pro Controller (8BitDo Pro 2 in Switch mode)
Wolf image used for testing
ghcr.io/games-on-whales/wolf:dev-input-protocol
Host machine sees this device as:
Input device ID: bus 0x3 vendor 0x57e product 0x2009 version 0x8111
Input device name: "Nintendo Switch Pro Controller"
Virtual Device created by Wolf
Input device ID: bus 0x3 vendor 0x57e product 0x2009 version 0xab00
Input device name: "Wolf Nintendo (virtual) pad"
General mapping issues:
Full list of mapping testing
| Physical Button | Yuzu Mapped To | When Pressed Appears As | Yuzu Should Be | Linux EventCode (Host) | Status? |
|-----------------+----------------+-------------------------+----------------+------------------------+-----------|
| L-Stick Up | Axis 1+ | L-Stick Up | Axis 1+ | Event code 1 (ABS_Y)S- | OK |
| L-Stick Down | Axis 1- | L-Down | Axis 1- | + | OK |
| L-Stick Left | Axis 0- | L-Left | Axis 0- | EC 0 (ABS_X) - | OK |
| L-Stick Right | Axis 0+ | L-Right | Axis 0+ | + | OK |
| L-Stick Pressed | Button 12 | Minus | Button 7 | EC 317 (BTN_THUMBL) | Needs fix |
| R-Stick Up | Axis 3+ | R-Up | Axis 3+ | EC 4 (ABS_RY) - | OK |
| R-Stick Down | Axis 3- | R-Down | Axis 3- | + | OK |
| R-Stick Left | Axis 2- | No response | Axis 2- | EC 3 (ABS_RX) - | Needs fix |
| R-Stick Right | Axis 2+ | No response | Axis 2+ | + | Needs fix |
| R-Stick Pressed | Button 13 | Plus | Button 8 | EC 318 (BTN_THUMBR) | Needs fix |
| D-Pad Up | Hat Up | D-Up | Button 11 | EC 17 (ABS_HAT0Y) -1 | OK |
| D-Pad Down | Hat Down | D-Down | Button 12 | EC 17 (ABS_HAT0Y) 1 | OK |
| D-Pad Left | Hat Left | D-Left | Button 13 | EC 16 (ABS_HAT0X) -1 | OK |
| D-Pad Right | Hat Right | D-Right | Button 14 | EC 16 (ABS_HAT0x) 1 | OK |
| Plus | Button 10 | L-Trigger | Button 6 | EC 315 (BTN_START) | Needs fix |
| Minus | Button 9 | R-Bumper | Button 4 | EC 314 (BTN_SELECT) | Needs fix |
| Home | Button 11 | R-Trigger | Button 5 | EC 316 (BTN_MODE) | Needs fix |
| Capture | Button 4 | NA (nothing) | Button 15 | EC 309 (BTN_Z) | Missing |
| A | Button 1 | B | Button 1 | EC 305 (BTN_EAST) | Needs fix |
| B | Button 0 | A | Button 0 | EC 304 (BTN_SOUTH) | Needs fix |
| X | Button 2 | X | Button 3 | EC 307 (BTN_NORTH) | OK |
| Y | Button 3 | Y | Button 2 | EC 308 (BTN_WEST) | OK |
| L (Bumper) | Button 5 | Capture | Button 9 | EC 310 (BTN_TL) | Needs fix |
| R (Bumper) | Button 6 | L-Bumper | Button 10 | EC 311 (BTN_TR) | Needs fix |
| ZL (Trigger) | Button 7 | R-Stick Right | Axis 4 | EC 312 (BTN_TL2) | Needs fix |
| ZR (Trigger) | Button 8 | No response | Axis 5 | EC 313 (BTN_TR2) | Needs fix |
| Motion | ? | | | | |
| Vibration | ? | | | 80,81,88,89,90,96 | |
Other notes
Reviewing event codes between the host device and virtual device (via evtest) appear generally the same. So I'm a bit confused as to why the mappings are off when used within applications. Is it possible Moonlight is changing these mappings? I'm not familiar enough where to look within the code to check this.
Additionally, evtest reports lots of L-Stick movement within the virtual device even though no activity is taking place on the physical device. This at times appears as chaotic movement on screen.
Let me know if any clarification is needed.
From Discord:
I played around with the settings a bit. I think I set some of these numbers too high, but I don't want to mess with it as it sounds much better. I think what really solved it was changing bitrate-type="constrained-vbr".
Here's all the stuff I threw in there:
default_audio_params = "audio/x-raw, channels={channels}"
default_opus_encoder = """
opusenc bitrate=4000000 bitrate-type="constrained-vbr" frame-size={packet_duration} bandwidth=fullband audio-type="restricted-lowdelay"
max-payload-size=8000 complexity=100
\
"""
I probably set things way too high. It sounds MUCH better though.
Host (Server) specs:
CPU - Ryzen 1400
GPU - RX560 2GB OSS Mesa drivers
RAM - 8GB
OS - Ubuntu 22 LTS
Encoder - H265 (VAAPI). H264 doesnt work at the moment for me.
Client specs
Model - TCL 55P725
Platform - RT51 (chipset)
CPU - 64-bit A55×4 1.3GHz
GPU - G31x2 800MHz
RAM - DDR3-1866: 2 gb
OS - Android R
Logs from Wolf container when issue persists
wolf_log.txt
After starting the Steam container Stream is corrupted, also corrupts rendering of Android itself (flickering in the corners, and lower framerate across all Android UI) Only solution - Rebooting the TV, killing stream or Moonlight didnt help
Followed the instructions here (docker run): https://games-on-whales.github.io/wolf/stable/user/quickstart.html
When attempting connect a Moonlight client, I successfully get the webpage to input the key and receive the following error:
If you set a custom resolution in Moonlight and then connect to the Wolf server all applications output a corrupted screen.
Steps to reproduce
In the moonlight client set a custom resolution and then connect to any application presented in Wolf
HARDWARE
LOGS
Here are the logs I have for the container
wolf-wolf-1_logs.txt
Some additional output captured while troubleshooting
rror: can't connect to X server!
libva info: VA-API version 1.17.0
libva info: Trying to open /usr/lib/x86_64-linux-gnu/dri/radeonsi_drv_video.so
libva info: Found init function __vaDriverInit_1_17
libva info: va_openDriver() returns 0
vainfo: VA-API version: 1.17 (libva 2.12.0)
vainfo: Driver version: Mesa Gallium driver 23.0.2 for AMD Radeon Graphics (gfx1100, LLVM 15.0.7, DRM 3.52, 6.4.10-202.fsync.fc38.x86_64)
vainfo: Supported profile and entrypoints
VAProfileH264ConstrainedBaseline: VAEntrypointVLD
VAProfileH264ConstrainedBaseline: VAEntrypointEncSlice
VAProfileH264Main : VAEntrypointVLD
VAProfileH264Main : VAEntrypointEncSlice
VAProfileH264High : VAEntrypointVLD
VAProfileH264High : VAEntrypointEncSlice
VAProfileHEVCMain : VAEntrypointVLD
VAProfileHEVCMain : VAEntrypointEncSlice
VAProfileHEVCMain10 : VAEntrypointVLD
VAProfileHEVCMain10 : VAEntrypointEncSlice
VAProfileJPEGBaseline : VAEntrypointVLD
VAProfileVP9Profile0 : VAEntrypointVLD
VAProfileVP9Profile2 : VAEntrypointVLD
VAProfileAV1Profile0 : VAEntrypointVLD
VAProfileNone : VAEntrypointVideoProc
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.