| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -41,12 +41,17 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include "presentation-time-server-protocol.h" | 
					 | 
					 | 
					 | 
					#include "presentation-time-server-protocol.h" | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					#include <libweston/windowed-output-api.h> | 
					 | 
					 | 
					 | 
					#include <libweston/windowed-output-api.h> | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					enum headless_renderer_type { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						HEADLESS_NOOP, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						HEADLESS_PIXMAN, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					struct headless_backend { | 
					 | 
					 | 
					 | 
					struct headless_backend { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						struct weston_backend base; | 
					 | 
					 | 
					 | 
						struct weston_backend base; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						struct weston_compositor *compositor; | 
					 | 
					 | 
					 | 
						struct weston_compositor *compositor; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						struct weston_seat fake_seat; | 
					 | 
					 | 
					 | 
						struct weston_seat fake_seat; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						bool use_pixman; | 
					 | 
					 | 
					 | 
						enum headless_renderer_type renderer_type; | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					}; | 
					 | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					struct headless_head { | 
					 | 
					 | 
					 | 
					struct headless_head { | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -140,8 +145,13 @@ headless_output_disable(struct weston_output *base) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						wl_event_source_remove(output->finish_frame_timer); | 
					 | 
					 | 
					 | 
						wl_event_source_remove(output->finish_frame_timer); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (b->use_pixman) | 
					 | 
					 | 
					 | 
						switch (b->renderer_type) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						case HEADLESS_PIXMAN: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							headless_output_disable_pixman(output); | 
					 | 
					 | 
					 | 
							headless_output_disable_pixman(output); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						case HEADLESS_NOOP: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						return 0; | 
					 | 
					 | 
					 | 
						return 0; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					} | 
					 | 
					 | 
					 | 
					} | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -198,8 +208,13 @@ headless_output_enable(struct weston_output *base) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						output->finish_frame_timer = | 
					 | 
					 | 
					 | 
						output->finish_frame_timer = | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							wl_event_loop_add_timer(loop, finish_frame_handler, output); | 
					 | 
					 | 
					 | 
							wl_event_loop_add_timer(loop, finish_frame_handler, output); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (b->use_pixman) | 
					 | 
					 | 
					 | 
						switch (b->renderer_type) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						case HEADLESS_PIXMAN: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							ret = headless_output_enable_pixman(output); | 
					 | 
					 | 
					 | 
							ret = headless_output_enable_pixman(output); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						case HEADLESS_NOOP: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (ret < 0) { | 
					 | 
					 | 
					 | 
						if (ret < 0) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							wl_event_source_remove(output->finish_frame_timer); | 
					 | 
					 | 
					 | 
							wl_event_source_remove(output->finish_frame_timer); | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -349,12 +364,21 @@ headless_backend_create(struct weston_compositor *compositor, | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						b->base.destroy = headless_destroy; | 
					 | 
					 | 
					 | 
						b->base.destroy = headless_destroy; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						b->base.create_output = headless_output_create; | 
					 | 
					 | 
					 | 
						b->base.create_output = headless_output_create; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						b->use_pixman = config->use_pixman; | 
					 | 
					 | 
					 | 
						if (config->use_pixman) | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (b->use_pixman) { | 
					 | 
					 | 
					 | 
							b->renderer_type = HEADLESS_PIXMAN; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							pixman_renderer_init(compositor); | 
					 | 
					 | 
					 | 
						else | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							b->renderer_type = HEADLESS_NOOP; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						switch (b->renderer_type) { | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						case HEADLESS_PIXMAN: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							ret = pixman_renderer_init(compositor); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
						case HEADLESS_NOOP: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							ret = noop_renderer_init(compositor); | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
							break; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						} | 
					 | 
					 | 
					 | 
						} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						if (!b->use_pixman && noop_renderer_init(compositor) < 0) | 
					 | 
					 | 
					 | 
						if (ret < 0) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
							goto err_input; | 
					 | 
					 | 
					 | 
							goto err_input; | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
						/* Support zwp_linux_explicit_synchronization_unstable_v1 to enable
 | 
					 | 
					 | 
					 | 
						/* Support zwp_linux_explicit_synchronization_unstable_v1 to enable
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |