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?