Shell Script für Steam + Nvidia Grafikkarten älter als Turing

Grimba

Captain
Registriert
Dez. 2007
Beiträge
3.848
Hallo zusammen,

ich besitze ein ThinkpadW530, das noch eine Kepler Grafikkarte (Quadro K2000M) besitzt. Damit kann man aktuell in Verbindung mit den höchstmöglichen NVIDIA Treiber 470 maximal dxvk 1.10.3 einsetzen bzw. vkd3d 2.6. Das liegt daran, dass spätere Versionen auf eine neuere Vulkan Version setzen, die von dem Treiber nicht mehr unterstützt wird.

Bisher fand ich es doof, dass man dann in Steam auf Proton 7 setzen musste, was langsam doch arg alt wird. In Lutris konnte man bei egal welcher Wine Version die Versionen von dxvk und vkd3d selber festlegen. Eben weil das einfach geht, war ich mir sicher, dass das doch auch mit Steam alleine ohne Lutris möglich sein muss, hier die Libraries auszutauschen. Und tatsächlich geht das. Es reicht, in der jeweiligen Proton Version, die neuer als 7 ist, einfach die älteren dlls an die enstsprechende Stelle zu kopieren und die neueren zu ersetzen.

Dass das funktioniert, habe ich mit Tomb Raider I-III Remaster testen können, das läuft nämlich nicht mit Proton 7, mit neueren Versionen aber schon, z.B. Experimental. Nachdem ich diesem also die älteren dlls untergeschoben habe, lief es danach einwandfrei und butterweich flüssig auf der alten Kiste.

Damit ich das nicht jedes mal per Hand machen muss, habe ich gerade ein kleines shell script geschrieben, dass das in Zukunft für mich erledigt. Das möchte ich euch nicht vorenthalten. Gleich vorweg, das ist maximal dahingerotzt, und wirklich nicht perfekt. Das weiß ich selber :D Bin etwas ungeübt in bash. Ich werde vermutlich in Zukunft noch etwas daran herumbasteln. Aber es funktioniert in der vorliegenden Fassung schonmal und ersetzt sowohl bei von Steam installierten Proton Versionen die Dateien und auch durch ProtonUp hinzugefügte GE Versionen. Es geht aber davon aus, dass nur das da ist, also kein Roberta etc., außerdem von einer Standardinstallation ohne, dass Proton auf einem anderen Speichermedium liegt. Wie gesagt, mal eben dahingerotztes Script. Wer will, kann das ja für sich anpassen, feel free.

Mit etwas Gück wird das alles in Zukunft gar nicht mehr nötig, wenn sich die Situation mit dem offenen Treiber weiter verbessert. Bis dahin ist es eine vielleicht auch eine Hilfe. Es müssen dazu von den entsprechenden github Repos von dxvk und vkd3d-proton die entsprechenden Versionen heruntergeladen werden und im gleichen Ordner, in dem das Skript liegt, entpackt werden. Vielleicht bau ich irgendwann auch einen automatischen Download ein, wer weiß. (done!)

So, aber nun genug gesabbelt, hier bitteschön:
Bash:
#!/bin/bash

my_steampath="/home/$USER/.steam"
echo "Using Steam path: $my_steampath"

if [[ ! -d "$my_steampath" ]]; then
  echo "ERROR: Steam not found!"
  exit 1
fi

if [[ ! -d "dxvk-1.10.3" ]]; then
  echo "DXVK 1.10.3 not found! Starting download..."
  wget -q -T 5 --show-progress https://github.com/doitsujin/dxvk/releases/download/v1.10.3/dxvk-1.10.3.tar.gz
  if [ ! $? -eq 0 ]; then
    echo "ERROR: Something went wrong during download!"
    exit 1
  fi
  echo "Extracting archive..."
  tar xzf dxvk-1.10.3.tar.gz
  rm dxvk-1.10.3.tar.gz
  echo "Done!"
fi

if [[ ! -d "vkd3d-proton-2.6" ]]; then
  echo "VKD3D-Proton 2.6 not found! Starting download..."
  wget -q -T 5 --show-progress https://github.com/HansKristian-Work/vkd3d-proton/releases/download/v2.6/vkd3d-proton-2.6.tar.zst
  if [ ! $? -eq 0 ]; then
    echo "ERROR: Something went wrong during download!"
    exit 1
  fi
  echo "Extracting archive..."
  tar --zstd -xf vkd3d-proton-2.6.tar.zst
  rm vkd3d-proton-2.6.tar.zst
  echo "Done!"
fi

