[PATCH xf86-video-amdgpu 06/13] DRI2: Move amdgpu_dri2_flip_event_handler

Reverend Homer mk.43.ecko at gmail.com
Wed Jun 3 08:11:31 PDT 2015



On 02.06.2015 12:21, Michel Dänzer wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> In preparation for the next change, which will modify it to a static
> function which needs to be in the new place. No functional change.
>
> (Cherry picked from radeon commit c3fa22a479e61d1899fa9d327d9c4e2a7f64b0c1)
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>   src/amdgpu_dri2.c | 120 +++++++++++++++++++++++++++---------------------------
>   1 file changed, 60 insertions(+), 60 deletions(-)
>
> diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c
> index fd98fa7..c139dec 100644
> --- a/src/amdgpu_dri2.c
> +++ b/src/amdgpu_dri2.c
> @@ -497,6 +497,66 @@ xf86CrtcPtr amdgpu_dri2_drawable_crtc(DrawablePtr pDraw, Bool consider_disabled)
>   		return NULL;
>   }
>   
> +void amdgpu_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec,
> +				    unsigned int tv_usec, void *event_data)
> +{
> +	DRI2FrameEventPtr flip = event_data;
> +	DrawablePtr drawable;
> +	ScreenPtr screen;
> +	ScrnInfoPtr scrn;
> +	int status;
> +	PixmapPtr pixmap;
> +
> +	status = dixLookupDrawable(&drawable, flip->drawable_id, serverClient,
> +				   M_ANY, DixWriteAccess);
> +	if (status != Success) {
> +		free(flip);
> +		return;
> +	}
Here
> +	if (!flip->crtc) {
> +		free(flip);
> +		return;
> +	}
and here you are doing one thing. Wouldn't be better to use
if (status != Success || !flip->crtc) {
         free(flip);
         return;
}
?
> +	frame += amdgpu_get_interpolated_vblanks(flip->crtc);
> +
> +	screen = drawable->pScreen;
> +	scrn = xf86ScreenToScrn(screen);
> +
> +	pixmap = screen->GetScreenPixmap(screen);
> +	xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, AMDGPU_LOGLEVEL_DEBUG,
> +		       "%s:%d fevent[%p] width %d pitch %d (/4 %d)\n",
> +		       __func__, __LINE__, flip, pixmap->drawable.width,
> +		       pixmap->devKind, pixmap->devKind / 4);
> +
> +	/* We assume our flips arrive in order, so we don't check the frame */
> +	switch (flip->type) {
> +	case DRI2_SWAP:
> +		/* Check for too small vblank count of pageflip completion, taking wraparound
> +		 * into account. This usually means some defective kms pageflip completion,
> +		 * causing wrong (msc, ust) return values and possible visual corruption.
> +		 */
> +		if ((frame < flip->frame) && (flip->frame - frame < 5)) {
> +			xf86DrvMsg(scrn->scrnIndex, X_WARNING,
> +				   "%s: Pageflip completion event has impossible msc %d < target_msc %d\n",
> +				   __func__, frame, flip->frame);
> +			/* All-Zero values signal failure of (msc, ust) timestamping to client. */
> +			frame = tv_sec = tv_usec = 0;
> +		}
> +
> +		DRI2SwapComplete(flip->client, drawable, frame, tv_sec, tv_usec,
> +				 DRI2_FLIP_COMPLETE, flip->event_complete,
> +				 flip->event_data);
> +		break;
> +	default:
> +		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
> +			   "%s: unknown vblank event received\n", __func__);
> +		/* Unknown type */
> +		break;
> +	}
> +
> +	free(flip);
> +}
> +
>   static Bool
>   amdgpu_dri2_schedule_flip(ScrnInfoPtr scrn, ClientPtr client,
>   			  DrawablePtr draw, DRI2BufferPtr front,
> @@ -1130,66 +1190,6 @@ out_complete:
>   	return TRUE;
>   }
>   
> -void amdgpu_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec,
> -				    unsigned int tv_usec, void *event_data)
> -{
> -	DRI2FrameEventPtr flip = event_data;
> -	DrawablePtr drawable;
> -	ScreenPtr screen;
> -	ScrnInfoPtr scrn;
> -	int status;
> -	PixmapPtr pixmap;
> -
> -	status = dixLookupDrawable(&drawable, flip->drawable_id, serverClient,
> -				   M_ANY, DixWriteAccess);
> -	if (status != Success) {
> -		free(flip);
> -		return;
> -	}
> -	if (!flip->crtc) {
> -		free(flip);
> -		return;
> -	}
> -	frame += amdgpu_get_interpolated_vblanks(flip->crtc);
> -
> -	screen = drawable->pScreen;
> -	scrn = xf86ScreenToScrn(screen);
> -
> -	pixmap = screen->GetScreenPixmap(screen);
> -	xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, AMDGPU_LOGLEVEL_DEBUG,
> -		       "%s:%d fevent[%p] width %d pitch %d (/4 %d)\n",
> -		       __func__, __LINE__, flip, pixmap->drawable.width,
> -		       pixmap->devKind, pixmap->devKind / 4);
> -
> -	/* We assume our flips arrive in order, so we don't check the frame */
> -	switch (flip->type) {
> -	case DRI2_SWAP:
> -		/* Check for too small vblank count of pageflip completion, taking wraparound
> -		 * into account. This usually means some defective kms pageflip completion,
> -		 * causing wrong (msc, ust) return values and possible visual corruption.
> -		 */
> -		if ((frame < flip->frame) && (flip->frame - frame < 5)) {
> -			xf86DrvMsg(scrn->scrnIndex, X_WARNING,
> -				   "%s: Pageflip completion event has impossible msc %d < target_msc %d\n",
> -				   __func__, frame, flip->frame);
> -			/* All-Zero values signal failure of (msc, ust) timestamping to client. */
> -			frame = tv_sec = tv_usec = 0;
> -		}
> -
> -		DRI2SwapComplete(flip->client, drawable, frame, tv_sec, tv_usec,
> -				 DRI2_FLIP_COMPLETE, flip->event_complete,
> -				 flip->event_data);
> -		break;
> -	default:
> -		xf86DrvMsg(scrn->scrnIndex, X_WARNING,
> -			   "%s: unknown vblank event received\n", __func__);
> -		/* Unknown type */
> -		break;
> -	}
> -
> -	free(flip);
> -}
> -
>   /*
>    * ScheduleSwap is responsible for requesting a DRM vblank event for the
>    * appropriate frame.

-- 
--
Regards,
R.H.



More information about the xorg-driver-ati mailing list