optional extent when recreating swapchain
This commit is contained in:
parent
9d132066d3
commit
28c6cc35f3
|
@ -40,10 +40,10 @@ impl WindowState {
|
||||||
_ = (window_id, new_size);
|
_ = (window_id, new_size);
|
||||||
info!("TODO: implement resize events");
|
info!("TODO: implement resize events");
|
||||||
if let Some(ctx) = self.renderer.window_contexts.get_mut(&window_id) {
|
if let Some(ctx) = self.renderer.window_contexts.get_mut(&window_id) {
|
||||||
ctx.recreate_with(renderer::Extent2D {
|
ctx.recreate_with(Some(renderer::Extent2D {
|
||||||
width: new_size.width,
|
width: new_size.width,
|
||||||
height: new_size.height,
|
height: new_size.height,
|
||||||
})
|
}))
|
||||||
.expect("swapchain recreation");
|
.expect("swapchain recreation");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -541,6 +541,15 @@ impl Device {
|
||||||
.for_each(|q| unsafe { q.0.force_unlock() });
|
.for_each(|q| unsafe { q.0.force_unlock() });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn wait_queue_idle(&self, queue: &Queue) -> VkResult<()> {
|
||||||
|
tracing::warn!("locking queue {queue:?} and waiting for idle");
|
||||||
|
|
||||||
|
queue.with_locked(|q| unsafe { self.dev().queue_wait_idle(q) })?;
|
||||||
|
|
||||||
|
tracing::warn!("finished waiting: unlocking queue {queue:?}.");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
fn wait_idle(&self) -> VkResult<()> {
|
fn wait_idle(&self) -> VkResult<()> {
|
||||||
tracing::warn!("locking all queues and waiting for device to idle");
|
tracing::warn!("locking all queues and waiting for device to idle");
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -639,13 +648,15 @@ pub struct Swapchain {
|
||||||
fences: Vec<Arc<sync::Fence>>,
|
fences: Vec<Arc<sync::Fence>>,
|
||||||
|
|
||||||
current_frame: AtomicU32,
|
current_frame: AtomicU32,
|
||||||
|
|
||||||
|
// for khr_present_id/khr_present_wait
|
||||||
present_id: AtomicU64,
|
present_id: AtomicU64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Swapchain {
|
impl Drop for Swapchain {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
unsafe {
|
unsafe {
|
||||||
self.device.wait_idle();
|
self.device.wait_queue_idle(self.device.present_queue());
|
||||||
info!("dropping swapchain {:?}", self.swapchain);
|
info!("dropping swapchain {:?}", self.swapchain);
|
||||||
for view in &self.image_views {
|
for view in &self.image_views {
|
||||||
self.device.dev().destroy_image_view(*view, None);
|
self.device.dev().destroy_image_view(*view, None);
|
||||||
|
@ -723,7 +734,7 @@ impl Swapchain {
|
||||||
instance: &Arc<Instance>,
|
instance: &Arc<Instance>,
|
||||||
surface: vk::SurfaceKHR,
|
surface: vk::SurfaceKHR,
|
||||||
pdev: vk::PhysicalDevice,
|
pdev: vk::PhysicalDevice,
|
||||||
requested_extent: vk::Extent2D,
|
requested_extent: Option<vk::Extent2D>,
|
||||||
) -> Result<SwapchainParams> {
|
) -> Result<SwapchainParams> {
|
||||||
let caps = unsafe {
|
let caps = unsafe {
|
||||||
instance
|
instance
|
||||||
|
@ -770,7 +781,11 @@ impl Swapchain {
|
||||||
+ Self::PREFERRED_IMAGES_IN_FLIGHT)
|
+ Self::PREFERRED_IMAGES_IN_FLIGHT)
|
||||||
.min(max_image_count);
|
.min(max_image_count);
|
||||||
|
|
||||||
let extent = current_extent_or_clamped(&caps, requested_extent);
|
let extent = current_extent_or_clamped(
|
||||||
|
&caps,
|
||||||
|
requested_extent
|
||||||
|
.unwrap_or(vk::Extent2D::default().width(1).height(1)),
|
||||||
|
);
|
||||||
|
|
||||||
Ok(SwapchainParams {
|
Ok(SwapchainParams {
|
||||||
present_mode,
|
present_mode,
|
||||||
|
@ -789,7 +804,7 @@ impl Swapchain {
|
||||||
pdev: vk::PhysicalDevice,
|
pdev: vk::PhysicalDevice,
|
||||||
extent: vk::Extent2D,
|
extent: vk::Extent2D,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
Self::create(instance, device, surface, pdev, extent, None)
|
Self::create(instance, device, surface, pdev, Some(extent), None)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create(
|
fn create(
|
||||||
|
@ -797,7 +812,7 @@ impl Swapchain {
|
||||||
device: Device,
|
device: Device,
|
||||||
surface: Arc<Surface>,
|
surface: Arc<Surface>,
|
||||||
pdev: vk::PhysicalDevice,
|
pdev: vk::PhysicalDevice,
|
||||||
extent: vk::Extent2D,
|
extent: Option<vk::Extent2D>,
|
||||||
old_swapchain: Option<&SwapchainHandle>,
|
old_swapchain: Option<&SwapchainHandle>,
|
||||||
) -> Result<Self> {
|
) -> Result<Self> {
|
||||||
let SwapchainParams {
|
let SwapchainParams {
|
||||||
|
@ -962,7 +977,7 @@ impl Swapchain {
|
||||||
self.images.len() as u32
|
self.images.len() as u32
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recreate(&self, extent: vk::Extent2D) -> Result<Self> {
|
fn recreate(&self, extent: Option<vk::Extent2D>) -> Result<Self> {
|
||||||
Self::create(
|
Self::create(
|
||||||
self.instance.clone(),
|
self.instance.clone(),
|
||||||
self.device.clone(),
|
self.device.clone(),
|
||||||
|
@ -1975,14 +1990,14 @@ impl WindowContext {
|
||||||
let mut lock = self.current_swapchain.write();
|
let mut lock = self.current_swapchain.write();
|
||||||
// only recreate our swapchain if it is still same, or else it might have already been recreated.
|
// only recreate our swapchain if it is still same, or else it might have already been recreated.
|
||||||
if Arc::ptr_eq(&swapchain, &lock) {
|
if Arc::ptr_eq(&swapchain, &lock) {
|
||||||
*lock = Arc::new(lock.recreate(lock.extent)?);
|
*lock = Arc::new(lock.recreate(None)?);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(frame)
|
Ok(frame)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn recreate_with(&self, extent: vk::Extent2D) -> Result<()> {
|
pub fn recreate_with(&self, extent: Option<vk::Extent2D>) -> Result<()> {
|
||||||
let mut swapchain = self.current_swapchain.write();
|
let mut swapchain = self.current_swapchain.write();
|
||||||
*swapchain = Arc::new(swapchain.recreate(extent)?);
|
*swapchain = Arc::new(swapchain.recreate(extent)?);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue