|  |  |  | @ -353,15 +353,6 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, | 
			
		
	
		
			
				
					|  |  |  |  | 	int width, height; | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_output_transformed_resolution(output, &width, &height); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_t render_damage; | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_init(&render_damage); | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_union_rect(&render_damage, &render_damage, 0, 0, | 
			
		
	
		
			
				
					|  |  |  |  | 		width, height); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (damage != NULL) { | 
			
		
	
		
			
				
					|  |  |  |  | 		// Damage tracking supported
 | 
			
		
	
		
			
				
					|  |  |  |  | 		pixman_region32_intersect(&render_damage, &render_damage, damage); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct timespec now; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (when == NULL) { | 
			
		
	
		
			
				
					|  |  |  |  | 		clock_gettime(CLOCK_MONOTONIC, &now); | 
			
		
	
	
		
			
				
					|  |  |  | @ -375,18 +366,29 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, | 
			
		
	
		
			
				
					|  |  |  |  | 	}; | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_signal_emit_safe(&output->events.swap_buffers, &event); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_t render_damage; | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_init(&render_damage); | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_union_rect(&render_damage, &render_damage, 0, 0, | 
			
		
	
		
			
				
					|  |  |  |  | 		width, height); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (damage != NULL) { | 
			
		
	
		
			
				
					|  |  |  |  | 		// Damage tracking supported
 | 
			
		
	
		
			
				
					|  |  |  |  | 		pixman_region32_intersect(&render_damage, &render_damage, damage); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Transform damage into renderer coordinates, ie. upside down
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// TODO: take transformed coords, make the renderer flip the damage
 | 
			
		
	
		
			
				
					|  |  |  |  | 	enum wl_output_transform transform = wlr_output_transform_compose( | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_output_transform_invert(output->transform), | 
			
		
	
		
			
				
					|  |  |  |  | 		WL_OUTPUT_TRANSFORM_FLIPPED_180); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_region_transform(&render_damage, &render_damage, transform, width, | 
			
		
	
		
			
				
					|  |  |  |  | 		height); | 
			
		
	
		
			
				
					|  |  |  |  | 	enum wl_output_transform transform = | 
			
		
	
		
			
				
					|  |  |  |  | 		wlr_output_transform_invert(output->transform); | 
			
		
	
		
			
				
					|  |  |  |  | 	wlr_region_transform(&render_damage, &render_damage, transform, | 
			
		
	
		
			
				
					|  |  |  |  | 		width, height); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!output->impl->swap_buffers(output, damage ? &render_damage : NULL)) { | 
			
		
	
		
			
				
					|  |  |  |  | 		pixman_region32_fini(&render_damage); | 
			
		
	
		
			
				
					|  |  |  |  | 		return false; | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_fini(&render_damage); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	struct wlr_output_cursor *cursor; | 
			
		
	
		
			
				
					|  |  |  |  | 	wl_list_for_each(cursor, &output->cursors, link) { | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!cursor->enabled || !cursor->visible || cursor->surface == NULL) { | 
			
		
	
	
		
			
				
					|  |  |  | @ -398,8 +400,6 @@ bool wlr_output_swap_buffers(struct wlr_output *output, struct timespec *when, | 
			
		
	
		
			
				
					|  |  |  |  | 	output->frame_pending = true; | 
			
		
	
		
			
				
					|  |  |  |  | 	output->needs_swap = false; | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_clear(&output->damage); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	pixman_region32_fini(&render_damage); | 
			
		
	
		
			
				
					|  |  |  |  | 	return true; | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
	
		
			
				
					|  |  |  | 
 |