Compare commits

..

1 Commits

Author SHA1 Message Date
Joe Julian d01123f521 app: avoid relocking contexts every frame
Signed-off-by: Joe Julian <me@joejulian.name>
2026-04-21 06:32:24 -07:00
+10 -21
View File
@@ -154,10 +154,6 @@ func (w *Window) validateAndProcess(size image.Point, sync bool, frame *op.Ops,
sync = true sync = true
} }
} }
if err := w.lockContext(); err != nil {
w.destroyGPU()
return err
}
if sync && w.ctx != nil { if sync && w.ctx != nil {
if err := w.ctx.Refresh(); err != nil { if err := w.ctx.Refresh(); err != nil {
if errors.Is(err, errOutOfDate) { if errors.Is(err, errOutOfDate) {
@@ -171,11 +167,14 @@ func (w *Window) validateAndProcess(size image.Point, sync bool, frame *op.Ops,
} }
return err return err
} }
w.unlockContext() w.ctxNeedsLock = true
if err := w.lockContext(); err != nil { }
if w.ctx != nil && w.ctxNeedsLock {
if err := w.ctx.Lock(); err != nil {
w.destroyGPU() w.destroyGPU()
return err return err
} }
w.ctxNeedsLock = false
} }
if w.gpu == nil && !w.nocontext { if w.gpu == nil && !w.nocontext {
gpu, err := gpu.New(w.ctx.API()) gpu, err := gpu.New(w.ctx.API())
@@ -510,17 +509,6 @@ func (c *callbacks) ActionAt(p f32.Point) (system.Action, bool) {
return c.w.queue.ActionAt(p) return c.w.queue.ActionAt(p)
} }
func (w *Window) lockContext() error {
if w.ctx == nil || !w.ctxNeedsLock {
return nil
}
if err := w.ctx.Lock(); err != nil {
return err
}
w.ctxNeedsLock = false
return nil
}
func (w *Window) unlockContext() { func (w *Window) unlockContext() {
if w.ctx == nil || w.ctxNeedsLock { if w.ctx == nil || w.ctxNeedsLock {
return return
@@ -531,9 +519,9 @@ func (w *Window) unlockContext() {
func (w *Window) destroyGPU() { func (w *Window) destroyGPU() {
if w.gpu != nil { if w.gpu != nil {
if err := w.lockContext(); err == nil { if err := w.ctx.Lock(); err == nil {
w.gpu.Release() w.gpu.Release()
w.unlockContext() w.ctx.Unlock()
} }
w.gpu = nil w.gpu = nil
} }
@@ -683,11 +671,12 @@ func (w *Window) processEvent(e event.Event) bool {
w.coalesced.destroy = &e2 w.coalesced.destroy = &e2
case ViewEvent: case ViewEvent:
if !e2.Valid() && w.gpu != nil { if !e2.Valid() && w.gpu != nil {
if err := w.lockContext(); err == nil { if err := w.ctx.Lock(); err == nil {
w.gpu.Release() w.gpu.Release()
w.unlockContext() w.ctx.Unlock()
} }
w.gpu = nil w.gpu = nil
w.ctxNeedsLock = true
} }
w.coalesced.view = &e2 w.coalesced.view = &e2
case ConfigEvent: case ConfigEvent: