timer.go raw

   1  // SPDX-License-Identifier: Unlicense OR MIT
   2  
   3  package gpu
   4  
   5  import (
   6  	"time"
   7  
   8  	"github.com/p9c/p9/pkg/gel/gio/gpu/internal/driver"
   9  )
  10  
  11  type timers struct {
  12  	backend driver.Device
  13  	timers  []*timer
  14  }
  15  
  16  type timer struct {
  17  	Elapsed time.Duration
  18  	backend driver.Device
  19  	timer   driver.Timer
  20  	state   timerState
  21  }
  22  
  23  type timerState uint8
  24  
  25  const (
  26  	timerIdle timerState = iota
  27  	timerRunning
  28  	timerWaiting
  29  )
  30  
  31  func newTimers(b driver.Device) *timers {
  32  	return &timers{
  33  		backend: b,
  34  	}
  35  }
  36  
  37  func (t *timers) newTimer() *timer {
  38  	if t == nil {
  39  		return nil
  40  	}
  41  	tt := &timer{
  42  		backend: t.backend,
  43  		timer:   t.backend.NewTimer(),
  44  	}
  45  	t.timers = append(t.timers, tt)
  46  	return tt
  47  }
  48  
  49  func (t *timer) begin() {
  50  	if t == nil || t.state != timerIdle {
  51  		return
  52  	}
  53  	t.timer.Begin()
  54  	t.state = timerRunning
  55  }
  56  
  57  func (t *timer) end() {
  58  	if t == nil || t.state != timerRunning {
  59  		return
  60  	}
  61  	t.timer.End()
  62  	t.state = timerWaiting
  63  }
  64  
  65  func (t *timers) ready() bool {
  66  	if t == nil {
  67  		return false
  68  	}
  69  	for _, tt := range t.timers {
  70  		switch tt.state {
  71  		case timerIdle:
  72  			continue
  73  		case timerRunning:
  74  			return false
  75  		}
  76  		d, ok := tt.timer.Duration()
  77  		if !ok {
  78  			return false
  79  		}
  80  		tt.state = timerIdle
  81  		tt.Elapsed = d
  82  	}
  83  	return t.backend.IsTimeContinuous()
  84  }
  85  
  86  func (t *timers) release() {
  87  	if t == nil {
  88  		return
  89  	}
  90  	for _, tt := range t.timers {
  91  		tt.timer.Release()
  92  	}
  93  	t.timers = nil
  94  }
  95