recreate swapchain on size change

This commit is contained in:
galister
2025-06-18 19:23:44 +09:00
parent 66ac622136
commit 467b0cc33d
2 changed files with 21 additions and 11 deletions

View File

@@ -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,
}; };

View File

@@ -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)