Révision | 2e93909f5f2bf6f242da4777d4a068d7a8627ca6 (tree) |
---|---|
l'heure | 2020-07-10 14:10:33 |
Auteur | Martin Krošlák <kroslakma@gmai...> |
Commiter | Martin Krošlák |
Fix unhandled swapchain suboptimal results
@@ -65,6 +65,7 @@ | ||
65 | 65 | state: StateBuffer, |
66 | 66 | |
67 | 67 | index_count: u32, |
68 | + recreate_flipchain: bool, | |
68 | 69 | |
69 | 70 | mem_sys: MemorySystem, |
70 | 71 | init_provider: InitProvider, |
@@ -142,6 +142,7 @@ | ||
142 | 142 | state: StateBuffer::default(), |
143 | 143 | |
144 | 144 | index_count: ib_data.len() as u32, |
145 | + recreate_flipchain: false, | |
145 | 146 | |
146 | 147 | mem_sys, |
147 | 148 | init_provider, |
@@ -199,7 +200,7 @@ | ||
199 | 200 | let (flipchain, acquire_result) = match acquire_result { |
200 | 201 | Ok(idx) => (self.flipchain.as_mut().unwrap(), Ok(idx)), |
201 | 202 | Err(vk::Result::ERROR_OUT_OF_DATE_KHR) => { |
202 | - on_window_size_changed( | |
203 | + recreate_flipchain( | |
203 | 204 | &self.device, |
204 | 205 | &self.surface, |
205 | 206 | &mut self.flipchain, |
@@ -208,6 +209,7 @@ | ||
208 | 209 | &self.shaders, |
209 | 210 | &self.init_provider, |
210 | 211 | ); |
212 | + self.recreate_flipchain = false; | |
211 | 213 | |
212 | 214 | match self.flipchain { |
213 | 215 | Some(ref mut flipchain) => { |
@@ -229,7 +231,10 @@ | ||
229 | 231 | Err(result) => panic!("Unexpected result of next image acquire: {:?}", result), |
230 | 232 | }; |
231 | 233 | |
232 | - let (flipchain_frame_idx, _is_suboptimal) = acquire_result.unwrap(); | |
234 | + let (flipchain_frame_idx, is_suboptimal) = acquire_result.unwrap(); | |
235 | + if is_suboptimal { | |
236 | + self.recreate_flipchain = true; | |
237 | + } | |
233 | 238 | |
234 | 239 | let vframe = &mut self.virtual_frames[virtual_frame_idx]; |
235 | 240 | vframe.begin_cb_graphics( |
@@ -272,8 +277,17 @@ | ||
272 | 277 | }; |
273 | 278 | |
274 | 279 | match present_result { |
275 | - Ok(_is_suboptimal) => (), | |
276 | - Err(vk::Result::ERROR_OUT_OF_DATE_KHR) => on_window_size_changed( | |
280 | + Ok(is_suboptimal) => { | |
281 | + if is_suboptimal { | |
282 | + self.recreate_flipchain = true; | |
283 | + } | |
284 | + } | |
285 | + Err(vk::Result::ERROR_OUT_OF_DATE_KHR) => self.recreate_flipchain = true, | |
286 | + Err(result) => panic!("Unexpected result of present: {:?}", result), | |
287 | + }; | |
288 | + | |
289 | + if self.recreate_flipchain { | |
290 | + recreate_flipchain( | |
277 | 291 | &self.device, |
278 | 292 | &self.surface, |
279 | 293 | &mut self.flipchain, |
@@ -281,9 +295,9 @@ | ||
281 | 295 | &mut self.render_pass, |
282 | 296 | &self.shaders, |
283 | 297 | &self.init_provider, |
284 | - ), | |
285 | - Err(result) => panic!("Unexpected result of present: {:?}", result), | |
286 | - }; | |
298 | + ); | |
299 | + self.recreate_flipchain = false; | |
300 | + } | |
287 | 301 | } |
288 | 302 | |
289 | 303 | fn begin_2d_rendering( |
@@ -524,7 +538,7 @@ | ||
524 | 538 | } |
525 | 539 | } |
526 | 540 | |
527 | -fn on_window_size_changed( | |
541 | +fn recreate_flipchain( | |
528 | 542 | device: &api::Device, |
529 | 543 | surface: &api::SurfaceKHR, |
530 | 544 | flipchain: &mut Option<Flipchain>, |
@@ -0,0 +1,6 @@ | ||
1 | +#!/bin/bash | |
2 | +set -e | |
3 | +cargo build --workspace | |
4 | +export VK_INSTANCE_LAYERS=VK_LAYER_KHRONOS_validation | |
5 | +export MEL_MODULE_PATH_BASE=target/debug | |
6 | +gdb -q target/debug/game |