From 9c070eb2f32c3a74e425f61df88bade3edbea5e6 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 7 Apr 2024 03:00:13 +0900 Subject: [PATCH] Revert "internal/graphicsdriver/gl: use PureGo for Linux and UNIX" This reverts commit 5701206229c345816511bae5ab466f113a2810e1. Reason: error on Android: ``` /Users/runner/go/pkg/mod/github.com/ebitengine/purego@v0.8.0-alpha.0.20240404024320-d0aedd0f4393/func.go:301:4: too few values in struct literal of type syscall15Args ``` https://github.com/hajimehoshi/ebiten/actions/runs/8582651053/job/23521003819 --- .../graphicsdriver/opengl/gl/default_cgo.go | 2 +- .../opengl/gl/default_purego.go | 2 +- .../opengl/gl/procaddr_linbsd.go | 73 +++++++++++-------- 3 files changed, 44 insertions(+), 33 deletions(-) diff --git a/internal/graphicsdriver/opengl/gl/default_cgo.go b/internal/graphicsdriver/opengl/gl/default_cgo.go index 535f469db..c9f5a58aa 100644 --- a/internal/graphicsdriver/opengl/gl/default_cgo.go +++ b/internal/graphicsdriver/opengl/gl/default_cgo.go @@ -2,7 +2,7 @@ // SPDX-FileCopyrightText: 2014 Eric Woroshow // SPDX-FileCopyrightText: 2022 The Ebitengine Authors -//go:build nintendosdk +//go:build !darwin && !js && !windows && !playstation5 package gl diff --git a/internal/graphicsdriver/opengl/gl/default_purego.go b/internal/graphicsdriver/opengl/gl/default_purego.go index dda9e1548..179cd8f4e 100644 --- a/internal/graphicsdriver/opengl/gl/default_purego.go +++ b/internal/graphicsdriver/opengl/gl/default_purego.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build (darwin || freebsd || linux || netbsd || openbsd || windows) && !nintendosdk && !playstation5 +//go:build darwin || windows package gl diff --git a/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go b/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go index a9a00470a..3047376c6 100644 --- a/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go +++ b/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go @@ -16,18 +16,38 @@ package gl +// #cgo LDFLAGS: -ldl +// +// #include +// #include +// +// static void* getProcAddressGL(void* libGL, const char* name) { +// static void*(*glXGetProcAddress)(const char*); +// if (!glXGetProcAddress) { +// glXGetProcAddress = dlsym(libGL, "glXGetProcAddress"); +// if (!glXGetProcAddress) { +// glXGetProcAddress = dlsym(libGL, "glXGetProcAddressARB"); +// } +// } +// return glXGetProcAddress(name); +// } +// +// static void* getProcAddressGLES(void* libGLES, const char* name) { +// return dlsym(libGLES, name); +// } +import "C" + import ( "fmt" "os" "runtime" "strings" - - "github.com/ebitengine/purego" + "unsafe" ) var ( - libGL uintptr - libGLES uintptr + libGL unsafe.Pointer + libGLES unsafe.Pointer ) func (c *defaultContext) init() error { @@ -49,8 +69,10 @@ func (c *defaultContext) init() error { if !preferES { // Usually libGL.so or libGL.so.1 is used. libGL.so.2 might exist only on NetBSD. for _, name := range []string{"libGL.so", "libGL.so.2", "libGL.so.1", "libGL.so.0"} { - lib, err := purego.Dlopen(name, purego.RTLD_LAZY|purego.RTLD_GLOBAL) - if err == nil { + cname := C.CString(name) + lib := C.dlopen(cname, C.RTLD_LAZY|C.RTLD_GLOBAL) + C.free(unsafe.Pointer(cname)) + if lib != nil { libGL = lib return nil } @@ -59,8 +81,10 @@ func (c *defaultContext) init() error { // Try OpenGL ES. for _, name := range []string{"libGLESv2.so", "libGLESv2.so.2", "libGLESv2.so.1", "libGLESv2.so.0"} { - lib, err := purego.Dlopen(name, purego.RTLD_LAZY|purego.RTLD_GLOBAL) - if err == nil { + cname := C.CString(name) + lib := C.dlopen(cname, C.RTLD_LAZY|C.RTLD_GLOBAL) + C.free(unsafe.Pointer(cname)) + if lib != nil { libGLES = lib c.isES = true return nil @@ -72,32 +96,19 @@ func (c *defaultContext) init() error { func (c *defaultContext) getProcAddress(name string) (uintptr, error) { if c.isES { - return getProcAddressGLES(name) + return getProcAddressGLES(name), nil } - return getProcAddressGL(name) + return getProcAddressGL(name), nil } -var glXGetProcAddress func(name string) uintptr - -func getProcAddressGL(name string) (uintptr, error) { - if glXGetProcAddress == nil { - if _, err := purego.Dlsym(libGL, "glXGetProcAddress"); err == nil { - purego.RegisterLibFunc(&glXGetProcAddress, libGL, "glXGetProcAddress") - } else if _, err := purego.Dlsym(libGL, "glXGetProcAddressARB"); err == nil { - purego.RegisterLibFunc(&glXGetProcAddress, libGL, "glXGetProcAddressARB") - } - } - if glXGetProcAddress == nil { - return 0, fmt.Errorf("gl: failed to find glXGetProcAddress or glXGetProcAddressARB in libGL.so") - } - - return glXGetProcAddress(name), nil +func getProcAddressGL(name string) uintptr { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + return uintptr(C.getProcAddressGL(libGL, cname)) } -func getProcAddressGLES(name string) (uintptr, error) { - proc, err := purego.Dlsym(libGLES, name) - if err != nil { - return 0, err - } - return proc, nil +func getProcAddressGLES(name string) uintptr { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + return uintptr(C.getProcAddressGLES(libGLES, cname)) }