mirror of
https://github.com/nestriness/nestri.git
synced 2025-12-12 08:45:38 +02:00
🐛 fix(base): Device selection patch for gpu-screen-recorder (#93)
## Description Adds new `-device` argument for gpu-screen-recorder which allows specifying a GPU to use (by `/dev/dri/cardN` path) This fixes an issue with multi-gpu systems when device such as `/dev/dri/card1` is passed through but gpu-screen-recorder will still try to access `/dev/dri/card0` for capturing and failing. Added relevant bits to `gpu_helpers.sh` to find the card path - I assume all modern modesetting drivers will have a `/drm/` path that tells the card number. If not, the script will fall back to gpu-screen-recorder's own method of finding the card. Edit: Forgot to mention patches are now copied to /tmp/ rather than /etc/ Co-authored-by: Kristian Ollikainen <DatCaptainHorse@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
cf69f6c93a
commit
3df53e7e38
23
.patches/devicearg.patch
Normal file
23
.patches/devicearg.patch
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
diff --git a/src/main.cpp b/src/main.cpp
|
||||||
|
index 112a6ac..57bd9bf 100644
|
||||||
|
--- a/src/main.cpp
|
||||||
|
+++ b/src/main.cpp
|
||||||
|
@@ -1906,6 +1906,7 @@ int main(int argc, char **argv) {
|
||||||
|
{ "-gopm", Arg { {}, true, false } }, // deprecated, used keyint instead
|
||||||
|
{ "-keyint", Arg { {}, true, false } },
|
||||||
|
{ "-encoder", Arg { {}, true, false } },
|
||||||
|
+ { "-device", Arg { {}, true, false } },
|
||||||
|
};
|
||||||
|
|
||||||
|
for(int i = 1; i < argc; i += 2) {
|
||||||
|
@@ -2226,6 +2227,10 @@ int main(int argc, char **argv) {
|
||||||
|
overclock = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ const char *dri_device = args["-device"].value();
|
||||||
|
+ if (dri_device)
|
||||||
|
+ egl.dri_card_path = dri_device;
|
||||||
|
+
|
||||||
|
egl.card_path[0] = '\0';
|
||||||
|
if(wayland || egl.gpu_info.vendor != GSR_GPU_VENDOR_NVIDIA) {
|
||||||
|
// TODO: Allow specifying another card, and in other places
|
||||||
@@ -115,6 +115,16 @@ selected_gpu_vendor=$(get_gpu_vendor "$selected_gpu")
|
|||||||
# Convert lshw gathered bus id into Xorg compatible one
|
# Convert lshw gathered bus id into Xorg compatible one
|
||||||
xorg_bus_id=$(get_gpu_bus_xorg "$selected_gpu")
|
xorg_bus_id=$(get_gpu_bus_xorg "$selected_gpu")
|
||||||
|
|
||||||
|
# Get GPU card path if available
|
||||||
|
selected_gpu_card=""
|
||||||
|
gpu_screen_recorder_device_arg=""
|
||||||
|
|
||||||
|
card_result=$(get_gpu_card "$selected_gpu")
|
||||||
|
if [[ $? -eq 0 && -n "$card_result" ]]; then
|
||||||
|
selected_gpu_card="$card_result"
|
||||||
|
gpu_screen_recorder_device_arg="-device $selected_gpu_card"
|
||||||
|
fi
|
||||||
|
|
||||||
# Check if the selected GPU is an NVIDIA GPU
|
# Check if the selected GPU is an NVIDIA GPU
|
||||||
if [[ "${selected_gpu_vendor,,}" =~ "nvidia" ]]; then
|
if [[ "${selected_gpu_vendor,,}" =~ "nvidia" ]]; then
|
||||||
echo "Selected GPU is NVIDIA. Handling NVIDIA-specific configuration..."
|
echo "Selected GPU is NVIDIA. Handling NVIDIA-specific configuration..."
|
||||||
@@ -264,7 +274,7 @@ sudo chown nestri:nestri /usr/bin/gpu-screen-recorder
|
|||||||
if [[ -z "${SESSION_ID}" ]]; then
|
if [[ -z "${SESSION_ID}" ]]; then
|
||||||
echo "$(date +"[%Y-%m-%d %H:%M:%S]") No stream name was found, did you forget to set the env variable NAME?" && exit 1
|
echo "$(date +"[%Y-%m-%d %H:%M:%S]") No stream name was found, did you forget to set the env variable NAME?" && exit 1
|
||||||
else
|
else
|
||||||
/usr/bin/gpu-screen-recorder -v no -w screen -c flv -f "${REFRESH}" -a "$(pactl get-default-sink).monitor" | ffmpeg -hide_banner -v quiet -i pipe:0 -c copy -f mp4 -movflags empty_moov+frag_every_frame+separate_moof+omit_tfhd_offset - | /usr/bin/warp --name "${SESSION_ID}" https://fst.so:4443 &
|
/usr/bin/gpu-screen-recorder $gpu_screen_recorder_device_arg -v no -w screen -c flv -f "${REFRESH}" -a "$(pactl get-default-sink).monitor" | ffmpeg -hide_banner -v quiet -i pipe:0 -c copy -f mp4 -movflags empty_moov+frag_every_frame+separate_moof+omit_tfhd_offset - | /usr/bin/warp --name "${SESSION_ID}" https://fst.so:4443 &
|
||||||
fi
|
fi
|
||||||
|
|
||||||
openbox-session &
|
openbox-session &
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
declare -ga gpu_map
|
declare -ga gpu_map
|
||||||
declare -gA gpu_bus_map
|
declare -gA gpu_bus_map
|
||||||
|
declare -gA gpu_card_map
|
||||||
declare -gA gpu_product_map
|
declare -gA gpu_product_map
|
||||||
declare -gA vendor_index_map
|
declare -gA vendor_index_map
|
||||||
declare -gA vendor_full_map
|
declare -gA vendor_full_map
|
||||||
@@ -22,6 +23,7 @@ get_gpu_info() {
|
|||||||
# Clear out previous data
|
# Clear out previous data
|
||||||
gpu_map=()
|
gpu_map=()
|
||||||
gpu_bus_map=()
|
gpu_bus_map=()
|
||||||
|
gpu_card_map=()
|
||||||
gpu_product_map=()
|
gpu_product_map=()
|
||||||
vendor_index_map=()
|
vendor_index_map=()
|
||||||
vendor_full_map=()
|
vendor_full_map=()
|
||||||
@@ -72,12 +74,19 @@ get_gpu_info() {
|
|||||||
local gpu_index="${vendor_index_map[$vendor]}"
|
local gpu_index="${vendor_index_map[$vendor]}"
|
||||||
local gpu_key="$vendor:$gpu_index"
|
local gpu_key="$vendor:$gpu_index"
|
||||||
|
|
||||||
|
# Get /dev/dri/cardN of GPU
|
||||||
|
local gpu_card=$({ ls -1d /sys/bus/pci/devices/*${bus_info#pci@}/drm/*; } 2>&1 | grep card* | grep -oP '(?<=card)\d+')
|
||||||
|
|
||||||
# Store info in maps
|
# Store info in maps
|
||||||
gpu_map+=("$gpu_key")
|
gpu_map+=("$gpu_key")
|
||||||
gpu_bus_map["$gpu_key"]="$bus_info"
|
gpu_bus_map["$gpu_key"]="$bus_info"
|
||||||
gpu_product_map["$gpu_key"]="$product"
|
gpu_product_map["$gpu_key"]="$product"
|
||||||
vendor_full_map["$gpu_key"]="$vendor_full"
|
vendor_full_map["$gpu_key"]="$vendor_full"
|
||||||
|
|
||||||
|
if [[ -n "$gpu_card" ]]; then
|
||||||
|
gpu_card_map["$gpu_key"]="$gpu_card"
|
||||||
|
fi
|
||||||
|
|
||||||
# Clear values for additional GPUs
|
# Clear values for additional GPUs
|
||||||
vendor=""
|
vendor=""
|
||||||
product=""
|
product=""
|
||||||
@@ -161,6 +170,12 @@ print_gpu_info() {
|
|||||||
echo " Vendor: ${vendor_full_map[$selected_gpu]}"
|
echo " Vendor: ${vendor_full_map[$selected_gpu]}"
|
||||||
echo " Product: ${gpu_product_map[$selected_gpu]}"
|
echo " Product: ${gpu_product_map[$selected_gpu]}"
|
||||||
echo " Bus: ${gpu_bus_map[$selected_gpu]}"
|
echo " Bus: ${gpu_bus_map[$selected_gpu]}"
|
||||||
|
|
||||||
|
# Check if card path was found
|
||||||
|
if [[ "${gpu_card_map[$selected_gpu]}" ]]; then
|
||||||
|
echo " Card: /dev/dri/card${gpu_card_map[$selected_gpu]}"
|
||||||
|
fi
|
||||||
|
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -241,3 +256,22 @@ get_gpu_bus_xorg() {
|
|||||||
|
|
||||||
echo $(convert_bus_id_to_xorg "${gpu_bus_map[$selected_gpu]}")
|
echo $(convert_bus_id_to_xorg "${gpu_bus_map[$selected_gpu]}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get_gpu_card() {
|
||||||
|
if ! check_and_populate_gpus; then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local selected_gpu
|
||||||
|
if ! selected_gpu=$(check_selected_gpu "$1"); then
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if card path was found
|
||||||
|
if [[ -z "${gpu_card_map[$selected_gpu]}" ]]; then
|
||||||
|
echo "No card device found for GPU: $selected_gpu" >&2
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "/dev/dri/card${gpu_card_map[$selected_gpu]}"
|
||||||
|
}
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ ENV \
|
|||||||
# Disable VSYNC for NVIDIA GPUs
|
# Disable VSYNC for NVIDIA GPUs
|
||||||
__GL_SYNC_TO_VBLANK=0
|
__GL_SYNC_TO_VBLANK=0
|
||||||
|
|
||||||
COPY .patches /etc/
|
COPY .patches /tmp/
|
||||||
|
|
||||||
#Build and install gpu-screen-recorder
|
#Build and install gpu-screen-recorder
|
||||||
RUN apt-get update -y \
|
RUN apt-get update -y \
|
||||||
@@ -259,7 +259,7 @@ RUN apt-get update -y \
|
|||||||
&& find . -maxdepth 1 -type f -name "*libnvrtc.so.*" -exec sh -c 'ln -snf $(basename {}) libnvrtc.so' \; \
|
&& find . -maxdepth 1 -type f -name "*libnvrtc.so.*" -exec sh -c 'ln -snf $(basename {}) libnvrtc.so' \; \
|
||||||
&& mkdir -p /usr/local/nvidia/lib && mv -f libnvrtc* /usr/local/nvidia/lib \
|
&& mkdir -p /usr/local/nvidia/lib && mv -f libnvrtc* /usr/local/nvidia/lib \
|
||||||
&& git clone https://repo.dec05eba.com/gpu-screen-recorder && cd gpu-screen-recorder \
|
&& git clone https://repo.dec05eba.com/gpu-screen-recorder && cd gpu-screen-recorder \
|
||||||
&& git apply /etc/connectcheckskip.patch \
|
&& git apply /tmp/connectcheckskip.patch && git apply /tmp/devicearg.patch \
|
||||||
&& meson setup build \
|
&& meson setup build \
|
||||||
&& meson configure --prefix=/usr --buildtype=release -Dsystemd=true -Dstrip=true build \
|
&& meson configure --prefix=/usr --buildtype=release -Dsystemd=true -Dstrip=true build \
|
||||||
&& ninja -C build install
|
&& ninja -C build install
|
||||||
|
|||||||
Reference in New Issue
Block a user