From ef652f4922e03727e58c5fc6ea3fbff340447ed9 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Fri, 30 Oct 2020 16:47:05 +0100 Subject: [PATCH] app: move ownership of GPU context to app.Window The Window creates the context, and should also be responsible for destroying it. As a bonus, the wrong release ordering of loop.renderLoop is fixed. Before this change, the context would be destroyed before the renderer got a chance to destroy its resources. Signed-off-by: Elias Naur --- app/loop.go | 1 - app/window.go | 13 +++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/loop.go b/app/loop.go index e9d46349..e0da75a0 100644 --- a/app/loop.go +++ b/app/loop.go @@ -77,7 +77,6 @@ func (l *renderLoop) renderLoop(ctx window.Context) error { return } defer g.Release() - defer ctx.Release() initErr <- nil loop: for { diff --git a/app/window.go b/app/window.go index 87a70cce..ed469583 100644 --- a/app/window.go +++ b/app/window.go @@ -25,6 +25,7 @@ type Option func(opts *window.Options) // Window represents an operating system window. type Window struct { driver window.Driver + ctx window.Context loop *renderLoop // driverFuncs is a channel of functions to run when @@ -132,14 +133,14 @@ func (w *Window) validateAndProcess(frameStart time.Time, size image.Point, sync } } if w.loop == nil { - var ctx window.Context - ctx, err := w.driver.NewContext() + var err error + w.ctx, err = w.driver.NewContext() if err != nil { return err } - w.loop, err = newLoop(ctx) + w.loop, err = newLoop(w.ctx) if err != nil { - ctx.Release() + w.ctx.Release() return err } } @@ -295,6 +296,10 @@ func (w *Window) destroyGPU() { w.loop.Release() w.loop = nil } + if w.ctx != nil { + w.ctx.Release() + w.ctx = nil + } } // waitFrame waits for the client to either call FrameEvent.Frame