Skip to content

Commit

Permalink
refactor: Function for xrGetInstanceProcAddr calls (#2683)
Browse files Browse the repository at this point in the history
* refactor: Macro for `xrGetInstanceProcAddr` calls

* refactor: Address requested changes

* refactor: Pass Session instead of Instance

* refactor: Address requested change
  • Loading branch information
curoviyxru authored Feb 2, 2025
1 parent 48ac3ea commit bfbad44
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 148 deletions.
74 changes: 10 additions & 64 deletions alvr/client_openxr/src/extra_extensions/body_tracking_bd.rs
Original file line number Diff line number Diff line change
@@ -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";

Expand Down Expand Up @@ -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::<VoidFunction, CreateBodyTrackerBD>(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::<VoidFunction, DestroyBodyTrackerBD>(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::<VoidFunction, LocateBodyJointsBD>(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::<VoidFunction, StartBodyTrackingCalibAppBD>(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::<VoidFunction, GetBodyTrackingStateBD>(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,
Expand Down
55 changes: 5 additions & 50 deletions alvr/client_openxr/src/extra_extensions/face_tracking_pico.rs
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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::<VoidFunction, StartEyeTrackingPICO>(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::<VoidFunction, StopEyeTrackingPICO>(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::<VoidFunction, SetTrackingModePICO>(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::<VoidFunction, GetFaceTrackingDataPICO>(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;

Expand Down
19 changes: 19 additions & 0 deletions alvr/client_openxr/src/extra_extensions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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};

Expand Down Expand Up @@ -49,3 +51,20 @@ fn get_props<G, T>(

xr_res(result).map(|_| props)
}

fn get_instance_proc<G, FnTy>(session: &xr::Session<G>, method_name: &str) -> xr::Result<FnTy> {
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)
}
}
46 changes: 12 additions & 34 deletions alvr/client_openxr/src/extra_extensions/multimodal_input.rs
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -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::<VoidFunction, ResumeSimultaneousHandsAndControllersTrackingMETA>(
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::<VoidFunction, PauseSimultaneousHandsAndControllersTrackingMETA>(
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,
},
)?;
Expand Down

0 comments on commit bfbad44

Please sign in to comment.