* feat: add GPU information retrieval for darwin using cgo * fix kIOMasterPortDefault thing * return 0
66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
//go:build darwin && cgo
|
|
|
|
package gpu
|
|
|
|
// #cgo LDFLAGS: -framework IOKit -framework CoreFoundation
|
|
// #include "stat/gpu_darwin.h"
|
|
import "C"
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
"unsafe"
|
|
)
|
|
|
|
func GoStrings(argc C.int, argv **C.char) []string {
|
|
length := int(argc)
|
|
tmpslice := unsafe.Slice(argv, length)
|
|
gostrings := make([]string, length)
|
|
for i, s := range tmpslice {
|
|
gostrings[i] = C.GoString(s)
|
|
}
|
|
return gostrings
|
|
}
|
|
|
|
func extractGPUInfo(key *C.char) ([]string, error) {
|
|
devices := C.find_devices(key)
|
|
if devices != nil {
|
|
defer C.free(unsafe.Pointer(devices))
|
|
length := 0
|
|
for {
|
|
device := *(**C.char)(unsafe.Pointer(uintptr(unsafe.Pointer(devices)) + uintptr(length)*unsafe.Sizeof(*devices)))
|
|
if device == nil {
|
|
break
|
|
}
|
|
length++
|
|
}
|
|
gpu := GoStrings(C.int(length), devices)
|
|
return gpu, nil
|
|
}
|
|
return nil, errors.New("cannot find key")
|
|
}
|
|
|
|
func GetGPUModel() ([]string, error) {
|
|
vendorNames := []string{
|
|
"AMD", "Intel", "Nvidia", "Apple",
|
|
}
|
|
|
|
key := C.CString("model")
|
|
defer C.free(unsafe.Pointer(key))
|
|
|
|
gi, err := extractGPUInfo(key)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var gpuModel []string
|
|
for _, model := range gi {
|
|
for _, vendor := range vendorNames {
|
|
if strings.Contains(model, vendor) {
|
|
gpuModel = append(gpuModel, model)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
return gpuModel, nil
|
|
}
|