Added a .boxed() function to GpuFuture to reduce boilerplate code (#1362)

This commit is contained in:
Trangar 2020-05-13 01:05:09 +02:00 committed by GitHub
parent 15b4a955f7
commit df493136cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 49 additions and 40 deletions

View File

@ -4,6 +4,7 @@
- `dynamic-local-size` compute shader example added showing how to utilize `subgroupSize` to compute and set shader's local size in run time. - `dynamic-local-size` compute shader example added showing how to utilize `subgroupSize` to compute and set shader's local size in run time.
- Fixed Vulkano Shaders bug when compute shader local group layout values bound to specialization constants. Now it is possible to define the layout in form of `layout(local_size_x_id = 12, local_size_y_id = 13, local_size_z = 1) in;` and then set the values as `SpecializationConstants {constant_12: 8, constant_13: 4, ...}`. - Fixed Vulkano Shaders bug when compute shader local group layout values bound to specialization constants. Now it is possible to define the layout in form of `layout(local_size_x_id = 12, local_size_y_id = 13, local_size_z = 1) in;` and then set the values as `SpecializationConstants {constant_12: 8, constant_13: 4, ...}`.
- Allow applications to access the instance and device pointers - Allow applications to access the instance and device pointers
- Add a helper function '.boxed()' on the `GpuFuture` that is short for `Box::new(yourFuture) as Box<dyn GpuFuture>`
# Version 0.18.0 (2020-03-11) # Version 0.18.0 (2020-03-11)

View File

@ -189,7 +189,7 @@ fn main() {
let mut framebuffers = let mut framebuffers =
window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state); window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
let mut recreate_swapchain = false; 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 = Some(sync::now(device.clone()).boxed());
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
match event { match event {

View File

@ -113,7 +113,7 @@ fn main() {
TriangleDrawSystem::new(queue.clone(), frame_system.deferred_subpass()); TriangleDrawSystem::new(queue.clone(), frame_system.deferred_subpass());
let mut recreate_swapchain = false; 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 = Some(sync::now(device.clone()).boxed());
event_loop.run(move |event, _, control_flow| match event { event_loop.run(move |event, _, control_flow| match event {
Event::WindowEvent { Event::WindowEvent {
@ -189,15 +189,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -220,7 +220,7 @@ fn main() {
window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state); window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
let mut recreate_swapchain = false; let mut recreate_swapchain = false;
let mut previous_frame_end = Some(Box::new(tex_future) as Box<dyn GpuFuture>); let mut previous_frame_end = Some(tex_future.boxed());
event_loop.run(move |event, _, control_flow| match event { event_loop.run(move |event, _, control_flow| match event {
Event::WindowEvent { Event::WindowEvent {
@ -300,15 +300,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -252,7 +252,7 @@ fn main() {
let mut framebuffers = let mut framebuffers =
window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state); window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
let mut recreate_swapchain = false; 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 = Some(sync::now(device.clone()).boxed());
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
match event { match event {
@ -377,15 +377,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -260,7 +260,7 @@ fn main() {
let mut framebuffers = let mut framebuffers =
window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state); window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state);
let mut recreate_swapchain = false; 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 = Some(sync::now(device.clone()).boxed());
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
match event { match event {
@ -345,15 +345,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -237,7 +237,7 @@ fn main() {
render_pass.clone(), render_pass.clone(),
&mut dynamic_state, &mut dynamic_state,
), ),
previous_frame_end: Some(Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>), previous_frame_end: Some(sync::now(device.clone()).boxed()),
}, },
); );
@ -314,9 +314,7 @@ fn main() {
render_pass.clone(), render_pass.clone(),
&mut dynamic_state, &mut dynamic_state,
), ),
previous_frame_end: Some( previous_frame_end: Some(sync::now(device.clone()).boxed()),
Box::new(sync::now(device.clone())) as Box<dyn GpuFuture>
),
}, },
); );
} }
@ -399,15 +397,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
*previous_frame_end = Some(Box::new(future) as Box<_>); *previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
*recreate_swapchain = true; *recreate_swapchain = true;
*previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); *previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
*previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); *previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -467,7 +467,7 @@ fn main() {
}; };
let mut framebuffers = let mut framebuffers =
window_size_dependent_setup(&images, render_pass.clone(), &mut dynamic_state); 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 = Some(sync::now(device.clone()).boxed());
event_loop.run(move |event, _, control_flow| match event { event_loop.run(move |event, _, control_flow| match event {
Event::WindowEvent { Event::WindowEvent {
@ -546,15 +546,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -152,7 +152,7 @@ fn main() {
window_size_dependent_setup(device.clone(), &vs, &fs, &images, render_pass.clone()); window_size_dependent_setup(device.clone(), &vs, &fs, &images, render_pass.clone());
let mut recreate_swapchain = false; 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 = Some(sync::now(device.clone()).boxed());
let rotation_start = Instant::now(); let rotation_start = Instant::now();
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
@ -284,15 +284,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -286,7 +286,7 @@ fn main() {
); );
let mut recreate_swapchain = false; 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 = Some(sync::now(device.clone()).boxed());
let mut dynamic_state = DynamicState { let mut dynamic_state = DynamicState {
line_width: None, line_width: None,
viewports: None, viewports: None,
@ -379,15 +379,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -364,7 +364,7 @@ fn main() {
// //
// Destroying the `GpuFuture` blocks until the GPU is finished executing it. In order to avoid // 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. // 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>); let mut previous_frame_end = Some(sync::now(device.clone()).boxed());
event_loop.run(move |event, _, control_flow| { event_loop.run(move |event, _, control_flow| {
match event { match event {
@ -500,15 +500,15 @@ fn main() {
match future { match future {
Ok(future) => { Ok(future) => {
previous_frame_end = Some(Box::new(future) as Box<_>); previous_frame_end = Some(future.boxed());
} }
Err(FlushError::OutOfDate) => { Err(FlushError::OutOfDate) => {
recreate_swapchain = true; recreate_swapchain = true;
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
Err(e) => { Err(e) => {
println!("Failed to flush future: {:?}", e); println!("Failed to flush future: {:?}", e);
previous_frame_end = Some(Box::new(sync::now(device.clone())) as Box<_>); previous_frame_end = Some(sync::now(device.clone()).boxed());
} }
} }
} }

View File

@ -283,6 +283,16 @@ pub unsafe trait GpuFuture: DeviceOwned {
{ {
swapchain::present_incremental(swapchain, self, queue, image_index, present_region) swapchain::present_incremental(swapchain, self, queue, image_index, present_region)
} }
/// Turn the current future into a `Box<dyn GpuFuture>`.
///
/// This is a helper function that calls `Box::new(yourFuture) as Box<dyn GpuFuture>`.
fn boxed(self) -> Box<dyn GpuFuture>
where
Self: Sized + 'static,
{
Box::new(self) as _
}
} }
unsafe impl<F: ?Sized> GpuFuture for Box<F> unsafe impl<F: ?Sized> GpuFuture for Box<F>