@@ -485,6 +485,14 @@ impl<T> App<T> {
485
485
// If there is a re-render necessary, re-render *all* windows
486
486
if should_rerender_all_windows {
487
487
for ( current_window_id, mut window) in self . windows . iter_mut ( ) {
488
+ // TODO: For some reason this function has to be called twice in order
489
+ // to actually update the screen. For some reason the first swap_buffers() has
490
+ // no effect (winit bug?)
491
+ rerender_single_window (
492
+ & self . config ,
493
+ & mut window,
494
+ & mut self . app_state . resources ,
495
+ ) ;
488
496
rerender_single_window (
489
497
& self . config ,
490
498
& mut window,
@@ -675,7 +683,7 @@ fn hit_test_single_window<T>(
675
683
new_focus_target : None ,
676
684
} ;
677
685
678
- if events. is_empty ( ) || !ret. should_relayout ( ) {
686
+ if events. is_empty ( ) && !ret. should_relayout ( ) && !ret . should_rerender ( ) {
679
687
// Event was not a resize event, window should **not** close
680
688
ret. window_should_close = window_should_close;
681
689
return Ok ( ret) ;
@@ -721,7 +729,7 @@ fn hit_test_single_window<T>(
721
729
722
730
// Scroll for the scrolled amount for each node that registered a scroll state.
723
731
let should_scroll_render = match & ret. hit_test_results {
724
- Some ( hit_test_results) => update_scroll_state ( window, hit_test_results, & mut app_state . resources ) ,
732
+ Some ( hit_test_results) => update_scroll_state ( window, hit_test_results) ,
725
733
None => false ,
726
734
} ;
727
735
@@ -826,10 +834,11 @@ fn hot_reload_css<T>(
826
834
windows : & mut BTreeMap < GliumWindowId , Window < T > > ,
827
835
last_style_reload : & mut Instant ,
828
836
should_print_error : & mut bool ,
829
- awakened_tasks : & mut BTreeMap < GliumWindowId , bool > )
830
- -> Result < ( ) , RuntimeError < T > >
831
- {
837
+ awakened_tasks : & mut BTreeMap < GliumWindowId , bool > ,
838
+ ) -> Result < ( ) , RuntimeError < T > > {
839
+
832
840
use self :: RuntimeError :: * ;
841
+
833
842
for ( window_id, window) in windows. iter_mut ( ) {
834
843
// Hot-reload a style if necessary
835
844
let hot_reloader = match window. css_loader . as_mut ( ) {
@@ -914,8 +923,8 @@ fn call_callbacks<T>(
914
923
window_id : & GliumWindowId ,
915
924
ui_state : & UiState < T > ,
916
925
app_state : & mut AppState < T > )
917
- -> Result < CallCallbackReturn , RuntimeError < T > >
918
- {
926
+ -> Result < CallCallbackReturn , RuntimeError < T > > {
927
+
919
928
use {
920
929
callbacks:: CallbackInfo ,
921
930
window_state:: { KeyboardState , MouseState } ,
@@ -1102,7 +1111,6 @@ fn convert_window_size(size: &WindowSize) -> (LayoutSize, DeviceIntSize) {
1102
1111
fn update_scroll_state < T > (
1103
1112
window : & mut Window < T > ,
1104
1113
hit_test_results : & HitTestResult ,
1105
- app_resources : & mut AppResources ,
1106
1114
) -> bool {
1107
1115
1108
1116
const SCROLL_THRESHOLD : f64 = 0.5 ; // px
@@ -1271,7 +1279,7 @@ fn render_inner<T>(
1271
1279
gl_context. draw_buffers ( & [ gl:: COLOR_ATTACHMENT0 ] ) ;
1272
1280
1273
1281
// Check that the framebuffer is complete
1274
- assert_eq ! ( gl_context. check_frame_buffer_status( gl:: FRAMEBUFFER ) , gl:: FRAMEBUFFER_COMPLETE ) ;
1282
+ debug_assert ! ( gl_context. check_frame_buffer_status( gl:: FRAMEBUFFER ) == gl:: FRAMEBUFFER_COMPLETE ) ;
1275
1283
1276
1284
// Invoke WebRender to render the frame - renders to the currently bound FB
1277
1285
gl_context. clear_color ( background_color_f. r , background_color_f. g , background_color_f. b , background_color_f. a ) ;
@@ -1290,8 +1298,7 @@ fn render_inner<T>(
1290
1298
// FBOs can't be shared between windows, but textures can.
1291
1299
// In order to draw on the windows backbuffer, first make the window current, then draw to FB 0
1292
1300
window. display . gl_window ( ) . make_current ( ) . unwrap ( ) ;
1293
- let window_context = get_gl_context ( & window. display ) . unwrap ( ) ;
1294
- draw_texture_to_screen ( & * window_context, textures[ 0 ] , framebuffer_size) ;
1301
+ draw_texture_to_screen ( & * gl_context, textures[ 0 ] , framebuffer_size) ;
1295
1302
window. display . swap_buffers ( ) . unwrap ( ) ;
1296
1303
1297
1304
app_resources. fake_display . hidden_display . gl_window ( ) . make_current ( ) . unwrap ( ) ;
@@ -1355,36 +1362,43 @@ fn compile_screen_shader(context: &Gl) -> GLuint {
1355
1362
let vertex_shader_object = context. create_shader ( gl:: VERTEX_SHADER ) ;
1356
1363
context. shader_source ( vertex_shader_object, & [ DISPLAY_VERTEX_SHADER ] ) ;
1357
1364
context. compile_shader ( vertex_shader_object) ;
1358
- if get_gl_shader_error ( context, vertex_shader_object) {
1359
- let err = context. get_shader_info_log ( vertex_shader_object) ;
1360
- context. delete_shader ( vertex_shader_object) ;
1361
- panic ! ( "VS compile error: {}" , err) ;
1365
+
1366
+ #[ cfg( debug_assertions) ] {
1367
+ if get_gl_shader_error ( context, vertex_shader_object) {
1368
+ let err = context. get_shader_info_log ( vertex_shader_object) ;
1369
+ context. delete_shader ( vertex_shader_object) ;
1370
+ panic ! ( "VS compile error: {}" , err) ;
1371
+ }
1362
1372
}
1363
1373
1364
1374
let fragment_shader_object = context. create_shader ( gl:: FRAGMENT_SHADER ) ;
1365
1375
context. shader_source ( fragment_shader_object, & [ DISPLAY_FRAGMENT_SHADER ] ) ;
1366
1376
context. compile_shader ( fragment_shader_object) ;
1367
- if get_gl_shader_error ( context, fragment_shader_object) {
1368
- let err = context. get_shader_info_log ( fragment_shader_object) ;
1369
- context. delete_shader ( vertex_shader_object) ;
1370
- context. delete_shader ( fragment_shader_object) ;
1371
- panic ! ( "FS compile error: {}" , err) ;
1377
+
1378
+ #[ cfg( debug_assertions) ] {
1379
+ if get_gl_shader_error ( context, fragment_shader_object) {
1380
+ let err = context. get_shader_info_log ( fragment_shader_object) ;
1381
+ context. delete_shader ( vertex_shader_object) ;
1382
+ context. delete_shader ( fragment_shader_object) ;
1383
+ panic ! ( "FS compile error: {}" , err) ;
1384
+ }
1372
1385
}
1373
1386
1374
1387
let program = context. create_program ( ) ;
1375
1388
context. attach_shader ( program, vertex_shader_object) ;
1376
1389
context. attach_shader ( program, fragment_shader_object) ;
1377
1390
context. link_program ( program) ;
1378
- if get_gl_program_error ( context, program) {
1379
- let err = context. get_program_info_log ( program) ;
1380
- context. delete_shader ( vertex_shader_object) ;
1381
- context. delete_shader ( fragment_shader_object) ;
1382
- context. delete_program ( program) ;
1383
- panic ! ( "Program link error: {}" , err) ;
1391
+
1392
+ #[ cfg( debug_assertions) ] {
1393
+ if get_gl_program_error ( context, program) {
1394
+ let err = context. get_program_info_log ( program) ;
1395
+ context. delete_shader ( vertex_shader_object) ;
1396
+ context. delete_shader ( fragment_shader_object) ;
1397
+ context. delete_program ( program) ;
1398
+ panic ! ( "Program link error: {}" , err) ;
1399
+ }
1384
1400
}
1385
1401
1386
- // context.detach_shader(program, vertex_shader_object);
1387
- // context.detach_shader(program, fragment_shader_object);
1388
1402
context. delete_shader ( vertex_shader_object) ;
1389
1403
context. delete_shader ( fragment_shader_object) ;
1390
1404
@@ -1394,12 +1408,14 @@ fn compile_screen_shader(context: &Gl) -> GLuint {
1394
1408
}
1395
1409
1396
1410
// Returns true on error, false otherwise
1411
+ #[ cfg( debug_assertions) ]
1397
1412
fn get_gl_shader_error ( context : & Gl , shader_object : GLuint ) -> bool {
1398
1413
let mut err = [ 0 ] ;
1399
1414
unsafe { context. get_shader_iv ( shader_object, gl:: COMPILE_STATUS , & mut err) } ;
1400
1415
err[ 0 ] == 0
1401
1416
}
1402
1417
1418
+ #[ cfg( debug_assertions) ]
1403
1419
fn get_gl_program_error ( context : & Gl , shader_object : GLuint ) -> bool {
1404
1420
let mut err = [ 0 ] ;
1405
1421
unsafe { context. get_program_iv ( shader_object, gl:: LINK_STATUS , & mut err) } ;
0 commit comments