@ -1750,26 +1750,11 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state, 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									struct  weston_view  * ev )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					{  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						struct  drm_output  * output  =  output_state - > output ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						struct  drm_backend  * b  =  to_drm_backend ( output - > base . compositor ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						struct  drm_plane  * scanout_plane  =  output - > scanout_plane ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						struct  drm_plane_state  * state ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						struct  weston_buffer  * buffer  =  ev - > surface - > buffer_ref . buffer ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						struct  gbm_bo  * bo ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						struct  drm_fb  * fb ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						pixman_box32_t  * extents ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						/* Don't import buffers which span multiple outputs. */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( ev - > output_mask  ! =  ( 1u  < <  output - > base . id ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						/* We use GBM to import buffers. */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( b - > gbm  = =  NULL )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( buffer  = =  NULL )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( wl_shm_buffer_get ( buffer - > resource ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						/* Check the view spans exactly the output size, calculated in the
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						 *  logical  co - ordinate  space .  */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						extents  =  pixman_region32_extents ( & ev - > transform . boundingbox ) ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -1782,15 +1767,27 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state, 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( ev - > alpha  ! =  1.0f )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						fb  =  drm_fb_get_from_view ( output_state ,  ev ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( ! fb )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						/* Can't change formats with just a pageflip */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( fb - > format - > format  ! =  output - > gbm_format )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							drm_fb_unref ( fb ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						state  =  drm_output_state_get_plane ( output_state ,  scanout_plane ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( state - > fb )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/* If there is already a framebuffer on the scanout plane,
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							 *  a  client  view  has  already  been  placed  on  the  scanout   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							 *  view .  In  that  case ,  do  not  free  or  put  back  the  state ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							 *  but  just  leave  it  in  place  and  quietly  exit .  */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							drm_fb_unref ( fb ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							return  NULL ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						state - > fb  =  fb ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						state - > output  =  output ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( ! drm_plane_state_coords_for_view ( state ,  ev ) )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							goto  err ;   
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -1804,30 +1801,6 @@ drm_output_prepare_scanout_view(struct drm_output_state *output_state, 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						    state - > dest_h  ! =  ( unsigned )  output - > base . current_mode - > height )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							goto  err ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						bo  =  gbm_bo_import ( b - > gbm ,  GBM_BO_IMPORT_WL_BUFFER ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
								   buffer - > resource ,  GBM_BO_USE_SCANOUT ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						/* Unable to use the buffer for scanout */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( ! bo )   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							goto  err ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						state - > fb  =  drm_fb_get_from_bo ( bo ,  b ,  drm_view_is_opaque ( ev ) ,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
									       BUFFER_CLIENT ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( ! state - > fb )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/* We need to explicitly destroy the BO. */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							gbm_bo_destroy ( bo ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							goto  err ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						/* Can't change formats with just a pageflip */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						if  ( state - > fb - > format - > format  ! =  output - > gbm_format )  {   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							/* No need to destroy the GBM BO here, as it's now owned
   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							 *  by  the  FB .  */   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
							goto  err ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						}   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						drm_fb_set_buffer ( state - > fb ,  buffer ) ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
						return  & scanout_plane - > base ;   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					err :