From 7da315eb2b6e72f0ff7d4d95410bc43df161359f Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 26 Jul 2021 21:35:19 +0200 Subject: [PATCH] app,app/internal/wm: release OpenGL context after use Otherwise, making a context current on another thread may result in an EGL_BAD_ACCESS error. Fixes gio#248 Signed-off-by: Elias Naur --- app/internal/wm/d3d11_windows.go | 2 ++ app/internal/wm/gl_ios.go | 4 ++++ app/internal/wm/gl_js.go | 2 ++ app/internal/wm/gl_macos.go | 4 ++++ app/internal/wm/window.go | 1 + app/loop.go | 1 + 6 files changed, 14 insertions(+) diff --git a/app/internal/wm/d3d11_windows.go b/app/internal/wm/d3d11_windows.go index d20b15c4..f048d018 100644 --- a/app/internal/wm/d3d11_windows.go +++ b/app/internal/wm/d3d11_windows.go @@ -117,6 +117,8 @@ func (c *d3d11Context) MakeCurrent() error { return nil } +func (c *d3d11Context) ReleaseCurrent() {} + func (c *d3d11Context) Lock() {} func (c *d3d11Context) Unlock() {} diff --git a/app/internal/wm/gl_ios.go b/app/internal/wm/gl_ios.go index 547b6641..4dd6e29e 100644 --- a/app/internal/wm/gl_ios.go +++ b/app/internal/wm/gl_ios.go @@ -139,6 +139,10 @@ func (c *context) MakeCurrent() error { return nil } +func (c *context) ReleaseCurrent() { + C.gio_makeCurrent(0) +} + func (w *window) NewContext() (Context, error) { return newContext(w) } diff --git a/app/internal/wm/gl_js.go b/app/internal/wm/gl_js.go index 74c21cce..7588dd68 100644 --- a/app/internal/wm/gl_js.go +++ b/app/internal/wm/gl_js.go @@ -62,6 +62,8 @@ func (c *context) MakeCurrent() error { return nil } +func (c *context) ReleaseCurrent() {} + func (w *window) NewContext() (Context, error) { return newContext(w) } diff --git a/app/internal/wm/gl_macos.go b/app/internal/wm/gl_macos.go index 2d5ae365..55cbc4e8 100644 --- a/app/internal/wm/gl_macos.go +++ b/app/internal/wm/gl_macos.go @@ -90,6 +90,10 @@ func (c *context) MakeCurrent() error { return nil } +func (c *context) ReleaseCurrent() { + C.gio_clearCurrentContext() +} + func (w *window) NewContext() (Context, error) { return newContext(w) } diff --git a/app/internal/wm/window.go b/app/internal/wm/window.go index 393168b6..058c2e1b 100644 --- a/app/internal/wm/window.go +++ b/app/internal/wm/window.go @@ -70,6 +70,7 @@ type Context interface { API() gpu.API Present() error MakeCurrent() error + ReleaseCurrent() Refresh() error Release() Lock() diff --git a/app/loop.go b/app/loop.go index 6881dee6..f8058181 100644 --- a/app/loop.go +++ b/app/loop.go @@ -69,6 +69,7 @@ func (l *renderLoop) renderLoop(ctx wm.Context) error { initErr <- err return } + defer ctx.ReleaseCurrent() g, err := gpu.New(ctx.API()) if err != nil { initErr <- err