Optimization for devices without vulkan driver

This commit is contained in:
2025-07-27 16:45:45 +05:00
parent b57b6d8a76
commit d043905e16

View File

@ -2828,105 +2828,108 @@ pw_check_dxvk () {
IFS='' read -r -a SELECTED_VULKAN_GPU <<< "$PW_GPU_USE"
fi
# какие карты в приоритете, если не выбран изначально PW_GPU_USE
if [[ -n ${SELECTED_VULKAN_GPU[1]} ]] ; then
for elem in "${SELECTED_VULKAN_GPU[@]}"; do
elem_lower=${elem,,}
if [[ $elem_lower =~ nvidia ]]; then
nvidia_group+=("$elem")
elif [[ $elem_lower =~ radv ]]; then
radv_group+=("$elem")
elif [[ $elem_lower =~ amd ]]; then
amd_group+=("$elem")
elif [[ $elem_lower =~ intel ]]; then
intel_group+=("$elem")
else
other_group+=("$elem")
fi
done
unset SELECTED_VULKAN_GPU
SELECTED_VULKAN_GPU_NEW=(
"${nvidia_group[@]}"
"${radv_group[@]}"
"${amd_group[@]}"
"${intel_group[@]}"
"${other_group[@]}"
)
fi
# получаем информацию о конкретном драйвере который выбран в PW_GPU_USE,
# либо ищем наилучший драйвер с учётом приоритета видеокарт + инфа
for i in "${SELECTED_VULKAN_GPU_NEW[@]}" "${SELECTED_VULKAN_GPU[@]}" ; do
PW_CHECK_VULKAN_DRIVER="$(awk -v target="$i" '
BEGIN {
in_target = 0
}
/^GPU[0-9]+:/ {
if (in_target) {
in_target = 0
}
next
}
/apiVersion/ { var1=$0 }
/driverVersion/ { var2=$0 }
/deviceName/ { var3=$0 }
/deviceName/ && !/llvmpipe/ {
split($0, parts, "=")
device_name = parts[2]
gsub(/^[[:space:]]+|[[:space:]]+$/, "", device_name)
if (device_name == target) in_target = 1
next
}
in_target {
if ($0 ~ /driverName/) { var5=$0 }
if ($0 ~ /driverInfo/) { var4=$0; exit }
}
END {
print var1 "!" var2 "!" var3 "!" var4 "!" var5 "!"
}
' "${PW_TMPFS_PATH}/vulkaninfo.tmp")"
IFS='!' read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY <<< "$PW_CHECK_VULKAN_DRIVER"
if [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[4],,} =~ nvidia ]] ; then
read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY_3 <<< "${PW_CHECK_VULKAN_DRIVER_ARRAY[3]}"
if compare_versions "${PW_CHECK_VULKAN_DRIVER_ARRAY_3[2]}" "550.54.14" ; then
PW_VULKAN_DRIVER_USE="6" && break
fi
elif [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[3],,} =~ mesa ]] ; then
read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY_1 <<< "${PW_CHECK_VULKAN_DRIVER_ARRAY[1]}"
if compare_versions "${PW_CHECK_VULKAN_DRIVER_ARRAY_1[2]}" "25.0" ; then
PW_VULKAN_DRIVER_USE="6" && break
fi
elif [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[4],,} == *"amd open-source driver"* ]] ; then
read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY_1 <<< "${PW_CHECK_VULKAN_DRIVER_ARRAY[1]}"
if compare_versions "${PW_CHECK_VULKAN_DRIVER_ARRAY_1[2]}" "2.0.310" ; then
PW_VULKAN_DRIVER_USE="6" && break
fi
fi
done
# если выбран amdvlk, то глобально без выбора PW_AMD_VULKAN_USE будет работать он
# для тех систем, где к примеру radv не используется, либо в приоритете amdvlk
if [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[4],,} == *"amd open-source driver"* ]] && [[ -z $PW_AMD_VULKAN_USE || $PW_AMD_VULKAN_USE == "disabled" ]] ; then
PW_VK_ICD_FILENAMES=""
for dir in /opt/amdgpu/etc/vulkan/icd.d /etc/vulkan/icd.d /usr/share/vulkan/icd.d; do
for file in "$dir"/amd_icd*.json; do
[ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file"
# оптимизация когда vulkan драйвера в системе нет
if [[ -n ${SELECTED_VULKAN_GPU[@]} ]] ; then
# какие карты в приоритете, если не выбран изначально PW_GPU_USE
if [[ -n ${SELECTED_VULKAN_GPU[1]} ]] ; then
for elem in "${SELECTED_VULKAN_GPU[@]}"; do
elem_lower=${elem,,}
if [[ $elem_lower =~ nvidia ]]; then
nvidia_group+=("$elem")
elif [[ $elem_lower =~ radv ]]; then
radv_group+=("$elem")
elif [[ $elem_lower =~ amd ]]; then
amd_group+=("$elem")
elif [[ $elem_lower =~ intel ]]; then
intel_group+=("$elem")
else
other_group+=("$elem")
fi
done
unset SELECTED_VULKAN_GPU
SELECTED_VULKAN_GPU_NEW=(
"${nvidia_group[@]}"
"${radv_group[@]}"
"${amd_group[@]}"
"${intel_group[@]}"
"${other_group[@]}"
)
fi
# получаем информацию о конкретном драйвере который выбран в PW_GPU_USE,
# либо ищем наилучший драйвер с учётом приоритета видеокарт + инфа
for i in "${SELECTED_VULKAN_GPU_NEW[@]}" "${SELECTED_VULKAN_GPU[@]}" ; do
PW_CHECK_VULKAN_DRIVER="$(awk -v target="$i" '
BEGIN {
in_target = 0
}
/^GPU[0-9]+:/ {
if (in_target) {
in_target = 0
}
next
}
/apiVersion/ { var1=$0 }
/driverVersion/ { var2=$0 }
/deviceName/ { var3=$0 }
/deviceName/ && !/llvmpipe/ {
split($0, parts, "=")
device_name = parts[2]
gsub(/^[[:space:]]+|[[:space:]]+$/, "", device_name)
if (device_name == target) in_target = 1
next
}
in_target {
if ($0 ~ /driverName/) { var5=$0 }
if ($0 ~ /driverInfo/) { var4=$0; exit }
}
END {
print var1 "!" var2 "!" var3 "!" var4 "!" var5 "!"
}
' "${PW_TMPFS_PATH}/vulkaninfo.tmp")"
IFS='!' read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY <<< "$PW_CHECK_VULKAN_DRIVER"
if [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[4],,} =~ nvidia ]] ; then
read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY_3 <<< "${PW_CHECK_VULKAN_DRIVER_ARRAY[3]}"
if compare_versions "${PW_CHECK_VULKAN_DRIVER_ARRAY_3[2]}" "550.54.14" ; then
PW_VULKAN_DRIVER_USE="6" && break
fi
elif [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[3],,} =~ mesa ]] ; then
read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY_1 <<< "${PW_CHECK_VULKAN_DRIVER_ARRAY[1]}"
if compare_versions "${PW_CHECK_VULKAN_DRIVER_ARRAY_1[2]}" "25.0" ; then
PW_VULKAN_DRIVER_USE="6" && break
fi
elif [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[4],,} == *"amd open-source driver"* ]] ; then
read -r -a PW_CHECK_VULKAN_DRIVER_ARRAY_1 <<< "${PW_CHECK_VULKAN_DRIVER_ARRAY[1]}"
if compare_versions "${PW_CHECK_VULKAN_DRIVER_ARRAY_1[2]}" "2.0.310" ; then
PW_VULKAN_DRIVER_USE="6" && break
fi
fi
done
export PW_VK_ICD_FILENAMES
fi
# фикс, если вдруг название PW_GPU_USE изменилось
if [[ -z ${PW_CHECK_VULKAN_DRIVER_ARRAY[4]} ]] && [[ -n $PW_GPU_USE && $PW_GPU_USE != "disabled" ]] ; then
unset PW_GPU_USE
pw_check_dxvk
fi
# если выбран amdvlk, то глобально без выбора PW_AMD_VULKAN_USE будет работать он
# для тех систем, где к примеру radv не используется, либо в приоритете amdvlk
if [[ ${PW_CHECK_VULKAN_DRIVER_ARRAY[4],,} == *"amd open-source driver"* ]] && [[ -z $PW_AMD_VULKAN_USE || $PW_AMD_VULKAN_USE == "disabled" ]] ; then
PW_VK_ICD_FILENAMES=""
for dir in /opt/amdgpu/etc/vulkan/icd.d /etc/vulkan/icd.d /usr/share/vulkan/icd.d; do
for file in "$dir"/amd_icd*.json; do
[ -f "$file" ] && PW_VK_ICD_FILENAMES="${PW_VK_ICD_FILENAMES:+${PW_VK_ICD_FILENAMES}:}$file"
done
done
export PW_VK_ICD_FILENAMES
fi
# если PW_GPU_USE изначально не было
if [[ -z $PW_GPU_USE ]] ; then
export PW_GPU_USE=${PW_CHECK_VULKAN_DRIVER_ARRAY[2]//*= /}
edit_user_conf_from_gui PW_GPU_USE
# фикс, если вдруг название PW_GPU_USE изменилось
if [[ -z ${PW_CHECK_VULKAN_DRIVER_ARRAY[4]} ]] && [[ -n $PW_GPU_USE && $PW_GPU_USE != "disabled" ]] ; then
unset PW_GPU_USE
pw_check_dxvk
fi
# если PW_GPU_USE изначально не было
if [[ -z $PW_GPU_USE ]] ; then
export PW_GPU_USE=${PW_CHECK_VULKAN_DRIVER_ARRAY[2]//*= /}
edit_user_conf_from_gui PW_GPU_USE
fi
fi
fi