Files
gio/app/headless/headless_gl.go
T
Elias Naur b34216c124 app/headless: remove OpenGL assumptions
To prepare package headless for multiple backends, refactor the common headless
driver to no longer assume an OpenGL context. Instead, introduce a headless
backend type and the OpenGL implementation, glBackend.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
2020-02-27 20:34:21 +01:00

74 lines
1.5 KiB
Go

// SPDX-License-Identifier: Unlicense OR MIT
package headless
import (
"fmt"
"runtime"
"gioui.org/app/internal/glimpl"
"gioui.org/app/internal/srgb"
"gioui.org/gpu"
"gioui.org/gpu/gl"
)
type glContext interface {
Functions() *glimpl.Functions
Backend() (gpu.Backend, error)
MakeCurrent() error
ReleaseCurrent()
Release()
}
type glBackend struct {
glContext
srgb *srgb.SRGBFBO
}
func newContext(width, height int) (backend, error) {
glctx, err := newGLContext()
if err != nil {
return nil, err
}
// Create the back buffer FBO after locking the thread and making
// the context current.
runtime.LockOSThread()
defer runtime.UnlockOSThread()
if err := glctx.MakeCurrent(); err != nil {
glctx.Release()
return nil, err
}
defer glctx.ReleaseCurrent()
fbo, err := srgb.NewSRGBFBO(glctx.Functions())
if err != nil {
glctx.Release()
return nil, err
}
if err := fbo.Refresh(width, height); err != nil {
fbo.Release()
glctx.Release()
return nil, err
}
return &glBackend{glctx, fbo}, nil
}
func (b *glBackend) Screenshot(width, height int, pixels []byte) error {
if len(pixels) != width*height*4 {
panic("unexpected RGBA size")
}
f := b.Functions()
f.ReadPixels(0, 0, width, height, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
if glErr := f.GetError(); glErr != gl.NO_ERROR {
return fmt.Errorf("glReadPixels failed: %d", glErr)
}
return nil
}
func (b *glBackend) Release() {
if b.srgb != nil {
b.srgb.Release()
b.srgb = nil
}
b.glContext.Release()
}