mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-04 17:05:38 +00:00
8cec7d1a40
Instead of calling from the low level context into the window for its surface and dimensions, add a Context.MakeCurrent method that does it directly. The result is simpler and clearer logic. For example, synchronization is obviously no longer needed. It wasn't necessary before, but the reason was unclear. Signed-off-by: Elias Naur <mail@eliasnaur.com>
71 lines
1.4 KiB
Go
71 lines
1.4 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
// +build linux,!android,!nowayland freebsd
|
|
|
|
package window
|
|
|
|
import (
|
|
"errors"
|
|
"unsafe"
|
|
|
|
"gioui.org/app/internal/egl"
|
|
"gioui.org/app/internal/gl"
|
|
)
|
|
|
|
/*
|
|
#cgo LDFLAGS: -lwayland-egl
|
|
|
|
#include <EGL/egl.h>
|
|
#include <wayland-client.h>
|
|
#include <wayland-egl.h>
|
|
*/
|
|
import "C"
|
|
|
|
type context struct {
|
|
win *window
|
|
*egl.Context
|
|
eglWin *C.struct_wl_egl_window
|
|
}
|
|
|
|
func (w *window) NewContext() (gl.Context, error) {
|
|
disp := egl.NativeDisplayType(unsafe.Pointer(w.display()))
|
|
ctx, err := egl.NewContext(disp)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &context{Context: ctx, win: w}, nil
|
|
}
|
|
|
|
func (c *context) Release() {
|
|
if c.Context != nil {
|
|
c.Context.Release()
|
|
c.Context = nil
|
|
}
|
|
if c.eglWin != nil {
|
|
C.wl_egl_window_destroy(c.eglWin)
|
|
c.eglWin = nil
|
|
}
|
|
}
|
|
|
|
func (c *context) MakeCurrent() error {
|
|
c.Context.ReleaseSurface()
|
|
if c.eglWin != nil {
|
|
C.wl_egl_window_destroy(c.eglWin)
|
|
c.eglWin = nil
|
|
}
|
|
surf, width, height := c.win.surface()
|
|
if surf == nil {
|
|
return errors.New("wayland: no surface")
|
|
}
|
|
eglWin := C.wl_egl_window_create(surf, C.int(width), C.int(height))
|
|
if eglWin == nil {
|
|
return errors.New("wayland: wl_egl_window_create failed")
|
|
}
|
|
c.eglWin = eglWin
|
|
eglSurf := egl.NativeWindowType(uintptr(unsafe.Pointer(eglWin)))
|
|
if err := c.Context.CreateSurface(eglSurf, width, height); err != nil {
|
|
return err
|
|
}
|
|
return c.Context.MakeCurrent()
|
|
}
|