echo "Patching Proton installations..."
for d in "$my_steampath/steam/steamapps/common/Proton"*
do
  version=$(basename "$d")
  inside_path="files"
  echo $version
  if [[ "$version" == "Proton 7.0" ]]; then
    echo "Skipping $version, patching not necessary."
    continue
  fi
  if [[ "$version" == "Proton 8.0" ]]; then
    inside_path="dist"
  fi

  echo "Replacing DXVK with version 1.10.3 ..."
  chmod u+w "$d/$inside_path/lib/wine/dxvk/"*
  cp -f dxvk-1.10.3/x32/* "$d/$inside_path/lib/wine/dxvk"
  chmod u-w "$d/$inside_path/lib/wine/dxvk/"*
  chmod u+w "$d/$inside_path/lib64/wine/dxvk/"*
  cp -f dxvk-1.10.3/x64/* "$d/$inside_path/lib64/wine/dxvk"
  chmod u-w "$d/$inside_path/lib64/wine/dxvk/"*
  echo "... done!"
  echo "Replacing VKD3D-Proton with version 2.6 ..."
  chmod u+w "$d/$inside_path/lib/wine/vkd3d-proton/"*
  cp -f vkd3d-proton-2.6/x86/* "$d/$inside_path/lib/wine/vkd3d-proton"
  chmod u-w "$d/$inside_path/lib/wine/vkd3d-proton/"*
  chmod u+w "$d/$inside_path/lib64/wine/vkd3d-proton/"*
  cp -f vkd3d-proton-2.6/x64/* "$d/$inside_path/lib64/wine/vkd3d-proton"
  chmod u-w "$d/$inside_path/lib64/wine/vkd3d-proton/"*
  echo "... done!"
done

if [[ -d "$my_steampath/steam/compatibilitytools.d" ]]; then
  echo "Patching Proton-GE installations..."
  for d in "$my_steampath/steam/compatibilitytools.d/GE-Proton"*
  do
    version=$(basename "$d")
    echo $version
 
    echo "Replacing DXVK with version 1.10.3 ..."
    chmod u+w "$d/files/lib/wine/dxvk/"*
    cp -f dxvk-1.10.3/x32/* "$d/files/lib/wine/dxvk"
    chmod u-w "$d/files/lib/wine/dxvk/"*
    chmod u+w "$d/files/lib64/wine/dxvk/"*
    cp -f dxvk-1.10.3/x64/* "$d/files/lib64/wine/dxvk"
    chmod u-w "$d/files/lib64/wine/dxvk/"*
    echo "... done!"
    echo "Replacing VKD3D-Proton with version 2.6 ..."
    chmod u+w "$d/files/lib/wine/vkd3d-proton/"*
    cp -f vkd3d-proton-2.6/x86/* "$d/files/lib/wine/vkd3d-proton"
    chmod u-w "$d/files/lib/wine/vkd3d-proton/"*
    chmod u+w "$d/files/lib64/wine/vkd3d-proton/"*
    cp -f vkd3d-proton-2.6/x64/* "$d/files/lib64/wine/vkd3d-proton"
    chmod u-w "$d/files/lib64/wine/vkd3d-proton/"*
    echo "... done!"
  done
fi
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Uridium und h2f
Das ist in der Tat etwas fummelig. Finde ich gut, dass Du das mal zusammengefasst hast.

Grimba schrieb:
Mit etwas Gück wird das alles in Zukunft gar nicht mehr nötig, wenn sich die Situation mit dem offenen Treiber weiter verbessert.
Du meinst Nouveau? Da wäre ich mir nicht so sicher, ob das mit 'Compute Capability 3.0/Cuda 10.2' jemals was wird (oder mit einem neuen Interface für höhere dxvk/vkd3d Versionen). Der Nvidia-eigene (tlw. offene) Treiber wird nie für Kepler erscheinen. Der 470 LTSB Treiber ist 07/2024 EOL. Wird bald eng.
 
Zuletzt bearbeitet:
Über das EOL seitens NVIDIA mache ich mir keine Sorgen, wenn man bedenkt, wie lange der 390 schon am Leben gehalten wird. Das wird kein hartes Ende werden.
 
Für "maximal dahingerotzt" sieht das Skript aber noch sehr gut aus. Ich bekomme regelmäßig Skripte vorgelegt, für dich sich jemand maximal Mühe gegeben hat und die auf produktiven Systemen eingesetzt werden sollen, die ganz anders aussehen 😁

Jedenfalls danke fürs Teilen!

Grimba schrieb:
if [[ ! -d "vkd3d-proton-2.6" ]]; then
Hier erwartet das Skript schon im richtigen Verzeichnis zu sein, korrekt?
Falls ja, willst du sonst noch entweder ein cd zum erwarteten Verzeichnis einfügen oder hierfür auch den vollständigen Pfad für die Prüfung verwenden (wie auch bei my_steampath)?
 
Danke für die Blumen. Was das Verzeichnis angeht, ich sage ja, dass es erwartet, dass dxvk und vkd3d im gleichen Verzeichnis liegen sollen, wie das Skript selbst. Natürlich packe ich da keinen vollständigen Pfad rein, damit man das hinlegen kann, wo man möchte. Und die Namen der Verzeichnisse stammen aus den Releases selbst, das ist das, was rauskommt, wenn man die entpackt. Für den Steamordner eignet sich dann aber kein relativer Pfad mehr.

btw: Update
  • feature: Automatischer Download von dxvk und vkd3d-proton
  • fix: Im Verzeichnis compatibilitytools.d werden jetzt nur noch Verzeichnisse, die mit GE-Proton anfangen berücksichtigt, um nicht in andere Tools wie z.B. Roberta reinzuschreiben.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: R00kie
Zurück
Oben