From 498c661fcbaf2d19b8d252e7f461fcf91e6e4406 Mon Sep 17 00:00:00 2001 From: JupiterRider <60042618+JupiterRider@users.noreply.github.com> Date: Wed, 29 May 2024 19:18:03 +0200 Subject: [PATCH] purego PoC for linux and freebsd --- raylib/go.mod | 5 ++- raylib/go.sum | 2 + raylib/purego_unix.go | 3 -- raylib/raylib_purego_unix.go | 73 ++++++++++++++++++++++++++++++++++++ 4 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 raylib/raylib_purego_unix.go diff --git a/raylib/go.mod b/raylib/go.mod index 4dc010b..5866a89 100644 --- a/raylib/go.mod +++ b/raylib/go.mod @@ -7,4 +7,7 @@ require ( golang.org/x/sys v0.20.0 ) -require golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 +require ( + github.com/jupiterrider/ffi v0.1.0-beta.8 + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 +) diff --git a/raylib/go.sum b/raylib/go.sum index 2241fa5..8049303 100644 --- a/raylib/go.sum +++ b/raylib/go.sum @@ -1,5 +1,7 @@ github.com/ebitengine/purego v0.7.1 h1:6/55d26lG3o9VCZX8lping+bZcmShseiqlh2bnUDiPA= github.com/ebitengine/purego v0.7.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/jupiterrider/ffi v0.1.0-beta.8 h1:9hTtlgc3zHPyQLakD5DxVk0b3x+Ts/emoPxxjjkUApc= +github.com/jupiterrider/ffi v0.1.0-beta.8/go.mod h1:sOp6VJGFaYyr4APi8gwy6g20QNHv5F8Iq1CVbtC900s= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= diff --git a/raylib/purego_unix.go b/raylib/purego_unix.go index 61a5d32..c5e614e 100644 --- a/raylib/purego_unix.go +++ b/raylib/purego_unix.go @@ -50,9 +50,6 @@ func loadLibrary() uintptr { panic(fmt.Errorf("version %s of %s doesn't match the required version %s", version, libname, requiredVersion)) } - //DEBUG - fmt.Println(version) - return uintptr(handle) } diff --git a/raylib/raylib_purego_unix.go b/raylib/raylib_purego_unix.go new file mode 100644 index 0000000..0d4aa6f --- /dev/null +++ b/raylib/raylib_purego_unix.go @@ -0,0 +1,73 @@ +//go:build !cgo && (freebsd || linux) + +package rl + +import ( + "unsafe" + + "github.com/ebitengine/purego" + "github.com/jupiterrider/ffi" + "golang.org/x/sys/unix" +) + +// bundle bundles the function pointer "sym" and the ffi call interface "cif" +type bundle struct { + sym uintptr + cif ffi.Cif +} + +func newBundle(name string, rType *ffi.Type, aTypes ...*ffi.Type) *bundle { + b := new(bundle) + var err error + + if b.sym, err = purego.Dlsym(raylibDll, name); err != nil { + panic(err) + } + + nArgs := uint32(len(aTypes)) + + if status := ffi.PrepCif(&b.cif, ffi.DefaultAbi, nArgs, rType, aTypes...); status != ffi.OK { + panic(status) + } + + return b +} + +var ( + // raylibDll is the pointer to the shared library + raylibDll uintptr +) + +var ( + initWindow *bundle + closeWindow *bundle + setTraceLogCallback *bundle +) + +func init() { + raylibDll = loadLibrary() + + initWindow = newBundle("InitWindow", &ffi.TypeVoid, &ffi.TypeSint32, &ffi.TypeSint32, &ffi.TypePointer) + closeWindow = newBundle("CloseWindow", &ffi.TypeVoid) + setTraceLogCallback = newBundle("SetTraceLogCallback", &ffi.TypeVoid, &ffi.TypePointer) +} + +// InitWindow - Initialize window and OpenGL context +func InitWindow(width int32, height int32, title string) { + ctitle, err := unix.BytePtrFromString(title) + if err != nil { + panic(err) + } + ffi.Call(&initWindow.cif, initWindow.sym, nil, unsafe.Pointer(&width), unsafe.Pointer(&height), unsafe.Pointer(&ctitle)) +} + +// CloseWindow - Close window and unload OpenGL context +func CloseWindow() { + ffi.Call(&closeWindow.cif, closeWindow.sym, nil) +} + +// SetTraceLogCallback - Set custom trace log +func SetTraceLogCallback(fn TraceLogCallbackFun) { + callback := traceLogCallbackWrapper(fn) + ffi.Call(&setTraceLogCallback.cif, setTraceLogCallback.sym, nil, unsafe.Pointer(&callback)) +}