From 59fb259181334b650c372f79494e0407652f9807 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 7 Apr 2024 02:04:02 +0900 Subject: [PATCH] internal/graphicsdriver/gl: use PureGo for Linux and UNIX Updates #2284 --- go.mod | 2 +- go.sum | 4 +- .../graphicsdriver/opengl/gl/default_cgo.go | 2 +- .../opengl/gl/default_purego.go | 2 +- .../opengl/gl/procaddr_linbsd.go | 73 ++++++++----------- 5 files changed, 36 insertions(+), 47 deletions(-) diff --git a/go.mod b/go.mod index 05ec89b12..934698a3a 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/ebitengine/gomobile v0.0.0-20240429094902-cf88669c3591 github.com/ebitengine/hideconsole v1.0.0 github.com/ebitengine/oto/v3 v3.3.0-alpha.1 - github.com/ebitengine/purego v0.8.0-alpha.1 + github.com/ebitengine/purego v0.8.0-alpha.1.0.20240429114929-1ff8716e2490 github.com/gen2brain/mpeg v0.3.2-0.20240412154320-a2ac4fc8a46f github.com/go-text/typesetting v0.1.1-0.20240402181327-ced1d6822703 github.com/hajimehoshi/bitmapfont/v3 v3.1.0 diff --git a/go.sum b/go.sum index 6e729c045..343b20257 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,8 @@ github.com/ebitengine/hideconsole v1.0.0 h1:5J4U0kXF+pv/DhiXt5/lTz0eO5ogJ1iXb8Yj github.com/ebitengine/hideconsole v1.0.0/go.mod h1:hTTBTvVYWKBuxPr7peweneWdkUwEuHuB3C1R/ielR1A= github.com/ebitengine/oto/v3 v3.3.0-alpha.1 h1:J2nBmQwPLKc4+yLObytq1jKNydI96l6EjZfgefiqGbk= github.com/ebitengine/oto/v3 v3.3.0-alpha.1/go.mod h1:T2/VV0UWG97GEEf4kORMU2nCneYT/YmwSTxPutSVaUg= -github.com/ebitengine/purego v0.8.0-alpha.1 h1:52AgJTNaQRi7YtOtdJl4hkxNWhAGMxuDuDjOVIp5Ojk= -github.com/ebitengine/purego v0.8.0-alpha.1/go.mod h1:y8L+ZRLphbdPW2xs41fur/KaW57yTzrFsqsclHyHrTM= +github.com/ebitengine/purego v0.8.0-alpha.1.0.20240429114929-1ff8716e2490 h1:hOHVTszt219H/6Ma0o/RvZ++BPJtj2PMie+3fyA+sTs= +github.com/ebitengine/purego v0.8.0-alpha.1.0.20240429114929-1ff8716e2490/go.mod h1:y8L+ZRLphbdPW2xs41fur/KaW57yTzrFsqsclHyHrTM= github.com/gen2brain/mpeg v0.3.2-0.20240412154320-a2ac4fc8a46f h1:ysqRe+lvUiL0dH5XzkH0Bz68bFMPJ4f5Si4L/HD9SGk= github.com/gen2brain/mpeg v0.3.2-0.20240412154320-a2ac4fc8a46f/go.mod h1:i/ebyRRv/IoHixuZ9bElZnXbmfoUVPGQpdsJ4sVuX38= github.com/go-text/typesetting v0.1.1-0.20240402181327-ced1d6822703 h1:AqtMl9yw7r319Ah4W2afQm3Ql+PEsQKHds18tGvKhog= diff --git a/internal/graphicsdriver/opengl/gl/default_cgo.go b/internal/graphicsdriver/opengl/gl/default_cgo.go index c9f5a58aa..535f469db 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 !darwin && !js && !windows && !playstation5 +//go:build nintendosdk package gl diff --git a/internal/graphicsdriver/opengl/gl/default_purego.go b/internal/graphicsdriver/opengl/gl/default_purego.go index 179cd8f4e..dda9e1548 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 || windows +//go:build (darwin || freebsd || linux || netbsd || openbsd || windows) && !nintendosdk && !playstation5 package gl diff --git a/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go b/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go index a7b40dac4..63527eed4 100644 --- a/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go +++ b/internal/graphicsdriver/opengl/gl/procaddr_linbsd.go @@ -16,38 +16,18 @@ 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" - "unsafe" + + "github.com/ebitengine/purego" ) var ( - libGL unsafe.Pointer - libGLES unsafe.Pointer + libGL uintptr + libGLES uintptr ) func (c *defaultContext) init() error { @@ -72,10 +52,8 @@ func (c *defaultContext) init() error { // [1] https://github.com/glfw/glfw/commit/55aad3c37b67f17279378db52da0a3ab81bbf26d // [2] https://github.com/glfw/glfw/commit/c18851f52ec9704eb06464058a600845ec1eada1 for _, name := range []string{"libGL.so", "libGL.so.2", "libGL.so.1", "libGL.so.0"} { - cname := C.CString(name) - lib := C.dlopen(cname, C.RTLD_LAZY|C.RTLD_GLOBAL) - C.free(unsafe.Pointer(cname)) - if lib != nil { + lib, err := purego.Dlopen(name, purego.RTLD_LAZY|purego.RTLD_GLOBAL) + if err == nil { libGL = lib return nil } @@ -84,10 +62,8 @@ func (c *defaultContext) init() error { // Try OpenGL ES. for _, name := range []string{"libGLESv2.so", "libGLESv2.so.2", "libGLESv2.so.1", "libGLESv2.so.0"} { - cname := C.CString(name) - lib := C.dlopen(cname, C.RTLD_LAZY|C.RTLD_GLOBAL) - C.free(unsafe.Pointer(cname)) - if lib != nil { + lib, err := purego.Dlopen(name, purego.RTLD_LAZY|purego.RTLD_GLOBAL) + if err == nil { libGLES = lib c.isES = true return nil @@ -99,19 +75,32 @@ func (c *defaultContext) init() error { func (c *defaultContext) getProcAddress(name string) (uintptr, error) { if c.isES { - return getProcAddressGLES(name), nil + return getProcAddressGLES(name) } - return getProcAddressGL(name), nil + return getProcAddressGL(name) } -func getProcAddressGL(name string) uintptr { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - return uintptr(C.getProcAddressGL(libGL, cname)) +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 getProcAddressGLES(name string) uintptr { - cname := C.CString(name) - defer C.free(unsafe.Pointer(cname)) - return uintptr(C.getProcAddressGLES(libGLES, cname)) +func getProcAddressGLES(name string) (uintptr, error) { + proc, err := purego.Dlsym(libGLES, name) + if err != nil { + return 0, err + } + return proc, nil }