From 39b8a66359e01b87477050c04bc7eb62e36fc09f Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 13 Nov 2022 06:29:55 -0800 Subject: [PATCH] internal/graphicsdriver/opengl/gl: dynamic function load for OpenGL ES Updates #292 Updates #2450 --- .../{default_gles.go => default_android.go} | 5 +- .../opengl/gl/default_notpurego.go | 2 +- .../gl/{procaddr_others.go => procaddr_gl.go} | 0 .../graphicsdriver/opengl/gl/procaddr_gles.go | 46 +++++++++++++++++++ 4 files changed, 48 insertions(+), 5 deletions(-) rename internal/graphicsdriver/opengl/gl/{default_gles.go => default_android.go} (99%) rename internal/graphicsdriver/opengl/gl/{procaddr_others.go => procaddr_gl.go} (100%) create mode 100644 internal/graphicsdriver/opengl/gl/procaddr_gles.go diff --git a/internal/graphicsdriver/opengl/gl/default_gles.go b/internal/graphicsdriver/opengl/gl/default_android.go similarity index 99% rename from internal/graphicsdriver/opengl/gl/default_gles.go rename to internal/graphicsdriver/opengl/gl/default_android.go index 506b32794..5e6232615 100644 --- a/internal/graphicsdriver/opengl/gl/default_gles.go +++ b/internal/graphicsdriver/opengl/gl/default_android.go @@ -12,12 +12,9 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build android || opengles - package gl -// #cgo !android pkg-config: glesv2 -// #cgo android LDFLAGS: -lGLESv2 +// #cgo LDFLAGS: -lGLESv2 // // #include // #include diff --git a/internal/graphicsdriver/opengl/gl/default_notpurego.go b/internal/graphicsdriver/opengl/gl/default_notpurego.go index 9c6741a1d..67305030d 100644 --- a/internal/graphicsdriver/opengl/gl/default_notpurego.go +++ b/internal/graphicsdriver/opengl/gl/default_notpurego.go @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT // SPDX-FileCopyrightText: 2014 Eric Woroshow -//go:build !android && !darwin && !js && !windows && !opengles +//go:build !android && !darwin && !js && !windows package gl diff --git a/internal/graphicsdriver/opengl/gl/procaddr_others.go b/internal/graphicsdriver/opengl/gl/procaddr_gl.go similarity index 100% rename from internal/graphicsdriver/opengl/gl/procaddr_others.go rename to internal/graphicsdriver/opengl/gl/procaddr_gl.go diff --git a/internal/graphicsdriver/opengl/gl/procaddr_gles.go b/internal/graphicsdriver/opengl/gl/procaddr_gles.go new file mode 100644 index 000000000..8a0dec9e6 --- /dev/null +++ b/internal/graphicsdriver/opengl/gl/procaddr_gles.go @@ -0,0 +1,46 @@ +// Copyright 2022 The Ebitengine Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//go:build !android && !darwin && !js && !nintendosdk && !windows && opengles + +package gl + +// #cgo LDFLAGS: -ldl +// +// #include +// #include +// +// static void* getProcAddress(const char* name) { +// static void* libGLES; +// if (!libGLES) { +// libGLES = dlopen("libGLESv2.so", RTLD_NOW | RTLD_GLOBAL); +// } +// return dlsym(libGLES, name); +// } +import "C" + +import ( + "strings" + "unsafe" +) + +func getProcAddress(namea string) unsafe.Pointer { + const ext = "EXT" + if strings.HasSuffix(namea, ext) { + namea = namea[:len(namea)-len(ext)] + } + cname := C.CString(namea) + defer C.free(unsafe.Pointer(cname)) + return C.getProcAddress(cname) +}