Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: Function for xrGetInstanceProcAddr calls #2683

Merged
merged 4 commits into from
Feb 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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