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 <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-10-30 16:47:05 +01:00
parent 3740f89171
commit ef652f4922
2 changed files with 9 additions and 5 deletions
-1
View File
@@ -77,7 +77,6 @@ func (l *renderLoop) renderLoop(ctx window.Context) error {
return
}
defer g.Release()
defer ctx.Release()
initErr <- nil
loop:
for {
+9 -4
View File
@@ -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