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