scene: fix wlr_scene_send_frame_done() API
This doesn't work if scene outputs are not used as the primary output of scene surfaces will always be NULL. Therefore, take a wlr_scene_output instead of separate wlr_scene and wlr_output arguments and rename the function to wlr_scene_output_send_frame_done(). The actual behavior of the function is unchanged.
This commit is contained in:
		
							parent
							
								
									ad01cdf0b2
								
							
						
					
					
						commit
						1c3e0816f3
					
				|  | @ -201,13 +201,6 @@ struct wlr_scene *wlr_scene_create(void); | ||||||
|  */ |  */ | ||||||
| void wlr_scene_render_output(struct wlr_scene *scene, struct wlr_output *output, | void wlr_scene_render_output(struct wlr_scene *scene, struct wlr_output *output, | ||||||
| 	int lx, int ly, pixman_region32_t *damage); | 	int lx, int ly, pixman_region32_t *damage); | ||||||
| /**
 |  | ||||||
|  * Call wlr_surface_send_frame_done() on all surfaces in the scene rendered by |  | ||||||
|  * wlr_scene_render_output() for which wlr_scene_surface->primary_output |  | ||||||
|  * matches the given output. |  | ||||||
|  */ |  | ||||||
| void wlr_scene_send_frame_done(struct wlr_scene *scene, |  | ||||||
| 	struct wlr_output *output, struct timespec *now); |  | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  * Add a node displaying nothing but its children. |  * Add a node displaying nothing but its children. | ||||||
|  | @ -295,7 +288,13 @@ void wlr_scene_output_set_position(struct wlr_scene_output *scene_output, | ||||||
|  * Render and commit an output. |  * Render and commit an output. | ||||||
|  */ |  */ | ||||||
| bool wlr_scene_output_commit(struct wlr_scene_output *scene_output); | bool wlr_scene_output_commit(struct wlr_scene_output *scene_output); | ||||||
| 
 | /**
 | ||||||
|  |  * Call wlr_surface_send_frame_done() on all surfaces in the scene rendered by | ||||||
|  |  * wlr_scene_output_commit() for which wlr_scene_surface->primary_output | ||||||
|  |  * matches the given scene_output. | ||||||
|  |  */ | ||||||
|  | void wlr_scene_output_send_frame_done(struct wlr_scene_output *scene_output, | ||||||
|  | 	struct timespec *now); | ||||||
| /**
 | /**
 | ||||||
|  * Call `iterator` on each surface in the scene-graph visible on the output, |  * Call `iterator` on each surface in the scene-graph visible on the output, | ||||||
|  * with the surface's position in layout coordinates. The function is called |  * with the surface's position in layout coordinates. The function is called | ||||||
|  |  | ||||||
|  | @ -524,7 +524,7 @@ static void output_frame(struct wl_listener *listener, void *data) { | ||||||
| 
 | 
 | ||||||
| 	struct timespec now; | 	struct timespec now; | ||||||
| 	clock_gettime(CLOCK_MONOTONIC, &now); | 	clock_gettime(CLOCK_MONOTONIC, &now); | ||||||
| 	wlr_scene_send_frame_done(scene, output->wlr_output, &now); | 	wlr_scene_output_send_frame_done(scene_output, &now); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void server_new_output(struct wl_listener *listener, void *data) { | static void server_new_output(struct wl_listener *listener, void *data) { | ||||||
|  |  | ||||||
|  | @ -876,31 +876,6 @@ void wlr_scene_render_output(struct wlr_scene *scene, struct wlr_output *output, | ||||||
| 	pixman_region32_fini(&full_region); | 	pixman_region32_fini(&full_region); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void scene_send_frame_done_iterator(struct wlr_scene_node *node, |  | ||||||
| 		struct wlr_output *output, struct timespec *now) { |  | ||||||
| 	if (!node->state.enabled) { |  | ||||||
| 		return; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	if (node->type == WLR_SCENE_NODE_SURFACE) { |  | ||||||
| 		struct wlr_scene_surface *scene_surface = |  | ||||||
| 			wlr_scene_surface_from_node(node); |  | ||||||
| 		if (scene_surface->primary_output == output) { |  | ||||||
| 			wlr_surface_send_frame_done(scene_surface->surface, now); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	struct wlr_scene_node *child; |  | ||||||
| 	wl_list_for_each(child, &node->state.children, state.link) { |  | ||||||
| 		scene_send_frame_done_iterator(child, output, now); |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void wlr_scene_send_frame_done(struct wlr_scene *scene, |  | ||||||
| 		struct wlr_output *output, struct timespec *now) { |  | ||||||
| 	scene_send_frame_done_iterator(&scene->node, output, now); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void scene_output_handle_destroy(struct wlr_addon *addon) { | static void scene_output_handle_destroy(struct wlr_addon *addon) { | ||||||
| 	struct wlr_scene_output *scene_output = | 	struct wlr_scene_output *scene_output = | ||||||
| 		wl_container_of(addon, scene_output, addon); | 		wl_container_of(addon, scene_output, addon); | ||||||
|  | @ -1121,6 +1096,32 @@ bool wlr_scene_output_commit(struct wlr_scene_output *scene_output) { | ||||||
| 	return wlr_output_commit(output); | 	return wlr_output_commit(output); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void scene_output_send_frame_done_iterator(struct wlr_scene_node *node, | ||||||
|  | 		struct wlr_output *output, struct timespec *now) { | ||||||
|  | 	if (!node->state.enabled) { | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (node->type == WLR_SCENE_NODE_SURFACE) { | ||||||
|  | 		struct wlr_scene_surface *scene_surface = | ||||||
|  | 			wlr_scene_surface_from_node(node); | ||||||
|  | 		if (scene_surface->primary_output == output) { | ||||||
|  | 			wlr_surface_send_frame_done(scene_surface->surface, now); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	struct wlr_scene_node *child; | ||||||
|  | 	wl_list_for_each(child, &node->state.children, state.link) { | ||||||
|  | 		scene_output_send_frame_done_iterator(child, output, now); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void wlr_scene_output_send_frame_done(struct wlr_scene_output *scene_output, | ||||||
|  | 		struct timespec *now) { | ||||||
|  | 	scene_output_send_frame_done_iterator(&scene_output->scene->node, | ||||||
|  | 		scene_output->output, now); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void scene_output_for_each_surface(const struct wlr_box *output_box, | static void scene_output_for_each_surface(const struct wlr_box *output_box, | ||||||
| 		struct wlr_scene_node *node, int lx, int ly, | 		struct wlr_scene_node *node, int lx, int ly, | ||||||
| 		wlr_surface_iterator_func_t user_iterator, void *user_data) { | 		wlr_surface_iterator_func_t user_iterator, void *user_data) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue