finish rendering
This commit is contained in:
@@ -3,6 +3,8 @@ mod utils;
|
|||||||
|
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
|
||||||
|
use glam::UVec2;
|
||||||
|
use openxr::EnvironmentBlendMode;
|
||||||
use tracing::{info, info_span, warn};
|
use tracing::{info, info_span, warn};
|
||||||
|
|
||||||
use crate::{backend::oxr::graphics::VIEW_TYPE, prelude::*};
|
use crate::{backend::oxr::graphics::VIEW_TYPE, prelude::*};
|
||||||
@@ -83,10 +85,13 @@ pub struct OXrSession {
|
|||||||
)>,
|
)>,
|
||||||
>,
|
>,
|
||||||
pub(crate) frame_state: Mutex<openxr::FrameState>,
|
pub(crate) frame_state: Mutex<openxr::FrameState>,
|
||||||
|
pub(crate) views: Mutex<[openxr::View; 2]>,
|
||||||
pub(crate) frame_waiter: Mutex<openxr::FrameWaiter>,
|
pub(crate) frame_waiter: Mutex<openxr::FrameWaiter>,
|
||||||
pub(crate) swapchain: graphics::Swapchain,
|
pub(crate) swapchain: graphics::Swapchain,
|
||||||
pub(crate) stage: openxr::Space,
|
pub(crate) stage: openxr::Space,
|
||||||
pub(crate) head: openxr::Space,
|
pub(crate) head: openxr::Space,
|
||||||
|
pub(crate) resolution: UVec2,
|
||||||
|
pub(crate) blend_mode: EnvironmentBlendMode,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SessionTrait for OXrSession {
|
impl SessionTrait for OXrSession {
|
||||||
@@ -171,6 +176,8 @@ impl SessionTrait for OXrSession {
|
|||||||
.1
|
.1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
*self.views.lock().unwrap() = [views[0].clone(), views[1].clone()];
|
||||||
|
|
||||||
{
|
{
|
||||||
let _span = info_span!("xr_acquire_image").entered();
|
let _span = info_span!("xr_acquire_image").entered();
|
||||||
self.swapchain.acquire_image().unwrap()
|
self.swapchain.acquire_image().unwrap()
|
||||||
@@ -195,7 +202,26 @@ impl SessionTrait for OXrSession {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn end_frame(&self) -> Result<()> {
|
fn end_frame(&self) -> Result<()> {
|
||||||
todo!()
|
{
|
||||||
|
let _span = info_span!("xr_release_image").entered();
|
||||||
|
self.swapchain.release_image().unwrap();
|
||||||
|
}
|
||||||
|
{
|
||||||
|
let _span = info_span!("xr_end_frame").entered();
|
||||||
|
let result = self.swapchain.end(
|
||||||
|
self.frame_state.lock().unwrap().predicted_display_time,
|
||||||
|
&*self.views.lock().unwrap(),
|
||||||
|
&self.stage,
|
||||||
|
self.resolution,
|
||||||
|
self.blend_mode,
|
||||||
|
// passthrough_layer.map(|p| p.into_inner()),
|
||||||
|
);
|
||||||
|
match result {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(e) => warn!("error: {}", e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -298,6 +298,8 @@ pub fn init_oxr_graphics(
|
|||||||
wgpu_adapter,
|
wgpu_adapter,
|
||||||
wgpu_instance,
|
wgpu_instance,
|
||||||
))),
|
))),
|
||||||
|
resolution,
|
||||||
|
views: Mutex::new([openxr::View::default(), openxr::View::default()]),
|
||||||
swapchain: Swapchain::Vulkan(SwapchainInner {
|
swapchain: Swapchain::Vulkan(SwapchainInner {
|
||||||
stream: Mutex::new(frame_stream),
|
stream: Mutex::new(frame_stream),
|
||||||
swapchain: Mutex::new(swapchain),
|
swapchain: Mutex::new(swapchain),
|
||||||
@@ -309,6 +311,7 @@ pub fn init_oxr_graphics(
|
|||||||
predicted_display_period: openxr::Duration::from_nanos(1),
|
predicted_display_period: openxr::Duration::from_nanos(1),
|
||||||
should_render: true,
|
should_render: true,
|
||||||
}),
|
}),
|
||||||
|
blend_mode,
|
||||||
frame_waiter: Mutex::new(frame_wait),
|
frame_waiter: Mutex::new(frame_wait),
|
||||||
stage: session
|
stage: session
|
||||||
.create_reference_space(openxr::ReferenceSpaceType::STAGE, openxr::Posef::IDENTITY)?,
|
.create_reference_space(openxr::ReferenceSpaceType::STAGE, openxr::Posef::IDENTITY)?,
|
||||||
|
|||||||
Reference in New Issue
Block a user