From d6091d75522c9c769a2bf6ac1af32d22528ca1f2 Mon Sep 17 00:00:00 2001 From: sewn Date: Tue, 28 Nov 2023 15:26:54 +0300 Subject: [PATCH] use PCI device for prime --- cmd/vinegar/vinegar.go | 3 ++- config/cardpick.go | 10 ++++++++-- config/cardpick_test.go | 26 +++++++------------------- config/config_test.go | 4 ++-- sysinfo/card.go | 15 +++++++++------ 5 files changed, 28 insertions(+), 30 deletions(-) diff --git a/cmd/vinegar/vinegar.go b/cmd/vinegar/vinegar.go index e79ca28a..38fea0ac 100644 --- a/cmd/vinegar/vinegar.go +++ b/cmd/vinegar/vinegar.go @@ -6,6 +6,7 @@ import ( "io" "log" "os" + "path" "path/filepath" "runtime/debug" "syscall" @@ -160,7 +161,7 @@ func Sysinfo(pfx *wine.Prefix) { fmt.Println("* Cards:") for i, c := range sysinfo.Cards { - fmt.Printf(" * Card %d: %s %s\n", i, c.Driver, c.Path) + fmt.Printf(" * Card %d: %s %s %s\n", i, c.Driver, path.Base(c.Device), c.Path) } } diff --git a/config/cardpick.go b/config/cardpick.go index c2aeaf21..c9440c4a 100644 --- a/config/cardpick.go +++ b/config/cardpick.go @@ -2,7 +2,9 @@ package config import ( "errors" + "path" "strconv" + "strings" "github.com/vinegarhq/vinegar/sysinfo" ) @@ -62,10 +64,14 @@ func (b *Binary) pickCard() error { return ErrNoCardFound } + c := sysinfo.Cards[idx] + b.Env.Set("MESA_VK_DEVICE_SELECT_FORCE_DEFAULT_DEVICE", "1") - b.Env.Set("DRI_PRIME", strconv.Itoa(idx)) + b.Env.Set("DRI_PRIME", + "pci-"+strings.NewReplacer(":", "_", ".", "_").Replace(path.Base(c.Device)), + ) - if sysinfo.Cards[idx].Driver == "nvidia" { // Workaround for OpenGL in nvidia GPUs + if c.Driver == "nvidia" { // Workaround for OpenGL in nvidia GPUs b.Env.Set("__GLX_VENDOR_LIBRARY_NAME", "nvidia") } else { b.Env.Set("__GLX_VENDOR_LIBRARY_NAME", "mesa") diff --git a/config/cardpick_test.go b/config/cardpick_test.go index 36295337..b7f4241e 100644 --- a/config/cardpick_test.go +++ b/config/cardpick_test.go @@ -30,7 +30,7 @@ func TestCard(t *testing.T) { } } -func TestIntegratedCard(t *testing.T) { +func TestIntegratedAndDiscreteCard(t *testing.T) { b := Binary{ ForcedGpu: "integrated", Env: Environment{}, @@ -38,10 +38,12 @@ func TestIntegratedCard(t *testing.T) { sysinfo.Cards = []sysinfo.Card{ { Driver: "i915", + Device: "0000:01:00.0", Embedded: true, }, { Driver: "nvidia", + Device: "0000:02:00.0", Embedded: false, }, } @@ -50,36 +52,22 @@ func TestIntegratedCard(t *testing.T) { t.Fatal(err) } - if v := b.Env["DRI_PRIME"]; v != "0" { + if v := b.Env["DRI_PRIME"]; v != "pci-0000_01_00_0" { t.Fatal("expected change in integrated prime index") } if v := b.Env["__GLX_VENDOR_LIBRARY_NAME"]; v != "mesa" { t.Fatal("expected glx vendor to be mesa") } -} -func TestDiscreteCard(t *testing.T) { - b := Binary{ - ForcedGpu: "prime-discrete", - Env: Environment{}, - } - sysinfo.Cards = []sysinfo.Card{ - { - Driver: "i915", - Embedded: true, - }, - { - Driver: "nvidia", - Embedded: false, - }, - } + b.Env = Environment{} + b.ForcedGpu = "prime-discrete" if err := b.pickCard(); err != nil { t.Fatal(err) } - if v := b.Env["DRI_PRIME"]; v != "1" { + if v := b.Env["DRI_PRIME"]; v != "pci-0000_02_00_0" { t.Fatal("expected change in discrete prime index") } diff --git a/config/config_test.go b/config/config_test.go index e62e8a96..75698cab 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -1,8 +1,8 @@ package config import ( - "os" "errors" + "os" "path/filepath" "testing" ) @@ -40,7 +40,7 @@ func TestGlobal(t *testing.T) { if c.Player.Env["MEOW"] != "PLAYER" { t.Error("expected player overrides global env") } - + if c.Studio.Env["MEOW"] != "DEPRECATED" { t.Error("expected studio applies global env") } diff --git a/sysinfo/card.go b/sysinfo/card.go index 785593bb..0adab9b6 100644 --- a/sysinfo/card.go +++ b/sysinfo/card.go @@ -10,9 +10,10 @@ import ( ) type Card struct { - Path string - Driver string - Embedded bool + Path string // Path to the drm card + Device string // Path to the PCI device + Driver string // Base driver name + Embedded bool // Integrated display } const drmPath = "/sys/class/drm" @@ -25,12 +26,14 @@ func getCards() (cs []Card) { drmCards, _ := filepath.Glob(path.Join(drmPath, "card[0-9]")) for _, c := range drmCards { - d, _ := filepath.EvalSymlinks(path.Join(c, "device/driver")) - d = path.Base(d) + dev, _ := filepath.EvalSymlinks(path.Join(c, "device")) + driver, _ := filepath.EvalSymlinks(path.Join(dev, "driver")) + driver = path.Base(driver) cs = append(cs, Card{ Path: c, - Driver: d, + Device: dev, + Driver: driver, Embedded: embedded(c), }) }