openxr task scheduler

This commit is contained in:
galister
2024-02-02 00:09:39 +01:00
parent 32dc1d2813
commit d71bf65ee8

View File

@@ -1,4 +1,5 @@
use std::{ use std::{
collections::VecDeque,
sync::{ sync::{
atomic::{AtomicBool, Ordering}, atomic::{AtomicBool, Ordering},
Arc, Arc,
@@ -14,7 +15,7 @@ use xr::OverlaySessionCreateFlagsEXTX;
use crate::{ use crate::{
backend::{ backend::{
common::OverlayContainer, common::{OverlayContainer, TaskType},
input::interact, input::interact,
openxr::{input::DoubleClickCounter, lines::LinePool, overlay::OpenXrOverlayData}, openxr::{input::DoubleClickCounter, lines::LinePool, overlay::OpenXrOverlayData},
}, },
@@ -108,6 +109,7 @@ pub fn openxr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
let mut event_storage = xr::EventDataBuffer::new(); let mut event_storage = xr::EventDataBuffer::new();
let mut show_hide_counter = DoubleClickCounter::new(); let mut show_hide_counter = DoubleClickCounter::new();
let mut due_tasks = VecDeque::with_capacity(4);
'main_loop: loop { 'main_loop: loop {
if !running.load(Ordering::Relaxed) { if !running.load(Ordering::Relaxed) {
@@ -175,6 +177,18 @@ pub fn openxr_run(running: Arc<AtomicBool>) -> Result<(), BackendError> {
continue 'main_loop; continue 'main_loop;
} }
app_state.tasks.retrieve_due(&mut due_tasks);
while let Some(task) = due_tasks.pop_front() {
match task {
TaskType::Global(f) => f(&mut app_state),
TaskType::Overlay(sel, f) => {
if let Some(o) = overlays.mut_by_selector(&sel) {
f(&mut app_state, &mut o.state);
}
}
}
}
app_state.input_state.pre_update(); app_state.input_state.pre_update();
input_source.update(&xr_state, &mut app_state); input_source.update(&xr_state, &mut app_state);
app_state.input_state.post_update(); app_state.input_state.post_update();