present: When cancelling a pending synchronous flip, requeue it
The vblank event request for a synchronous flip is scheduled for the vblank before the target flip msc (so that the flip itself appears at the right frame). If we cancel that flip and so wish to schedule a copy instead, that copy needs to be postponed by a frame in order for it be performed at the requested time. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
This commit is contained in:
		
							parent
							
								
									b2d55338f6
								
							
						
					
					
						commit
						180b09912c
					
				| 
						 | 
				
			
			@ -549,8 +549,13 @@ present_check_flip_window (WindowPtr window)
 | 
			
		|||
 | 
			
		||||
    /* Now check any queued vblanks */
 | 
			
		||||
    xorg_list_for_each_entry(vblank, &window_priv->vblank, window_list) {
 | 
			
		||||
        if (vblank->queued && vblank->flip && !present_check_flip(vblank->crtc, window, vblank->pixmap, vblank->sync_flip, NULL, 0, 0))
 | 
			
		||||
        if (vblank->queued && vblank->flip && !present_check_flip(vblank->crtc, window, vblank->pixmap, vblank->sync_flip, NULL, 0, 0)) {
 | 
			
		||||
            vblank->flip = FALSE;
 | 
			
		||||
            if (vblank->sync_flip) {
 | 
			
		||||
                vblank->requeue = TRUE;
 | 
			
		||||
                vblank->target_msc++;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -584,6 +589,15 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc)
 | 
			
		|||
    present_screen_priv_ptr     screen_priv = present_screen_priv(screen);
 | 
			
		||||
    uint8_t                     mode;
 | 
			
		||||
 | 
			
		||||
    if (vblank->requeue) {
 | 
			
		||||
        vblank->requeue = FALSE;
 | 
			
		||||
        if (Success == present_queue_vblank(screen,
 | 
			
		||||
                                            vblank->crtc,
 | 
			
		||||
                                            vblank->event_id,
 | 
			
		||||
                                            vblank->target_msc))
 | 
			
		||||
            return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (vblank->wait_fence) {
 | 
			
		||||
        if (!present_fence_check_triggered(vblank->wait_fence)) {
 | 
			
		||||
            present_fence_set_callback(vblank->wait_fence, present_wait_fence_triggered, vblank);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,6 +70,7 @@ struct present_vblank {
 | 
			
		|||
    present_notify_ptr  notifies;
 | 
			
		||||
    int                 num_notifies;
 | 
			
		||||
    Bool                queued;         /* on present_exec_queue */
 | 
			
		||||
    Bool                requeue;        /* on queue, but target_msc has changed */
 | 
			
		||||
    Bool                flip;           /* planning on using flip */
 | 
			
		||||
    Bool                flip_ready;     /* wants to flip, but waiting for previous flip or unflip */
 | 
			
		||||
    Bool                sync_flip;      /* do flip synchronous to vblank */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue