mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 15:45:38 +00:00
b622412ac6
macOS is the only platform where desktop OpenGL is used. To support foreign ANGLE contexts add a setting to override Gio's selection of OpenGL implementation. The bulk of this change is making all function pointers per-context instead of global, and loading the OpenGL library dynamically. As a side effect we're closer to Gio tolerating a platform without any OpenGL implementation. For example, Apple has deprecated OpenGL and OpenGL ES on its platforms and may remove them in the future. Note that as a side-effect of this change, Gio needs Go 1.16 or newer to run on iOS. Signed-off-by: Elias Naur <mail@eliasnaur.com>
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package driver
|
|
|
|
import (
|
|
"fmt"
|
|
"unsafe"
|
|
|
|
"gioui.org/internal/gl"
|
|
)
|
|
|
|
// See gpu/api.go for documentation for the API types.
|
|
|
|
type API interface {
|
|
implementsAPI()
|
|
}
|
|
|
|
type OpenGL struct {
|
|
// ES forces the use of ANGLE OpenGL ES libraries on macOS. It is
|
|
// ignored on all other platforms.
|
|
ES bool
|
|
// Context contains the WebGL context for WebAssembly platforms. It is
|
|
// empty for all other platforms; an OpenGL context is assumed current when
|
|
// calling NewDevice.
|
|
Context gl.Context
|
|
}
|
|
|
|
type Direct3D11 struct {
|
|
// Device contains a *ID3D11Device.
|
|
Device unsafe.Pointer
|
|
}
|
|
|
|
// API specific device constructors.
|
|
var (
|
|
NewOpenGLDevice func(api OpenGL) (Device, error)
|
|
NewDirect3D11Device func(api Direct3D11) (Device, error)
|
|
)
|
|
|
|
// NewDevice creates a new Device given the api.
|
|
//
|
|
// Note that the device does not assume ownership of the resources contained in
|
|
// api; the caller must ensure the resources are valid until the device is
|
|
// released.
|
|
func NewDevice(api API) (Device, error) {
|
|
switch api := api.(type) {
|
|
case OpenGL:
|
|
if NewOpenGLDevice != nil {
|
|
return NewOpenGLDevice(api)
|
|
}
|
|
case Direct3D11:
|
|
if NewDirect3D11Device != nil {
|
|
return NewDirect3D11Device(api)
|
|
}
|
|
}
|
|
return nil, fmt.Errorf("driver: no driver available for the API %T", api)
|
|
}
|
|
|
|
func (OpenGL) implementsAPI() {}
|
|
func (Direct3D11) implementsAPI() {}
|