~eliasnaur/gio

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

Denis Bernard: 1
 app/internal/window: Do not re-create EGL surfaces when only resizing

 1 files changed, 30 insertions(+), 27 deletions(-)
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/8970/mbox | git am -3
Learn more about email & git

[PATCH v2] 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..3c54c08 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
Thank you, merged.
View this thread in the archives