diff --git a/app/gl_ios.go b/app/gl_ios.go index 31db2541..34d85d1c 100644 --- a/app/gl_ios.go +++ b/app/gl_ios.go @@ -115,9 +115,6 @@ func (c *context) Unlock() { } func (c *context) Refresh() error { - if C.gio_makeCurrent(c.ctx) == 0 { - return errors.New("[EAGLContext setCurrentContext] failed") - } if !c.init { c.init = true c.frameBuffer = c.c.CreateFramebuffer() diff --git a/app/gl_macos.go b/app/gl_macos.go index 041bcb32..fe77ea0a 100644 --- a/app/gl_macos.go +++ b/app/gl_macos.go @@ -111,8 +111,6 @@ func (c *glContext) Unlock() { } func (c *glContext) Refresh() error { - c.Lock() - defer c.Unlock() C.gio_updateContext(c.ctx) return nil } diff --git a/app/os.go b/app/os.go index 6da6d34b..cf337985 100644 --- a/app/os.go +++ b/app/os.go @@ -165,6 +165,8 @@ type frameEvent struct { Sync bool } +// The caller must hold the context lock while using API, Refresh, +// RenderTarget, or Present. type context interface { API() gpu.API RenderTarget() (gpu.RenderTarget, error) diff --git a/app/window.go b/app/window.go index 977ab6a1..0e5d04d2 100644 --- a/app/window.go +++ b/app/window.go @@ -149,6 +149,12 @@ func (w *Window) validateAndProcess(size image.Point, sync bool, frame *op.Ops, sync = true } } + if w.ctx != nil { + if err := w.ctx.Lock(); err != nil { + w.destroyGPU() + return err + } + } if sync && w.ctx != nil { if err := w.ctx.Refresh(); err != nil { if errors.Is(err, errOutOfDate) { @@ -163,12 +169,6 @@ func (w *Window) validateAndProcess(size image.Point, sync bool, frame *op.Ops, return err } } - if w.ctx != nil { - if err := w.ctx.Lock(); err != nil { - w.destroyGPU() - return err - } - } if w.gpu == nil && !w.nocontext { gpu, err := gpu.New(w.ctx.API()) if err != nil {