github.com/utopiagio/gio@v0.0.8/app/egl_x11.go (about)

     1  // SPDX-License-Identifier: Unlicense OR MIT
     2  
     3  //go:build ((linux && !android) || freebsd || openbsd) && !nox11 && !noopengl
     4  // +build linux,!android freebsd openbsd
     5  // +build !nox11
     6  // +build !noopengl
     7  
     8  package app
     9  
    10  import (
    11  	"unsafe"
    12  
    13  	"github.com/utopiagio/gio/internal/egl"
    14  )
    15  
    16  type x11Context struct {
    17  	win *x11Window
    18  	*egl.Context
    19  }
    20  
    21  func init() {
    22  	newX11EGLContext = func(w *x11Window) (context, error) {
    23  		disp := egl.NativeDisplayType(unsafe.Pointer(w.display()))
    24  		ctx, err := egl.NewContext(disp)
    25  		if err != nil {
    26  			return nil, err
    27  		}
    28  		return &x11Context{win: w, Context: ctx}, nil
    29  	}
    30  }
    31  
    32  func (c *x11Context) Release() {
    33  	if c.Context != nil {
    34  		c.Context.Release()
    35  		c.Context = nil
    36  	}
    37  }
    38  
    39  func (c *x11Context) Refresh() error {
    40  	c.Context.ReleaseSurface()
    41  	win, width, height := c.win.window()
    42  	eglSurf := egl.NativeWindowType(uintptr(win))
    43  	if err := c.Context.CreateSurface(eglSurf, width, height); err != nil {
    44  		return err
    45  	}
    46  	if err := c.Context.MakeCurrent(); err != nil {
    47  		return err
    48  	}
    49  	defer c.Context.ReleaseCurrent()
    50  	c.Context.EnableVSync(true)
    51  	return nil
    52  }
    53  
    54  func (c *x11Context) Lock() error {
    55  	return c.Context.MakeCurrent()
    56  }
    57  
    58  func (c *x11Context) Unlock() {
    59  	c.Context.ReleaseCurrent()
    60  }