How do you use Rust glium with openxr in a VR headset?

102 Views Asked by At

I am working on a Rust NDK app (uses #[no_mangle] fn android_main(android_app:android_activity::AndroidApp) ; compatible with cargo apk run)

I have a version that works with glium

#[no_mangle]
fn android_main(android_app: AndroidApp) {
    android_logger::init_once(
        android_logger::Config::default().with_max_level(log::LevelFilter::Trace),
    );

    use glium::glutin::platform::android::EventLoopBuilderExtAndroid;

    let mut builder: //winit::event_loop::
        EventLoopBuilder<_> = EventLoopBuilder::new();
    let event_loop: EventLoop<()> = builder.with_android_app(android_app).build();
 
    log::debug!("got event loop");
    
    let mut app = AppState::<ActiveRenderer>::default();
    event_loop.run(move |evt, e_loop, ctx| {
        event_loop_one_pass(evt, e_loop, ctx, &mut app, |event_loop| {
            ActiveRenderer::new(event_loop)
        })
    });
}

impl ActiveRenderer {
    pub fn new<T>(event_loop: &EventLoopWindowTarget<T>) -> Result<Self, DisplayCreationError> {
        let wb = WindowBuilder::new();
        log::debug!("window builder");
        let cb = ContextBuilder::new();
        log::debug!("context builder");
        let glium_display = glium::Display::new(wb, cb, event_loop)?;

        let render_state = Renderer::new(&glium_display).unwrap();

        Ok(Self {
            glium_display,
            render_state,
        })
    }
}

However, this does not take advantage of the stereo capabilities of the Quest 2 headset. It just shows the graphics in a 2d "window" within the 3D lobby environment.

I have another app which uses openxr and raw GL and displays 3D environments. Part of initializing openxr on an android VR headset is calling

let graphics_binding = GraphicsBindingOpenGLESAndroidKHR {
    ty: GraphicsBindingOpenGLESAndroidKHR::TYPE,
    next: null(),
    config: null_mut(),
    context: info.gl_context,
    display: info.gl_display,
};
let session_create_info = SessionCreateInfo {
    ty: SessionCreateInfo::TYPE,
    next: &graphics_binding as *const _ as *const c_void,
    create_flags: Default::default(),
    system_id: info.system_id,
};

let mut rval = MaybeUninit::uninit();
create_session(instance.as_raw(), &session_create_info, rval.as_mut_ptr());
Ok(rval.assume_init())

but I'm not sure how to get the values for info.gl_context and info.gl_display out of the glium environment.

What is the idiom for mixing glium and openxr on an android VR headset in Rust?

0

There are 0 best solutions below