~eliasnaur/gio

app/internal/window: Do not re-create EGL surfaces when only resizing v1 PROPOSED

Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~eliasnaur/gio/patches/8968/mbox | git am -3
Learn more about email & git

[PATCH] app/internal/window: Do not re-create EGL surfaces when only resizing Export this patch

This prevents flickering when resizing the window on X11.

Signed-off-by: Denis Bernard <db047h@gmail.com>
---
 app/internal/window/egl.go | 57 ++++++++++++++++++++------------------
 1 file changed, 30 insertions(+), 27 deletions(-)

diff --git a/app/internal/window/egl.go b/app/internal/window/egl.go
index a8b7d9e..64ac582 100644
--- a/app/internal/window/egl.go
+++ b/app/internal/window/egl.go
@@ -134,38 +134,41 @@ func (c *context) MakeCurrent() error {
 	if c.eglWin == win && width == c.width && height == c.height {
 		return nil
 	}
-	if win == nilEGLNativeWindowType {
-		if c.srgbFBO != nil {
+	c.width, c.height = width, height
+	// Do not re-create surfaces when only resizing. This prevents flickering when resizing on X11.
+	if c.eglWin != win {
+		if win == nilEGLNativeWindowType && c.srgbFBO != nil {
 			c.srgbFBO.Release()
 			c.srgbFBO = nil
 		}
-	}
-	if c.eglSurf != nilEGLSurface {
-		// Make sure any in-flight GL commands are complete.
-		c.c.Finish()
-		eglMakeCurrent(c.eglCtx.disp, nilEGLSurface, nilEGLSurface, nilEGLContext)
-		eglDestroySurface(c.eglCtx.disp, c.eglSurf)
-		c.eglSurf = nilEGLSurface
-	}
-	c.width, c.height = width, height
-	c.eglWin = win
-	if c.eglWin == nilEGLNativeWindowType {
+		if c.eglSurf != nilEGLSurface {
+			// Make sure any in-flight GL commands are complete.
+			// c.c.Finish()
+			eglMakeCurrent(c.eglCtx.disp, nilEGLSurface, nilEGLSurface, nilEGLContext)
+			eglDestroySurface(c.eglCtx.disp, c.eglSurf)
+			c.eglSurf = nilEGLSurface
+		}
+		c.eglWin = win
+		if c.eglWin == nilEGLNativeWindowType {
+			return nil
+		}
+		eglSurf, err := createSurfaceAndMakeCurrent(c.eglCtx, win)
+		c.eglSurf = eglSurf
+		if err != nil {
+			c.eglWin = nilEGLNativeWindowType
+			return err
+		}
+		// eglSwapInterval 1 leads to erratic frame rates and unnecessary blocking.
+		// We rely on platform specific frame rate limiting instead, except on Windows
+		// and X11 where eglSwapInterval is all there is.
+		if c.driver.needVSync() {
+			eglSwapInterval(c.eglCtx.disp, 1)
+		} else {
+			eglSwapInterval(c.eglCtx.disp, 0)
+		}
+	} else if c.eglWin == nilEGLNativeWindowType {
 		return nil
 	}
-	eglSurf, err := createSurfaceAndMakeCurrent(c.eglCtx, win)
-	c.eglSurf = eglSurf
-	if err != nil {
-		c.eglWin = nilEGLNativeWindowType
-		return err
-	}
-	// eglSwapInterval 1 leads to erratic frame rates and unnecessary blocking.
-	// We rely on platform specific frame rate limiting instead, except on Windows
-	// and X11 where eglSwapInterval is all there is.
-	if c.driver.needVSync() {
-		eglSwapInterval(c.eglCtx.disp, 1)
-	} else {
-		eglSwapInterval(c.eglCtx.disp, 0)
-	}
 	if c.eglCtx.srgb {
 		return nil
 	}
-- 
2.17.1
View this thread in the archives