Add post_frame event to wlr_output, use wlr_drm_plane_make_current in wlr_drm_output_read_pixels
This commit is contained in:
		
							parent
							
								
									35f9700251
								
							
						
					
					
						commit
						d0db6a80ab
					
				| 
						 | 
				
			
			@ -636,9 +636,9 @@ static bool wlr_drm_connector_move_cursor(struct wlr_output *output,
 | 
			
		|||
 | 
			
		||||
static void wlr_drm_connector_read_pixels(struct wlr_output *_output,
 | 
			
		||||
		void *out_data) {
 | 
			
		||||
	struct wlr_drm_output *output = (struct wlr_drm_output *)_output;
 | 
			
		||||
	struct wlr_drm_crtc *crtc = output->crtc;
 | 
			
		||||
	struct wlr_drm_plane *plane = crtc->primary;
 | 
			
		||||
	struct wlr_drm_connector *conn = (struct wlr_drm_connector *)output;
 | 
			
		||||
	struct wlr_drm_plane *plane = conn->crtc->primary;
 | 
			
		||||
	wlr_drm_plane_make_current(conn->renderer, plane);
 | 
			
		||||
	glReadPixels(0, 0, plane->width, plane->height, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
 | 
			
		||||
		out_data);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -846,6 +846,7 @@ static void page_flip_handler(int fd, unsigned seq,
 | 
			
		|||
 | 
			
		||||
	if (drm->session->active) {
 | 
			
		||||
		wl_signal_emit(&conn->output.events.frame, &conn->output);
 | 
			
		||||
		wl_signal_emit(&conn->output.events.post_frame, &conn->output);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -37,6 +37,7 @@ struct wlr_output {
 | 
			
		|||
 | 
			
		||||
	struct {
 | 
			
		||||
		struct wl_signal frame;
 | 
			
		||||
		struct wl_signal post_frame;
 | 
			
		||||
		struct wl_signal resolution;
 | 
			
		||||
		struct wl_signal destroy;
 | 
			
		||||
	} events;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -105,6 +105,7 @@ void wlr_output_init(struct wlr_output *output,
 | 
			
		|||
	output->transform = WL_OUTPUT_TRANSFORM_NORMAL;
 | 
			
		||||
	output->scale = 1;
 | 
			
		||||
	wl_signal_init(&output->events.frame);
 | 
			
		||||
	wl_signal_init(&output->events.post_frame);
 | 
			
		||||
	wl_signal_init(&output->events.resolution);
 | 
			
		||||
	wl_signal_init(&output->events.destroy);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ static void screenshooter_shoot(struct wl_client *client,
 | 
			
		|||
	state->output = output;
 | 
			
		||||
	state->screenshot = screenshot;
 | 
			
		||||
	state->frame_listener.notify = output_frame_notify;
 | 
			
		||||
	wl_signal_add(&output->events.frame, &state->frame_listener);
 | 
			
		||||
	wl_signal_add(&output->events.post_frame, &state->frame_listener);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static struct orbital_screenshooter_interface screenshooter_impl = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue