mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-10-29 05:40:12 -04:00 
			
		
		
		
	backend/wayland: allow superseding a previous commit
During a modeset, the core wlr_output logic will allocate a buffer with a new size and commit it. However if we still have a frame callback pending we'd refuse to perform the commit. This is inconsistent with the DRM backend, which performs a blocking modeset. This is visible when resizing the Wayland toplevel. The logs are filled with "Skipping buffer swap", and the wlr_damage_ring's bounds are not properly updated. Fix this by destroying the pending frame wl_callback.
This commit is contained in:
		
							parent
							
								
									92eedb84c1
								
							
						
					
					
						commit
						2e49fa1a0a
					
				
					 1 changed files with 7 additions and 4 deletions
				
			
		|  | @ -43,7 +43,12 @@ static struct wlr_wl_output *get_wl_output_from_output( | |||
| static void surface_frame_callback(void *data, struct wl_callback *cb, | ||||
| 		uint32_t time) { | ||||
| 	struct wlr_wl_output *output = data; | ||||
| 	assert(output); | ||||
| 
 | ||||
| 	if (cb == NULL) { | ||||
| 		return; | ||||
| 	} | ||||
| 
 | ||||
| 	assert(output->frame_callback == cb); | ||||
| 	wl_callback_destroy(cb); | ||||
| 	output->frame_callback = NULL; | ||||
| 
 | ||||
|  | @ -300,10 +305,8 @@ static bool output_commit(struct wlr_output *wlr_output, | |||
| 		} | ||||
| 
 | ||||
| 		if (output->frame_callback != NULL) { | ||||
| 			wlr_log(WLR_ERROR, "Skipping buffer swap"); | ||||
| 			return false; | ||||
| 			wl_callback_destroy(output->frame_callback); | ||||
| 		} | ||||
| 
 | ||||
| 		output->frame_callback = wl_surface_frame(output->surface); | ||||
| 		wl_callback_add_listener(output->frame_callback, &frame_listener, output); | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Simon Ser
						Simon Ser