@ -188,6 +188,8 @@ struct drm_backend { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						void  * repaint_data ;   
					 
					 
					 
						void  * repaint_data ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						bool  state_invalid ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						/* Connector and CRTC IDs not used by any enabled output. */   
					 
					 
					 
						/* Connector and CRTC IDs not used by any enabled output. */   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						struct  wl_array  unused_connectors ;   
					 
					 
					 
						struct  wl_array  unused_connectors ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						struct  wl_array  unused_crtcs ;   
					 
					 
					 
						struct  wl_array  unused_crtcs ;   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -351,8 +353,6 @@ struct drm_output { 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						enum  dpms_enum  dpms ;   
					 
					 
					 
						enum  dpms_enum  dpms ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						struct  backlight  * backlight ;   
					 
					 
					 
						struct  backlight  * backlight ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						bool  state_invalid ;   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						int  vblank_pending ;   
					 
					 
					 
						int  vblank_pending ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						int  page_flip_pending ;   
					 
					 
					 
						int  page_flip_pending ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						int  destroy_pending ;   
					 
					 
					 
						int  destroy_pending ;   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -1751,7 +1751,7 @@ drm_output_repaint(struct weston_output *output_base, 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						assert ( scanout_state - > dest_h  = =  scanout_state - > src_h  > >  16 ) ;   
					 
					 
					 
						assert ( scanout_state - > dest_h  = =  scanout_state - > src_h  > >  16 ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						mode  =  to_drm_mode ( output - > base . current_mode ) ;   
					 
					 
					 
						mode  =  to_drm_mode ( output - > base . current_mode ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						if  ( output - > state_invalid  | |  ! scanout_plane - > state_cur - > fb  | |   
					 
					 
					 
						if  ( backend - > state_invalid  | |  ! scanout_plane - > state_cur - > fb  | |   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
						    scanout_plane - > state_cur - > fb - > stride  ! =  scanout_state - > fb - > stride )  {   
					 
					 
					 
						    scanout_plane - > state_cur - > fb - > stride  ! =  scanout_state - > fb - > stride )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							ret  =  drmModeSetCrtc ( backend - > drm . fd ,  output - > crtc_id ,   
					 
					 
					 
							ret  =  drmModeSetCrtc ( backend - > drm . fd ,  output - > crtc_id ,   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
									     scanout_state - > fb - > fb_id ,   
					 
					 
					 
									     scanout_state - > fb - > fb_id ,   
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -1763,8 +1763,6 @@ drm_output_repaint(struct weston_output *output_base, 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								goto  err ;   
					 
					 
					 
								goto  err ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							}   
					 
					 
					 
							}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							output_base - > set_dpms ( output_base ,  WESTON_DPMS_ON ) ;   
					 
					 
					 
							output_base - > set_dpms ( output_base ,  WESTON_DPMS_ON ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							output - > state_invalid  =  false ;   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}   
					 
					 
					 
						}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						if  ( drmModePageFlip ( backend - > drm . fd ,  output - > crtc_id ,   
					 
					 
					 
						if  ( drmModePageFlip ( backend - > drm . fd ,  output - > crtc_id ,   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -1872,7 +1870,7 @@ drm_output_start_repaint_loop(struct weston_output *output_base) 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						/* Need to smash all state in from scratch; current timings might not
   
					 
					 
					 
						/* Need to smash all state in from scratch; current timings might not
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						 *  be  what  we  want ,  page  flip  might  not  work ,  etc .   
					 
					 
					 
						 *  be  what  we  want ,  page  flip  might  not  work ,  etc .   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						 */   
					 
					 
					 
						 */   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						if  ( output - > state_invalid )   
					 
					 
					 
						if  ( backend - > state_invalid )   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							goto  finish_frame ;   
					 
					 
					 
							goto  finish_frame ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						assert ( scanout_plane - > state_cur - > output  = =  output ) ;   
					 
					 
					 
						assert ( scanout_plane - > state_cur - > output  = =  output ) ;   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -2036,12 +2034,26 @@ drm_repaint_flush(struct weston_compositor *compositor, void *repaint_data) 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						struct  drm_backend  * b  =  to_drm_backend ( compositor ) ;   
					 
					 
					 
						struct  drm_backend  * b  =  to_drm_backend ( compositor ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						struct  drm_pending_state  * pending_state  =  repaint_data ;   
					 
					 
					 
						struct  drm_pending_state  * pending_state  =  repaint_data ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						struct  drm_output_state  * output_state ,  * tmp ;   
					 
					 
					 
						struct  drm_output_state  * output_state ,  * tmp ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						uint32_t  * unused ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						if  ( b - > state_invalid )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							/* If we need to reset all our state (e.g. because we've
   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							 *  just  started ,  or  just  been  VT - switched  in ) ,  explicitly   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							 *  disable  all  the  CRTCs  we  aren ' t  using .  This  also  disables   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							 *  all  connectors  on  these  CRTCs ,  so  we  don ' t  need  to  do  that   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							 *  separately  with  the  pre - atomic  API .  */   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
							wl_array_for_each ( unused ,  & b - > unused_crtcs )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
								drmModeSetCrtc ( b - > drm . fd ,  * unused ,  0 ,  0 ,  0 ,  NULL ,  0 ,   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
									       NULL ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						wl_list_for_each_safe ( output_state ,  tmp ,  & pending_state - > output_list ,   
					 
					 
					 
						wl_list_for_each_safe ( output_state ,  tmp ,  & pending_state - > output_list ,   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								      link )  {   
					 
					 
					 
								      link )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							drm_output_assign_state ( output_state ,  DRM_STATE_APPLY_ASYNC ) ;   
					 
					 
					 
							drm_output_assign_state ( output_state ,  DRM_STATE_APPLY_ASYNC ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}   
					 
					 
					 
						}   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						b - > state_invalid  =  false ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						drm_pending_state_free ( pending_state ) ;   
					 
					 
					 
						drm_pending_state_free ( pending_state ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						b - > repaint_data  =  NULL ;   
					 
					 
					 
						b - > repaint_data  =  NULL ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					}  
					 
					 
					 
					}  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -2662,7 +2674,7 @@ drm_output_switch_mode(struct weston_output *output_base, struct weston_mode *mo 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						 *       sledgehammer  modeswitch  first ,  and  only  later  showing  new   
					 
					 
					 
						 *       sledgehammer  modeswitch  first ,  and  only  later  showing  new   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						 *       content .   
					 
					 
					 
						 *       content .   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						 */   
					 
					 
					 
						 */   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						output - > state_invalid  =  true ;   
					 
					 
					 
						b - > state_invalid  =  true ;   
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						if  ( b - > use_pixman )  {   
					 
					 
					 
						if  ( b - > use_pixman )  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							drm_output_fini_pixman ( output ) ;   
					 
					 
					 
							drm_output_fini_pixman ( output ) ;   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -4003,8 +4015,6 @@ drm_output_enable(struct weston_output *base) 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
									    output - > connector - > count_modes  = =  0  ?   
					 
					 
					 
									    output - > connector - > count_modes  = =  0  ?   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
									    " , built-in "  :  " " ) ;   
					 
					 
					 
									    " , built-in "  :  " " ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						output - > state_invalid  =  true ;   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						return  0 ;   
					 
					 
					 
						return  0 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					err :  
					 
					 
					 
					err :  
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -4523,10 +4533,7 @@ session_notify(struct wl_listener *listener, void *data) 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							weston_log ( " activating session \n " ) ;   
					 
					 
					 
							weston_log ( " activating session \n " ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							weston_compositor_wake ( compositor ) ;   
					 
					 
					 
							weston_compositor_wake ( compositor ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							weston_compositor_damage_all ( compositor ) ;   
					 
					 
					 
							weston_compositor_damage_all ( compositor ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
							b - > state_invalid  =  true ;   
				
			 
			
				
				
			
		
	
		
		
			
				
					
					 
					 
					 
							wl_list_for_each ( output ,  & compositor - > output_list ,  base . link )   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
								output - > state_invalid  =  true ;   
					 
					 
					 
					 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					 
				
			 
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
							udev_input_enable ( & b - > input ) ;   
					 
					 
					 
							udev_input_enable ( & b - > input ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						}  else  {   
					 
					 
					 
						}  else  {   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							weston_log ( " deactivating session \n " ) ;   
					 
					 
					 
							weston_log ( " deactivating session \n " ) ;   
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -4938,6 +4945,7 @@ drm_backend_create(struct weston_compositor *compositor, 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						if  ( b  = =  NULL )   
					 
					 
					 
						if  ( b  = =  NULL )   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
							return  NULL ;   
					 
					 
					 
							return  NULL ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
						b - > state_invalid  =  true ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						b - > drm . fd  =  - 1 ;   
					 
					 
					 
						b - > drm . fd  =  - 1 ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						wl_array_init ( & b - > unused_crtcs ) ;   
					 
					 
					 
						wl_array_init ( & b - > unused_crtcs ) ;   
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
						wl_array_init ( & b - > unused_connectors ) ;   
					 
					 
					 
						wl_array_init ( & b - > unused_connectors ) ;