mirror of
https://github.com/vulkano-rs/vulkano.git
synced 2024-11-25 00:04:15 +00:00
Downgrade Winit back to 0.19; Release Vulkano 0.16 (#1267)
* fix after revert; release 0.16 * bump shaders version
This commit is contained in:
parent
08d635c977
commit
2e6868a0c0
@ -1,4 +1,6 @@
|
||||
# Unreleased *breaking*
|
||||
# Unreleased
|
||||
|
||||
# Version 0.5.0 (2019-11-01)
|
||||
|
||||
- Add const `STRUCTURE_TYPE_PHYSICAL_DEVICE_16BIT_STORAGE_FEATURES_KHR` and
|
||||
struct `PhysicalDevice16BitStorageFeaturesKHR` for `VK_KHR_16bit_storage`
|
||||
|
@ -1,5 +1,7 @@
|
||||
# Unreleased
|
||||
|
||||
# Version 0.16.0 (2019-11-01)
|
||||
|
||||
- Fixed bug in examples causing OutOfHostMemory errors
|
||||
- Replaced `VK_EXT_debug_report` `VK_EXT_debug_marker` with `VK_EXT_debug_utils`.
|
||||
- Update MacOS dependencies metal to 0.17 and cocoa to 0.19
|
||||
@ -16,6 +18,10 @@
|
||||
- Add support for GLSL macro defines to the `shader!` macro.
|
||||
- Switch to Vulkan 1.1 and inherently SpirV 1.3 (shaderc default version for vulkan 1.1)
|
||||
|
||||
# Version 0.15.0 (2019-10-18)
|
||||
|
||||
*Yanked*
|
||||
|
||||
# Version 0.14.0 (2019-08-17)
|
||||
|
||||
- Update shaderc to 0.6. This again allows to use locally installed libraries which reduces the build-time significantly on Arch/Voidlinux (see https://github.com/google/shaderc-rs/issues/58)
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "examples"
|
||||
version = "0.2.0"
|
||||
version = "0.1.0"
|
||||
edition = "2018"
|
||||
authors = ["Pierre Krieger <pierre.krieger1708@gmail.com>"]
|
||||
publish = false
|
||||
@ -12,7 +12,7 @@ vulkano = { path = "../vulkano" }
|
||||
vulkano-shaders = { path = "../vulkano-shaders" }
|
||||
# The Vulkan library doesn't provide any functionality to create and handle windows, as
|
||||
# this would be out of scope. In order to open a window, we are going to use the `winit` crate.
|
||||
winit = "0.20.0-alpha4"
|
||||
winit = "0.19"
|
||||
# The `vulkano_win` crate is the link between `vulkano` and `winit`. Vulkano doesn't know about winit,
|
||||
# and winit doesn't know about vulkano, so import a crate that will provide a link between the two.
|
||||
vulkano-win = { path = "../vulkano-win" }
|
||||
|
@ -35,9 +35,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::{EventsLoop, WindowBuilder, Event, WindowEvent};
|
||||
|
||||
use cgmath::Matrix4;
|
||||
use cgmath::SquareMatrix;
|
||||
@ -56,7 +54,7 @@ fn main() {
|
||||
|
||||
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
|
||||
|
||||
let events_loop = EventLoop::new();
|
||||
let mut events_loop = EventsLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
@ -76,9 +74,11 @@ fn main() {
|
||||
let alpha = caps.supported_composite_alpha.iter().next().unwrap();
|
||||
let format = caps.supported_formats[0].0;
|
||||
|
||||
let initial_dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let initial_dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
Swapchain::new(device.clone(), surface.clone(), caps.min_image_count, format,
|
||||
@ -92,24 +92,23 @@ fn main() {
|
||||
let triangle_draw_system = TriangleDrawSystem::new(queue.clone(), frame_system.deferred_subpass());
|
||||
|
||||
let mut recreate_swapchain = false;
|
||||
let mut previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
||||
let mut previous_frame_end = Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>;
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
|
||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
loop {
|
||||
previous_frame_end.cleanup_finished();
|
||||
|
||||
if recreate_swapchain {
|
||||
let dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => {
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -123,13 +122,12 @@ fn main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
|
||||
let prev = previous_frame_end.take();
|
||||
let future = prev.unwrap().join(acquire_future);
|
||||
let future = previous_frame_end.join(acquire_future);
|
||||
let mut frame = frame_system.frame(future, images[image_num].clone(), Matrix4::identity());
|
||||
let mut after_future = None;
|
||||
while let Some(pass) = frame.next_pass() {
|
||||
@ -159,22 +157,26 @@ fn main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame_end = Some(Box::new(future) as Box<_>);
|
||||
previous_frame_end = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => (),
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => done = true,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return; }
|
||||
}
|
||||
}
|
||||
|
@ -25,9 +25,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{Window, WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::{EventsLoop, Window, WindowBuilder, Event, WindowEvent};
|
||||
|
||||
use png;
|
||||
use std::io::Cursor;
|
||||
@ -44,7 +42,7 @@ fn main() {
|
||||
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
|
||||
println!("Using device: {} (type: {:?})", physical.name(), physical.ty());
|
||||
|
||||
let events_loop = EventLoop::new();
|
||||
let mut events_loop = EventsLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
@ -64,10 +62,13 @@ fn main() {
|
||||
let alpha = caps.supported_composite_alpha.iter().next().unwrap();
|
||||
let format = caps.supported_formats[0].0;
|
||||
|
||||
let initial_dimensions = {
|
||||
let initial_dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
// convert to physical pixels
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
// The window no longer exists so exit the application.
|
||||
return;
|
||||
};
|
||||
|
||||
Swapchain::new(device.clone(), surface.clone(), caps.min_image_count, format,
|
||||
@ -153,22 +154,21 @@ fn main() {
|
||||
let mut framebuffers = window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
|
||||
|
||||
let mut recreate_swapchain = false;
|
||||
let mut previous_frame_end = Some(Box::new(tex_future) as Box<dyn GpuFuture>);
|
||||
let mut previous_frame_end = Box::new(tex_future) as Box<dyn GpuFuture>;
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
|
||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
loop {
|
||||
previous_frame_end.cleanup_finished();
|
||||
if recreate_swapchain {
|
||||
let dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => return,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => continue,
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
|
||||
@ -182,7 +182,7 @@ fn main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -195,8 +195,7 @@ fn main() {
|
||||
.end_render_pass().unwrap()
|
||||
.build().unwrap();
|
||||
|
||||
let prev = previous_frame_end.take();
|
||||
let future = prev.unwrap().join(future)
|
||||
let future = previous_frame_end.join(future)
|
||||
.then_execute(queue.clone(), cb).unwrap()
|
||||
.then_swapchain_present(queue.clone(), swapchain.clone(), image_num)
|
||||
.then_signal_fence_and_flush();
|
||||
@ -205,24 +204,28 @@ fn main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame_end = Some(Box::new(future) as Box<_>);
|
||||
previous_frame_end = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => done = true,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return; }
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called once during initialization, then again whenever the window is resized
|
||||
|
@ -46,9 +46,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{Window, WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::{EventsLoop, Window, WindowBuilder, Event, WindowEvent};
|
||||
|
||||
use std::sync::Arc;
|
||||
use std::iter;
|
||||
@ -71,7 +69,7 @@ fn main() {
|
||||
println!("Using device: {} (type: {:?})", physical.name(), physical.ty());
|
||||
|
||||
|
||||
let events_loop = EventLoop::new();
|
||||
let mut events_loop = EventsLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
@ -90,9 +88,11 @@ fn main() {
|
||||
let usage = caps.supported_usage_flags;
|
||||
let alpha = caps.supported_composite_alpha.iter().next().unwrap();
|
||||
let format = caps.supported_formats[0].0;
|
||||
let initial_dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let initial_dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
Swapchain::new(device.clone(), surface.clone(), caps.min_image_count, format,
|
||||
@ -211,22 +211,21 @@ void main() {
|
||||
let mut dynamic_state = DynamicState { line_width: None, viewports: None, scissors: None, compare_mask: None, write_mask: None, reference: None };
|
||||
let mut framebuffers = window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
|
||||
let mut recreate_swapchain = false;
|
||||
let mut previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
||||
let mut previous_frame_end = Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>;
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
|
||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
loop {
|
||||
previous_frame_end.cleanup_finished();
|
||||
|
||||
if recreate_swapchain {
|
||||
let dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => return,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => continue,
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
swapchain = new_swapchain;
|
||||
@ -238,7 +237,7 @@ void main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
},
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -288,8 +287,7 @@ void main() {
|
||||
.unwrap()
|
||||
.build().unwrap();
|
||||
|
||||
let prev = previous_frame_end.take();
|
||||
let future = prev.unwrap().join(acquire_future)
|
||||
let future = previous_frame_end.join(acquire_future)
|
||||
.then_execute(queue.clone(), command_buffer).unwrap()
|
||||
.then_swapchain_present(queue.clone(), swapchain.clone(), image_num)
|
||||
.then_signal_fence_and_flush();
|
||||
@ -298,24 +296,28 @@ void main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame_end = Some(Box::new(future) as Box<_>);
|
||||
previous_frame_end = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => done = true,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return; }
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called once during initialization, then again whenever the window is resized
|
||||
|
@ -34,9 +34,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{Window, WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::{EventsLoop, Window, WindowBuilder, Event, WindowEvent};
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
@ -70,7 +68,7 @@ fn main() {
|
||||
println!("Using device: {} (type: {:?})", physical.name(), physical.ty());
|
||||
|
||||
|
||||
let events_loop = EventLoop::new();
|
||||
let mut events_loop = EventsLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
@ -89,9 +87,11 @@ fn main() {
|
||||
let usage = caps.supported_usage_flags;
|
||||
let alpha = caps.supported_composite_alpha.iter().next().unwrap();
|
||||
let format = caps.supported_formats[0].0;
|
||||
let initial_dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let initial_dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
Swapchain::new(device.clone(), surface.clone(), caps.min_image_count, format,
|
||||
@ -200,22 +200,21 @@ void main() {
|
||||
let mut dynamic_state = DynamicState { line_width: None, viewports: None, scissors: None, compare_mask: None, write_mask: None, reference: None };
|
||||
let mut framebuffers = window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
|
||||
let mut recreate_swapchain = false;
|
||||
let mut previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
||||
let mut previous_frame_end = Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>;
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
|
||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
loop {
|
||||
previous_frame_end.cleanup_finished();
|
||||
|
||||
if recreate_swapchain {
|
||||
let dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => return,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => continue,
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
swapchain = new_swapchain;
|
||||
@ -227,7 +226,7 @@ void main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
},
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -250,8 +249,7 @@ void main() {
|
||||
.unwrap()
|
||||
.build().unwrap();
|
||||
|
||||
let prev = previous_frame_end.take();
|
||||
let future = prev.unwrap().join(acquire_future)
|
||||
let future = previous_frame_end.join(acquire_future)
|
||||
.then_execute(queue.clone(), command_buffer).unwrap()
|
||||
.then_swapchain_present(queue.clone(), swapchain.clone(), image_num)
|
||||
.then_signal_fence_and_flush();
|
||||
@ -260,24 +258,28 @@ void main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame_end = Some(Box::new(future) as Box<_>);
|
||||
previous_frame_end = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => done = true,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return; }
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called once during initialization, then again whenever the window is resized
|
||||
|
@ -44,9 +44,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{Window, WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::Window;
|
||||
|
||||
use std::borrow::Cow;
|
||||
use std::ffi::CStr;
|
||||
@ -66,8 +64,8 @@ fn main() {
|
||||
let instance = vk::instance::Instance::new(None, &vulkano_win::required_extensions(), None).unwrap();
|
||||
let physical = vk::instance::PhysicalDevice::enumerate(&instance).next().unwrap();
|
||||
|
||||
let events_loop = EventLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let mut events_loop = winit::EventsLoop::new();
|
||||
let surface = winit::WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
let queue_family = physical.queue_families().find(|&q| {
|
||||
@ -80,9 +78,11 @@ fn main() {
|
||||
};
|
||||
let queue = queues.next().unwrap();
|
||||
|
||||
let initial_dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let initial_dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (mut swapchain, images) = {
|
||||
@ -384,24 +384,23 @@ fn main() {
|
||||
|
||||
let mut dynamic_state = DynamicState { line_width: None, viewports: None, scissors: None, compare_mask: None, write_mask: None, reference: None };
|
||||
let mut framebuffers = window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
|
||||
let mut previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
||||
let mut previous_frame_end = Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>;
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
|
||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
loop {
|
||||
previous_frame_end.cleanup_finished();
|
||||
|
||||
if recreate_swapchain {
|
||||
// Get the new dimensions for the viewport/framebuffers.
|
||||
let dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => return,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => continue,
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
|
||||
@ -415,7 +414,7 @@ fn main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
},
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -428,8 +427,7 @@ fn main() {
|
||||
.end_render_pass().unwrap()
|
||||
.build().unwrap();
|
||||
|
||||
let prev = previous_frame_end.take();
|
||||
let future = prev.unwrap().join(acquire_future)
|
||||
let future = previous_frame_end.join(acquire_future)
|
||||
.then_execute(queue.clone(), command_buffer).unwrap()
|
||||
.then_swapchain_present(queue.clone(), swapchain.clone(), image_num)
|
||||
.then_signal_fence_and_flush();
|
||||
@ -438,24 +436,28 @@ fn main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame_end = Some(Box::new(future) as Box<_>);
|
||||
previous_frame_end = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(vulkano::sync::FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame_end = Some(Box::new(vulkano::sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(vulkano::sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame_end = Some(Box::new(vulkano::sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(vulkano::sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
winit::Event::WindowEvent { event: winit::WindowEvent::CloseRequested, .. } => done = true,
|
||||
winit::Event::WindowEvent { event: winit::WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return; }
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called once during initialization, then again whenever the window is resized
|
||||
|
@ -28,9 +28,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{Window, WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::Window;
|
||||
|
||||
use cgmath::{Matrix3, Matrix4, Point3, Vector3, Rad};
|
||||
|
||||
@ -50,15 +48,17 @@ fn main() {
|
||||
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
|
||||
println!("Using device: {} (type: {:?})", physical.name(), physical.ty());
|
||||
|
||||
let events_loop = EventLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let mut events_loop = winit::EventsLoop::new();
|
||||
let surface = winit::WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
// unlike the triangle example we need to keep track of the width and height so we can calculate
|
||||
// render the teapot with the correct aspect ratio.
|
||||
let mut dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let mut dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let queue_family = physical.queue_families().find(|&q|
|
||||
@ -123,24 +123,23 @@ fn main() {
|
||||
let (mut pipeline, mut framebuffers) = window_size_dependent_setup(device.clone(), &vs, &fs, &images, render_pass.clone());
|
||||
let mut recreate_swapchain = false;
|
||||
|
||||
let mut previous_frame = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
||||
let mut previous_frame = Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>;
|
||||
let rotation_start = Instant::now();
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
|
||||
previous_frame.as_mut().unwrap().cleanup_finished();
|
||||
loop {
|
||||
previous_frame.cleanup_finished();
|
||||
|
||||
if recreate_swapchain {
|
||||
dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => return,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => continue,
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
swapchain = new_swapchain;
|
||||
@ -182,7 +181,7 @@ fn main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
}
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -203,8 +202,7 @@ fn main() {
|
||||
.end_render_pass().unwrap()
|
||||
.build().unwrap();
|
||||
|
||||
let prev = previous_frame.take();
|
||||
let future = prev.unwrap().join(acquire_future)
|
||||
let future = previous_frame.join(acquire_future)
|
||||
.then_execute(queue.clone(), command_buffer).unwrap()
|
||||
.then_swapchain_present(queue.clone(), swapchain.clone(), image_num)
|
||||
.then_signal_fence_and_flush();
|
||||
@ -213,24 +211,28 @@ fn main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame = Some(Box::new(future) as Box<_>);
|
||||
previous_frame = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(sync::FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
winit::Event::WindowEvent { event: winit::WindowEvent::CloseRequested, .. } => done = true,
|
||||
winit::Event::WindowEvent { event: winit::WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return; }
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called once during initialization, then again whenever the window is resized
|
||||
|
@ -33,9 +33,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{Window, WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::{EventsLoop, Window, WindowBuilder, Event, WindowEvent};
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
@ -138,7 +136,7 @@ fn main() {
|
||||
let physical = PhysicalDevice::enumerate(&instance).next().unwrap();
|
||||
println!("Using device: {} (type: {:?})", physical.name(), physical.ty());
|
||||
|
||||
let events_loop = EventLoop::new();
|
||||
let mut events_loop = EventsLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
@ -151,9 +149,11 @@ fn main() {
|
||||
[(queue_family, 0.5)].iter().cloned()).unwrap();
|
||||
let queue = queues.next().unwrap();
|
||||
|
||||
let initial_dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let initial_dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (mut swapchain, images) = {
|
||||
@ -223,26 +223,24 @@ fn main() {
|
||||
.unwrap());
|
||||
|
||||
let mut recreate_swapchain = false;
|
||||
let mut previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
||||
let mut previous_frame_end = Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>;
|
||||
let mut dynamic_state = DynamicState { line_width: None, viewports: None, scissors: None, compare_mask: None, write_mask: None, reference: None };
|
||||
|
||||
let mut framebuffers = window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
|
||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
loop {
|
||||
previous_frame_end.cleanup_finished();
|
||||
if recreate_swapchain {
|
||||
let dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => {
|
||||
return;
|
||||
continue;
|
||||
},
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -257,7 +255,7 @@ fn main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
},
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -271,7 +269,7 @@ fn main() {
|
||||
.unwrap()
|
||||
.build().unwrap();
|
||||
|
||||
let future = previous_frame_end.take().unwrap().join(acquire_future)
|
||||
let future = previous_frame_end.join(acquire_future)
|
||||
.then_execute(queue.clone(), command_buffer).unwrap()
|
||||
.then_swapchain_present(queue.clone(), swapchain.clone(), image_num)
|
||||
.then_signal_fence_and_flush();
|
||||
@ -280,24 +278,28 @@ fn main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame_end = Some(Box::new(future) as Box<_>);
|
||||
previous_frame_end = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => (),
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => done = true,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return }
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called once during initialization, then again whenever the window is resized
|
||||
|
@ -31,9 +31,7 @@ use vulkano::sync;
|
||||
|
||||
use vulkano_win::VkSurfaceBuild;
|
||||
|
||||
use winit::event_loop::{EventLoop, ControlFlow};
|
||||
use winit::window::{Window, WindowBuilder};
|
||||
use winit::event::{Event, WindowEvent};
|
||||
use winit::{EventsLoop, Window, WindowBuilder, Event, WindowEvent};
|
||||
|
||||
use std::sync::Arc;
|
||||
|
||||
@ -80,7 +78,7 @@ fn main() {
|
||||
//
|
||||
// This returns a `vulkano::swapchain::Surface` object that contains both a cross-platform winit
|
||||
// window and a cross-platform Vulkan surface that represents the surface of the window.
|
||||
let events_loop = EventLoop::new();
|
||||
let mut events_loop = EventsLoop::new();
|
||||
let surface = WindowBuilder::new().build_vk_surface(&events_loop, instance.clone()).unwrap();
|
||||
let window = surface.window();
|
||||
|
||||
@ -154,10 +152,13 @@ fn main() {
|
||||
// These drivers will allow anything but the only sensible value is the window dimensions.
|
||||
//
|
||||
// Because for both of these cases, the swapchain needs to be the window dimensions, we just use that.
|
||||
let initial_dimensions = {
|
||||
let initial_dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
// convert to physical pixels
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
// The window no longer exists so exit the application.
|
||||
return;
|
||||
};
|
||||
|
||||
// Please take a look at the docs for the meaning of the parameters we didn't mention.
|
||||
@ -309,32 +310,31 @@ void main() {
|
||||
//
|
||||
// Destroying the `GpuFuture` blocks until the GPU is finished executing it. In order to avoid
|
||||
// that, we store the submission of the previous frame here.
|
||||
let mut previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>);
|
||||
|
||||
events_loop.run(move |ev, _, cf| {
|
||||
*cf = ControlFlow::Poll;
|
||||
let window = surface.window();
|
||||
let mut previous_frame_end = Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>;
|
||||
|
||||
loop {
|
||||
// It is important to call this function from time to time, otherwise resources will keep
|
||||
// accumulating and you will eventually reach an out of memory error.
|
||||
// Calling this function polls various fences in order to determine what the GPU has
|
||||
// already processed, and frees the resources that are no longer needed.
|
||||
previous_frame_end.as_mut().unwrap().cleanup_finished();
|
||||
previous_frame_end.cleanup_finished();
|
||||
|
||||
// Whenever the window resizes we need to recreate everything dependent on the window size.
|
||||
// In this example that includes the swapchain, the framebuffers and the dynamic state viewport.
|
||||
if recreate_swapchain {
|
||||
// Get the new dimensions of the window.
|
||||
let dimensions = {
|
||||
let dimensions: (u32, u32) = window.inner_size().to_physical(window.hidpi_factor()).into();
|
||||
let dimensions = if let Some(dimensions) = window.get_inner_size() {
|
||||
let dimensions: (u32, u32) = dimensions.to_physical(window.get_hidpi_factor()).into();
|
||||
[dimensions.0, dimensions.1]
|
||||
} else {
|
||||
return;
|
||||
};
|
||||
|
||||
let (new_swapchain, new_images) = match swapchain.recreate_with_dimension(dimensions) {
|
||||
Ok(r) => r,
|
||||
// This error tends to happen when the user is manually resizing the window.
|
||||
// Simply restarting the loop is the easiest way to fix this issue.
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => return,
|
||||
Err(SwapchainCreationError::UnsupportedDimensions) => continue,
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
|
||||
@ -357,7 +357,7 @@ void main() {
|
||||
Ok(r) => r,
|
||||
Err(AcquireError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
return;
|
||||
continue;
|
||||
},
|
||||
Err(err) => panic!("{:?}", err)
|
||||
};
|
||||
@ -401,8 +401,7 @@ void main() {
|
||||
// Finish building the command buffer by calling `build`.
|
||||
.build().unwrap();
|
||||
|
||||
let prev = previous_frame_end.take();
|
||||
let future = prev.unwrap().join(acquire_future)
|
||||
let future = previous_frame_end.join(acquire_future)
|
||||
.then_execute(queue.clone(), command_buffer).unwrap()
|
||||
|
||||
// The color output is now expected to contain our triangle. But in order to show it on
|
||||
@ -418,15 +417,15 @@ void main() {
|
||||
Ok(future) => {
|
||||
// This wait is required when using NVIDIA or running on macOS. See https://github.com/vulkano-rs/vulkano/issues/1247
|
||||
future.wait(None).unwrap();
|
||||
previous_frame_end = Some(Box::new(future) as Box<_>);
|
||||
previous_frame_end = Box::new(future) as Box<_>;
|
||||
}
|
||||
Err(FlushError::OutOfDate) => {
|
||||
recreate_swapchain = true;
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
Err(e) => {
|
||||
println!("{:?}", e);
|
||||
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>);
|
||||
previous_frame_end = Box::new(sync::now(device.clone())) as Box<_>;
|
||||
}
|
||||
}
|
||||
|
||||
@ -440,13 +439,16 @@ void main() {
|
||||
|
||||
// Handling the window events in order to close the program when the user wants to close
|
||||
// it.
|
||||
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => *cf = ControlFlow::Exit,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => {},
|
||||
}
|
||||
});
|
||||
let mut done = false;
|
||||
events_loop.poll_events(|ev| {
|
||||
match ev {
|
||||
Event::WindowEvent { event: WindowEvent::CloseRequested, .. } => done = true,
|
||||
Event::WindowEvent { event: WindowEvent::Resized(_), .. } => recreate_swapchain = true,
|
||||
_ => ()
|
||||
}
|
||||
});
|
||||
if done { return; }
|
||||
}
|
||||
}
|
||||
|
||||
/// This method is called once during initialization, then again whenever the window is resized
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "vk-sys"
|
||||
version = "0.4.0"
|
||||
version = "0.5.0"
|
||||
authors = ["Pierre Krieger <pierre.krieger1708@gmail.com>", "The vulkano contributors"]
|
||||
repository = "https://github.com/vulkano-rs/vulkano"
|
||||
description = "Bindings for the Vulkan graphics API"
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "vulkano-shaders"
|
||||
version = "0.14.0"
|
||||
version = "0.16.0"
|
||||
edition = "2018"
|
||||
authors = ["Pierre Krieger <pierre.krieger1708@gmail.com>", "The vulkano contributors"]
|
||||
repository = "https://github.com/vulkano-rs/vulkano"
|
||||
@ -21,7 +21,7 @@ quote = "1.0"
|
||||
proc-macro2 = "1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
vulkano = { version = "0.14", path = "../vulkano" }
|
||||
vulkano = { version = "0.16", path = "../vulkano" }
|
||||
|
||||
[features]
|
||||
shaderc-build-from-source = ["shaderc/build-from-source"]
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "vulkano-win"
|
||||
version = "0.15.0"
|
||||
version = "0.16.0"
|
||||
edition = "2018"
|
||||
authors = ["Pierre Krieger <pierre.krieger1708@gmail.com>", "The vulkano contributors"]
|
||||
repository = "https://github.com/vulkano-rs/vulkano"
|
||||
@ -12,8 +12,8 @@ keywords = ["vulkan", "bindings", "graphics", "gpu", "rendering"]
|
||||
categories = ["rendering::graphics-api"]
|
||||
|
||||
[dependencies]
|
||||
winit = "0.20.0-alpha4"
|
||||
vulkano = { version = "0.14.0", path = "../vulkano" }
|
||||
winit = "0.19"
|
||||
vulkano = { version = "0.16.0", path = "../vulkano" }
|
||||
|
||||
[target.'cfg(target_os = "macos")'.dependencies]
|
||||
metal = "0.17.0"
|
||||
|
@ -12,9 +12,8 @@ use vulkano::instance::Instance;
|
||||
use vulkano::instance::InstanceExtensions;
|
||||
use vulkano::swapchain::Surface;
|
||||
use vulkano::swapchain::SurfaceCreationError;
|
||||
use winit::event_loop::EventLoop;
|
||||
use winit::window::WindowBuilder;
|
||||
use winit::error::OsError as WindowCreationError;
|
||||
use winit::{EventsLoop, WindowBuilder};
|
||||
use winit::CreationError as WindowCreationError;
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
use cocoa::appkit::{NSView, NSWindow};
|
||||
@ -53,21 +52,21 @@ pub fn create_vk_surface<W>(
|
||||
window: W, instance: Arc<Instance>
|
||||
) -> Result<Arc<Surface<W>>, SurfaceCreationError>
|
||||
where
|
||||
W: SafeBorrow<winit::window::Window>,
|
||||
W: SafeBorrow<winit::Window>,
|
||||
{
|
||||
unsafe { winit_to_surface(instance, window) }
|
||||
}
|
||||
|
||||
pub trait VkSurfaceBuild {
|
||||
fn build_vk_surface(
|
||||
self, events_loop: &EventLoop<()>, instance: Arc<Instance>,
|
||||
) -> Result<Arc<Surface<winit::window::Window>>, CreationError>;
|
||||
self, events_loop: &EventsLoop, instance: Arc<Instance>,
|
||||
) -> Result<Arc<Surface<winit::Window>>, CreationError>;
|
||||
}
|
||||
|
||||
impl VkSurfaceBuild for WindowBuilder {
|
||||
fn build_vk_surface(
|
||||
self, events_loop: &EventLoop<()>, instance: Arc<Instance>,
|
||||
) -> Result<Arc<Surface<winit::window::Window>>, CreationError> {
|
||||
self, events_loop: &EventsLoop, instance: Arc<Instance>,
|
||||
) -> Result<Arc<Surface<winit::Window>>, CreationError> {
|
||||
let window = self.build(events_loop)?;
|
||||
Ok(create_vk_surface(window, instance)?)
|
||||
}
|
||||
@ -122,21 +121,21 @@ impl From<WindowCreationError> for CreationError {
|
||||
}
|
||||
|
||||
#[cfg(target_os = "android")]
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::window::Window>>(
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::Window>>(
|
||||
instance: Arc<Instance>, win: W,
|
||||
) -> Result<Arc<Surface<W>>, SurfaceCreationError> {
|
||||
use winit::platform::android::WindowExtAndroid;
|
||||
Surface::from_anativewindow(instance, win.borrow().native_window(), win)
|
||||
use winit::os::android::WindowExt;
|
||||
Surface::from_anativewindow(instance, win.borrow().get_native_window(), win)
|
||||
}
|
||||
|
||||
#[cfg(all(unix, not(target_os = "android"), not(target_os = "macos")))]
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::window::Window>>(
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::Window>>(
|
||||
instance: Arc<Instance>, win: W,
|
||||
) -> Result<Arc<Surface<W>>, SurfaceCreationError> {
|
||||
use winit::platform::unix::WindowExtUnix;
|
||||
use winit::os::unix::WindowExt;
|
||||
match (
|
||||
win.borrow().wayland_display(),
|
||||
win.borrow().wayland_surface(),
|
||||
win.borrow().get_wayland_display(),
|
||||
win.borrow().get_wayland_surface(),
|
||||
) {
|
||||
(Some(display), Some(surface)) => Surface::from_wayland(instance, display, surface, win),
|
||||
_ => {
|
||||
@ -145,15 +144,15 @@ unsafe fn winit_to_surface<W: SafeBorrow<winit::window::Window>>(
|
||||
if instance.loaded_extensions().khr_xlib_surface {
|
||||
Surface::from_xlib(
|
||||
instance,
|
||||
win.borrow().xlib_display().unwrap(),
|
||||
win.borrow().xlib_window().unwrap() as _,
|
||||
win.borrow().get_xlib_display().unwrap(),
|
||||
win.borrow().get_xlib_window().unwrap() as _,
|
||||
win,
|
||||
)
|
||||
} else {
|
||||
Surface::from_xcb(
|
||||
instance,
|
||||
win.borrow().xcb_connection().unwrap(),
|
||||
win.borrow().xlib_window().unwrap() as _,
|
||||
win.borrow().get_xcb_connection().unwrap(),
|
||||
win.borrow().get_xlib_window().unwrap() as _,
|
||||
win,
|
||||
)
|
||||
}
|
||||
@ -162,25 +161,25 @@ unsafe fn winit_to_surface<W: SafeBorrow<winit::window::Window>>(
|
||||
}
|
||||
|
||||
#[cfg(target_os = "windows")]
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::window::Window>>(
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::Window>>(
|
||||
instance: Arc<Instance>, win: W,
|
||||
) -> Result<Arc<Surface<W>>, SurfaceCreationError> {
|
||||
use winit::platform::windows::WindowExtWindows;
|
||||
use winit::os::windows::WindowExt;
|
||||
Surface::from_hwnd(
|
||||
instance,
|
||||
ptr::null() as *const (), // FIXME
|
||||
win.borrow().hwnd(),
|
||||
win.borrow().get_hwnd(),
|
||||
win,
|
||||
)
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::window::Window>>(
|
||||
unsafe fn winit_to_surface<W: SafeBorrow<winit::Window>>(
|
||||
instance: Arc<Instance>, win: W,
|
||||
) -> Result<Arc<Surface<W>>, SurfaceCreationError> {
|
||||
use winit::platform::macos::WindowExtMacOS;
|
||||
use winit::os::macos::WindowExt;
|
||||
|
||||
let wnd: cocoa_id = mem::transmute(win.borrow().ns_window());
|
||||
let wnd: cocoa_id = mem::transmute(win.borrow().get_nswindow());
|
||||
|
||||
let layer = CoreAnimationLayer::new();
|
||||
|
||||
@ -194,7 +193,7 @@ unsafe fn winit_to_surface<W: SafeBorrow<winit::window::Window>>(
|
||||
view.setLayer(mem::transmute(layer.as_ref())); // Bombs here with out of memory
|
||||
view.setWantsLayer(YES);
|
||||
|
||||
Surface::from_macos_moltenvk(instance, win.borrow().ns_view() as *const (), win)
|
||||
Surface::from_macos_moltenvk(instance, win.borrow().get_nsview() as *const (), win)
|
||||
}
|
||||
|
||||
/// An alternative to `Borrow<T>` with the requirement that all calls to
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "vulkano"
|
||||
version = "0.14.0"
|
||||
version = "0.16.0"
|
||||
authors = ["Pierre Krieger <pierre.krieger1708@gmail.com>", "The vulkano contributors"]
|
||||
repository = "https://github.com/vulkano-rs/vulkano"
|
||||
description = "Safe wrapper for the Vulkan graphics API"
|
||||
@ -18,5 +18,5 @@ fnv = "1.0"
|
||||
shared_library = "0.1"
|
||||
smallvec = "0.6"
|
||||
lazy_static = "1.4"
|
||||
vk-sys = { version = "0.4.0", path = "../vk-sys" }
|
||||
vk-sys = { version = "0.5.0", path = "../vk-sys" }
|
||||
half = "1.4"
|
||||
|
Loading…
Reference in New Issue
Block a user