diff --git a/config/cardpick.go b/config/cardpick.go index ab3f4ef0..33124291 100644 --- a/config/cardpick.go +++ b/config/cardpick.go @@ -2,12 +2,17 @@ package config import ( "errors" - "fmt" "strconv" "github.com/vinegarhq/vinegar/sysinfo" ) +var ( + ErrOpenGLBlind = errors.New("opengl is not capable of choosing the right gpu, it must be explicitly defined") + ErrNoCardFound = errors.New("gpu not found") + ErrBadGpuIndex = errors.New("gpu index cannot be negative") +) + func (b *Binary) pickCard() error { if b.ForcedGpu == "" { return nil @@ -38,7 +43,7 @@ func (b *Binary) pickCard() error { vk := b.Dxvk || b.Renderer == "Vulkan" if n != 2 && (!vk && n != 1) { - return fmt.Errorf("opengl is not capable of choosing the right gpu, it must be explicitly defined") + return ErrOpenGLBlind } if n != 2 { @@ -51,11 +56,11 @@ func (b *Binary) pickCard() error { } if idx < 0 { - return errors.New("gpu index cannot be negative") + return ErrBadGpuIndex } if n < idx+1 { - return errors.New("gpu not found") + return ErrNoCardFound } b.Env.Set("MESA_VK_DEVICE_SELECT_FORCE_DEFAULT_DEVICE", "1") diff --git a/config/cardpick_test.go b/config/cardpick_test.go new file mode 100644 index 00000000..812b8737 --- /dev/null +++ b/config/cardpick_test.go @@ -0,0 +1,83 @@ +package config + +import ( + "errors" + "strconv" + "testing" + "github.com/vinegarhq/vinegar/sysinfo" +) + +func TestCard(t *testing.T) { + sysinfo.Cards = []sysinfo.Card{} + b := Binary{ + ForcedGpu: "meow", + Env: Environment{}, + } + + if err := b.pickCard(); !errors.Is(err, strconv.ErrSyntax) { + t.Fatal("expected to not handle string gpu") + } + + b.ForcedGpu = "1" + if err := b.pickCard(); !errors.Is(err, ErrNoCardFound) { + t.Fatal("expected to handle no gpu found") + } + + b.ForcedGpu = "-1" + if err := b.pickCard(); !errors.Is(err, ErrBadGpuIndex) { + t.Fatal("expected to not handle negative gpu index") + } +} + +func TestPRIMECard(t *testing.T) { + b := Binary{ + ForcedGpu: "integrated", + Env: Environment{}, + } + sysinfo.Cards = []sysinfo.Card{ + { + Driver: "i915", + Embedded: true, + }, + } + + if err := b.pickCard(); err != nil { + t.Fatal(err) + } + + if _, ok := b.Env["DRI_PRIME"]; ok { + t.Fatal("expected no change") + } + + sysinfo.Cards = append(sysinfo.Cards, sysinfo.Card{ + Driver: "nvidia", + Embedded: false, + }) + + if err := b.pickCard(); err != nil { + t.Fatal(err) + } + + if v := b.Env["DRI_PRIME"]; v != "0" { + t.Fatal("expected change in prime index") + } + + if v := b.Env["__GLX_VENDOR_LIBRARY_NAME"]; v != "mesa" { + t.Fatal("expected glx vendor to be mesa") + } + + b.ForcedGpu = "prime-discrete" + delete(b.Env, "DRI_PRIME") + delete(b.Env, "__GLX_VENDOR_LIBRARY_NAME") + if err := b.pickCard(); err != nil { + t.Fatal(err) + } + + if v := b.Env["DRI_PRIME"]; v != "1" { + t.Fatal("expected change in descrete index") + } + + if v := b.Env["__GLX_VENDOR_LIBRARY_NAME"]; v != "nvidia" { + t.Fatal("expected glx vendor to be nvidia") + } +} \ No newline at end of file