diff --git a/alvr/client_openxr/src/extra_extensions/body_tracking_bd.rs b/alvr/client_openxr/src/extra_extensions/body_tracking_bd.rs index 7713b1fc63..a71a4ded79 100644 --- a/alvr/client_openxr/src/extra_extensions/body_tracking_bd.rs +++ b/alvr/client_openxr/src/extra_extensions/body_tracking_bd.rs @@ -1,8 +1,8 @@ +use crate::extra_extensions::get_instance_proc; use alvr_common::once_cell::sync::Lazy; -use openxr::sys::pfn::VoidFunction; use openxr::{self as xr, sys}; use std::ffi::{c_char, c_void, CString}; -use std::{mem, ptr}; +use std::ptr; pub const BD_BODY_TRACKING_EXTENSION_NAME: &str = "XR_BD_body_tracking"; @@ -140,68 +140,14 @@ impl BodyTrackerBD { return Err(sys::Result::ERROR_EXTENSION_NOT_PRESENT); } - let create_body_tracker = unsafe { - let mut create_body_tracker = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrCreateBodyTrackerBD".as_ptr(), - &mut create_body_tracker, - ); - - create_body_tracker.map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let destroy_body_tracker = unsafe { - let mut destroy_body_tracker = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrDestroyBodyTrackerBD".as_ptr(), - &mut destroy_body_tracker, - ); - - destroy_body_tracker - .map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let locate_body_joints = unsafe { - let mut locate_body_joints = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrLocateBodyJointsBD".as_ptr(), - &mut locate_body_joints, - ); - - locate_body_joints.map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let start_body_tracking_calib_app = unsafe { - let mut start_body_tracking_calib_app = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrStartBodyTrackingCalibAppBD".as_ptr(), - &mut start_body_tracking_calib_app, - ); - - start_body_tracking_calib_app - .map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let get_body_tracking_state = unsafe { - let mut get_body_tracking_state = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrGetBodyTrackingStateBD".as_ptr(), - &mut get_body_tracking_state, - ); - - get_body_tracking_state - .map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; + let create_body_tracker: CreateBodyTrackerBD = + get_instance_proc(session, "xrCreateBodyTrackerBD")?; + let start_body_tracking_calib_app: StartBodyTrackingCalibAppBD = + get_instance_proc(session, "xrStartBodyTrackingCalibAppBD")?; + let get_body_tracking_state: GetBodyTrackingStateBD = + get_instance_proc(session, "xrGetBodyTrackingStateBD")?; + let destroy_body_tracker = get_instance_proc(session, "xrDestroyBodyTrackerBD")?; + let locate_body_joints = get_instance_proc(session, "xrLocateBodyJointsBD")?; let props = super::get_props( session, diff --git a/alvr/client_openxr/src/extra_extensions/face_tracking_pico.rs b/alvr/client_openxr/src/extra_extensions/face_tracking_pico.rs index eb4166aca3..0e3a7cd726 100644 --- a/alvr/client_openxr/src/extra_extensions/face_tracking_pico.rs +++ b/alvr/client_openxr/src/extra_extensions/face_tracking_pico.rs @@ -1,6 +1,5 @@ -use openxr::sys::pfn::VoidFunction; +use crate::extra_extensions::get_instance_proc; use openxr::{self as xr, sys}; -use std::mem; const TRACKING_MODE_FACE_BIT: u64 = 0x00000008; const TRACKING_MODE_FACE_LIPSYNC: u64 = 0x00002000; @@ -46,54 +45,10 @@ impl FaceTrackerPico { .ext_eye_gaze_interaction .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - let start_eye_tracking = unsafe { - let mut start_eye_tracking = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrStartEyeTrackingPICO".as_ptr(), - &mut start_eye_tracking, - ); - - start_eye_tracking.map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let stop_eye_tracking = unsafe { - let mut stop_eye_tracking = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrStopEyeTrackingPICO".as_ptr(), - &mut stop_eye_tracking, - ); - - stop_eye_tracking.map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let set_tracking_mode = unsafe { - let mut set_tracking_mode = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrSetTrackingModePICO".as_ptr(), - &mut set_tracking_mode, - ); - - set_tracking_mode.map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let get_face_tracking_data = unsafe { - let mut get_face_tracking_data = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrGetFaceTrackingDataPICO".as_ptr(), - &mut get_face_tracking_data, - ); - - get_face_tracking_data - .map(|pfn| mem::transmute::(pfn)) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; + let start_eye_tracking = get_instance_proc(&session, "xrStartEyeTrackingPICO")?; + let stop_eye_tracking = get_instance_proc(&session, "xrStopEyeTrackingPICO")?; + let set_tracking_mode = get_instance_proc(&session, "xrSetTrackingModePICO")?; + let get_face_tracking_data = get_instance_proc(&session, "xrGetFaceTrackingDataPICO")?; let mut tracking_flags = 0; diff --git a/alvr/client_openxr/src/extra_extensions/mod.rs b/alvr/client_openxr/src/extra_extensions/mod.rs index 8d0a3848b8..df8c1faae7 100644 --- a/alvr/client_openxr/src/extra_extensions/mod.rs +++ b/alvr/client_openxr/src/extra_extensions/mod.rs @@ -19,6 +19,8 @@ pub use facial_tracking_htc::*; pub use multimodal_input::*; pub use passthrough_fb::*; pub use passthrough_htc::*; +use std::ffi::CString; +use std::mem; use openxr::{self as xr, sys}; @@ -49,3 +51,20 @@ fn get_props( xr_res(result).map(|_| props) } + +fn get_instance_proc(session: &xr::Session, method_name: &str) -> xr::Result { + unsafe { + let method_name = CString::new(method_name).unwrap(); + let mut function_handle = None; + + xr_res((session.instance().fp().get_instance_proc_addr)( + session.instance().as_raw(), + method_name.as_ptr(), + &mut function_handle, + ))?; + + function_handle + .map(|pfn| mem::transmute_copy(&pfn)) + .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT) + } +} diff --git a/alvr/client_openxr/src/extra_extensions/multimodal_input.rs b/alvr/client_openxr/src/extra_extensions/multimodal_input.rs index a6076be907..8834b4b8e5 100644 --- a/alvr/client_openxr/src/extra_extensions/multimodal_input.rs +++ b/alvr/client_openxr/src/extra_extensions/multimodal_input.rs @@ -1,12 +1,13 @@ // Code taken from: // https://github.com/meta-quest/Meta-OpenXR-SDK/blob/main/OpenXR/meta_openxr_preview/meta_simultaneous_hands_and_controllers.h +use crate::extra_extensions::get_instance_proc; use alvr_common::once_cell::sync::Lazy; use openxr::{ self as xr, - sys::{self, pfn::VoidFunction}, + sys::{self}, }; -use std::{ffi::c_void, mem, ptr}; +use std::{ffi::c_void, ptr}; pub const META_SIMULTANEOUS_HANDS_AND_CONTROLLERS_EXTENSION_NAME: &str = "XR_META_simultaneous_hands_and_controllers"; @@ -67,44 +68,21 @@ impl MultimodalMeta { return Err(sys::Result::ERROR_EXTENSION_NOT_PRESENT); } - let resume_simultaneous_hands_and_controllers_tracking_meta = unsafe { - let mut resume_simultaneous_hands_and_controllers_tracking_meta = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrResumeSimultaneousHandsAndControllersTrackingMETA".as_ptr(), - &mut resume_simultaneous_hands_and_controllers_tracking_meta, - ); - - resume_simultaneous_hands_and_controllers_tracking_meta.map(|pfn| { - mem::transmute::( - pfn, - ) - }) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; - - let pause_simultaneous_hands_and_controllers_tracking_meta = unsafe { - let mut pause_simultaneous_hands_and_controllers_tracking_meta = None; - let _ = (session.instance().fp().get_instance_proc_addr)( - session.instance().as_raw(), - c"xrPauseSimultaneousHandsAndControllersTrackingMETA".as_ptr(), - &mut pause_simultaneous_hands_and_controllers_tracking_meta, - ); - - pause_simultaneous_hands_and_controllers_tracking_meta.map(|pfn| { - mem::transmute::( - pfn, - ) - }) - } - .ok_or(sys::Result::ERROR_EXTENSION_NOT_PRESENT)?; + let resume_simultaneous_hands_and_controllers_tracking_meta = get_instance_proc( + &session, + "xrResumeSimultaneousHandsAndControllersTrackingMETA", + )?; + let pause_simultaneous_hands_and_controllers_tracking_meta = get_instance_proc( + &session, + "xrPauseSimultaneousHandsAndControllersTrackingMETA", + )?; let props = super::get_props( &session, system, SystemSymultaneousHandsAndControllersPropertiesMETA { ty: *TYPE_SYSTEM_SIMULTANEOUS_HANDS_AND_CONTROLLERS_PROPERTIES_META, - next: std::ptr::null(), + next: ptr::null(), supports_simultaneous_hands_and_controllers: xr::sys::FALSE, }, )?;