egl_x11.go 1.2 KB

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