timer.go 1.3 KB

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