From 420f4c32f4aca75c6dae31ff75571c8169592c61 Mon Sep 17 00:00:00 2001 From: Walter Werner SCHNEIDER Date: Mon, 30 Jun 2025 16:45:38 +0300 Subject: [PATCH] app: [Wayland] don't recreate EGL surface during resize Fixes: https://todo.sr.ht/~eliasnaur/gio/656 Signed-off-by: Walter Werner SCHNEIDER --- app/egl_wayland.go | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/app/egl_wayland.go b/app/egl_wayland.go index 52a883eb..005df894 100644 --- a/app/egl_wayland.go +++ b/app/egl_wayland.go @@ -38,7 +38,24 @@ func init() { if err != nil { return nil, err } - return &wlContext{Context: ctx, win: w}, nil + + surf, width, height := w.surface() + if surf == nil { + return nil, errors.New("wayland: no surface") + } + eglWin := C.wl_egl_window_create(surf, C.int(width), C.int(height)) + if eglWin == nil { + return nil, errors.New("wayland: wl_egl_window_create failed") + } + eglSurf := egl.NativeWindowType(uintptr(unsafe.Pointer(eglWin))) + if err := ctx.CreateSurface(eglSurf); err != nil { + return nil, err + } + // We're in charge of the frame callbacks, don't let eglSwapBuffers + // wait for callbacks that may never arrive. + ctx.EnableVSync(false) + + return &wlContext{Context: ctx, win: w, eglWin: eglWin}, nil } } @@ -54,31 +71,11 @@ func (c *wlContext) Release() { } func (c *wlContext) Refresh() 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); err != nil { - return err - } - if err := c.Context.MakeCurrent(); err != nil { - return err - } - defer c.Context.ReleaseCurrent() - // We're in charge of the frame callbacks, don't let eglSwapBuffers - // wait for callbacks that may never arrive. - c.Context.EnableVSync(false) + C.wl_egl_window_resize(c.eglWin, C.int(width), C.int(height), 0, 0) return nil }