func (s *renderState) Destroy() { if s == nil { return } if s.disp != egl.Display(unsafe.Pointer(nil)) { if s.ctx != egl.Context(unsafe.Pointer(nil)) { egl.DestroyContext(s.disp, s.ctx) } egl.Terminate(s.disp) } }
func (m *mainLoop) frame() { var timeout C.int = 0 if !m.isRunning() { timeout = -1 } ident := C.ALooper_pollAll(timeout, nil, nil, nil) switch ident { case LOOPER_ID_INPUT: if m.inputQ != nil { m.processInput(m.inputQ) } case C.ALOOPER_POLL_ERROR: log.Fatalf("ALooper_pollAll returned ALOOPER_POLL_ERROR\n") } if m.isRunning() { m.checkSize() createCtx := m.renderState.ctx == egl.Context(unsafe.Pointer(nil)) if createCtx { log.Printf("Creating context\n") ctx_attribs := [...]int32{ egl.CONTEXT_CLIENT_VERSION, 2, egl.NONE, } m.renderState.ctx = egl.CreateContext(m.renderState.disp, m.renderState.conf, egl.NO_CONTEXT, &ctx_attribs[0]) if m.renderState.ctx == egl.Context(unsafe.Pointer(nil)) { panic("Error: eglCreateContext failed\n") } } if !egl.MakeCurrent(m.renderState.disp, m.renderState.surf, m.renderState.surf, m.renderState.ctx) { panic("Error: eglMakeCurrent() failed\n") } if createCtx { m.game.initGL() } m.game.drawFrame() egl.SwapBuffers(m.renderState.disp, m.renderState.surf) } }
func (m *mainLoop) loop(init chan<- struct{}) { runtime.LockOSThread() defer runtime.UnlockOSThread() looper := C.ALooper_prepare(C.ALOOPER_PREPARE_ALLOW_NON_CALLBACKS) if looper == nil { panic("ALooper_prepare returned nil") } m.looper = looper init <- struct{}{} for { select { case <-m.quit: if m.renderState != nil && m.renderState.ctx != egl.Context(unsafe.Pointer(nil)) { if !egl.MakeCurrent(m.renderState.disp, egl.Surface(unsafe.Pointer(nil)), egl.Surface(unsafe.Pointer(nil)), egl.Context(unsafe.Pointer(nil))) { panic("Error: eglMakeCurrent() failed\n") } } m.ack <- struct{}{} break case <-m.resume: m.running = true m.ack <- struct{}{} case <-m.pause: m.running = false m.width, m.height = 0, 0 m.ack <- struct{}{} case m.focused = <-m.focus: m.width, m.height = 0, 0 m.ack <- struct{}{} case m.renderState = <-m.render: m.ack <- struct{}{} case inputQ := <-m.input: if inputQ != nil { C.AInputQueue_attachLooper(inputQ, m.looper, LOOPER_ID_INPUT, nil, nil) } else { C.AInputQueue_detachLooper(m.inputQ) } m.inputQ = inputQ m.ack <- struct{}{} default: m.frame() } } }