recreate swapchain on size change
This commit is contained in:
@@ -2,8 +2,8 @@ use std::{
|
|||||||
collections::VecDeque,
|
collections::VecDeque,
|
||||||
ops::Add,
|
ops::Add,
|
||||||
sync::{
|
sync::{
|
||||||
atomic::{AtomicBool, AtomicUsize, Ordering},
|
|
||||||
Arc,
|
Arc,
|
||||||
|
atomic::{AtomicBool, AtomicUsize, Ordering},
|
||||||
},
|
},
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
@@ -24,10 +24,10 @@ use crate::{
|
|||||||
overlay::{OverlayData, ShouldRender},
|
overlay::{OverlayData, ShouldRender},
|
||||||
task::{SystemTask, TaskType},
|
task::{SystemTask, TaskType},
|
||||||
},
|
},
|
||||||
graphics::{init_openxr_graphics, CommandBuffers},
|
graphics::{CommandBuffers, init_openxr_graphics},
|
||||||
overlays::{
|
overlays::{
|
||||||
toast::{Toast, ToastTopic},
|
toast::{Toast, ToastTopic},
|
||||||
watch::{watch_fade, WATCH_NAME},
|
watch::{WATCH_NAME, watch_fade},
|
||||||
},
|
},
|
||||||
state::AppState,
|
state::AppState,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,10 +3,10 @@ use openxr::{self as xr, CompositionLayerFlags};
|
|||||||
use std::f32::consts::PI;
|
use std::f32::consts::PI;
|
||||||
use xr::EyeVisibility;
|
use xr::EyeVisibility;
|
||||||
|
|
||||||
use super::{helpers, swapchain::WlxSwapchain, CompositionLayer, XrState};
|
use super::{CompositionLayer, XrState, helpers, swapchain::WlxSwapchain};
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::{
|
backend::{
|
||||||
openxr::swapchain::{create_swapchain, SwapchainOpts},
|
openxr::swapchain::{SwapchainOpts, create_swapchain},
|
||||||
overlay::OverlayData,
|
overlay::OverlayData,
|
||||||
},
|
},
|
||||||
state::AppState,
|
state::AppState,
|
||||||
@@ -27,10 +27,6 @@ impl OverlayData<OpenXrOverlayData> {
|
|||||||
app: &AppState,
|
app: &AppState,
|
||||||
xr: &'a XrState,
|
xr: &'a XrState,
|
||||||
) -> anyhow::Result<bool> {
|
) -> anyhow::Result<bool> {
|
||||||
if self.data.swapchain.is_some() {
|
|
||||||
return Ok(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
let Some(meta) = self.frame_meta() else {
|
let Some(meta) = self.frame_meta() else {
|
||||||
log::warn!(
|
log::warn!(
|
||||||
"{}: swapchain cannot be created due to missing metadata",
|
"{}: swapchain cannot be created due to missing metadata",
|
||||||
@@ -39,11 +35,25 @@ impl OverlayData<OpenXrOverlayData> {
|
|||||||
return Ok(false);
|
return Ok(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
let extent = meta.extent;
|
if self
|
||||||
|
.data
|
||||||
|
.swapchain
|
||||||
|
.as_ref()
|
||||||
|
.is_some_and(|s| s.extent == meta.extent)
|
||||||
|
{
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
log::debug!(
|
||||||
|
"{}: recreating swapchain at {}x{}",
|
||||||
|
self.state.name,
|
||||||
|
meta.extent[0],
|
||||||
|
meta.extent[1],
|
||||||
|
);
|
||||||
self.data.swapchain = Some(create_swapchain(
|
self.data.swapchain = Some(create_swapchain(
|
||||||
xr,
|
xr,
|
||||||
app.gfx.clone(),
|
app.gfx.clone(),
|
||||||
extent,
|
meta.extent,
|
||||||
SwapchainOpts::new(),
|
SwapchainOpts::new(),
|
||||||
)?);
|
)?);
|
||||||
Ok(true)
|
Ok(true)
|
||||||
|
|||||||
Reference in New Issue
Block a user