@ -227,6 +227,21 @@ output_handle_scanout_buffer_destroy(struct wl_listener *listener,
output - > scanout_buffer = NULL ;
output - > scanout_buffer = NULL ;
}
}
static void
output_handle_old_scanout_buffer_destroy ( struct wl_listener * listener ,
struct wl_resource * resource ,
uint32_t time )
{
struct wlsc_output * output =
container_of ( listener , struct wlsc_output ,
old_scanout_buffer_destroy_listener ) ;
struct wl_buffer * buffer = ( struct wl_buffer * ) resource ;
if ( output - > old_scanout_buffer = = buffer )
output - > old_scanout_buffer = NULL ;
}
WL_EXPORT struct wlsc_surface *
WL_EXPORT struct wlsc_surface *
wlsc_surface_create ( struct wlsc_compositor * compositor ,
wlsc_surface_create ( struct wlsc_compositor * compositor ,
int32_t x , int32_t y , int32_t width , int32_t height )
int32_t x , int32_t y , int32_t width , int32_t height )
@ -846,9 +861,16 @@ setup_scanout_surface(struct wlsc_output *output, struct wlsc_surface *es)
output - > prepare_scanout_surface ( output , es ) ! = 0 )
output - > prepare_scanout_surface ( output , es ) ! = 0 )
return 0 ;
return 0 ;
output - > old_scanout_buffer = output - > scanout_buffer ;
output - > scanout_buffer = es - > buffer ;
output - > scanout_buffer = es - > buffer ;
output - > scanout_buffer - > busy_count + + ;
output - > scanout_buffer - > busy_count + + ;
if ( output - > old_scanout_buffer ) {
wl_list_remove ( & output - > old_scanout_buffer_destroy_listener . link ) ;
wl_list_insert ( output - > old_scanout_buffer - > resource . destroy_listener_list . prev ,
& output - > old_scanout_buffer_destroy_listener . link ) ;
}
wl_list_remove ( & output - > scanout_buffer_destroy_listener . link ) ;
wl_list_remove ( & output - > scanout_buffer_destroy_listener . link ) ;
wl_list_insert ( output - > scanout_buffer - > resource . destroy_listener_list . prev ,
wl_list_insert ( output - > scanout_buffer - > resource . destroy_listener_list . prev ,
& output - > scanout_buffer_destroy_listener . link ) ;
& output - > scanout_buffer_destroy_listener . link ) ;
@ -968,8 +990,8 @@ idle_repaint(void *data)
WL_EXPORT void
WL_EXPORT void
wlsc_output_finish_frame ( struct wlsc_output * output , int msecs )
wlsc_output_finish_frame ( struct wlsc_output * output , int msecs )
{
{
wlsc_buffer_post_release ( output - > scanout_buffer ) ;
wlsc_buffer_post_release ( output - > old_ scanout_buffer) ;
output - > scanout_buffer = NULL ;
output - > old_ scanout_buffer = NULL ;
output - > repaint_scheduled = 0 ;
output - > repaint_scheduled = 0 ;
if ( output - > repaint_needed )
if ( output - > repaint_needed )
@ -1920,6 +1942,11 @@ wlsc_output_init(struct wlsc_output *output, struct wlsc_compositor *c,
output - > scanout_buffer_destroy_listener . func =
output - > scanout_buffer_destroy_listener . func =
output_handle_scanout_buffer_destroy ;
output_handle_scanout_buffer_destroy ;
wl_list_init ( & output - > scanout_buffer_destroy_listener . link ) ;
wl_list_init ( & output - > scanout_buffer_destroy_listener . link ) ;
output - > old_scanout_buffer_destroy_listener . func =
output_handle_old_scanout_buffer_destroy ;
wl_list_init ( & output - > old_scanout_buffer_destroy_listener . link ) ;
wl_list_init ( & output - > frame_callback_list ) ;
wl_list_init ( & output - > frame_callback_list ) ;
output - > resource . object . interface = & wl_output_interface ;
output - > resource . object . interface = & wl_output_interface ;