[Intel-gfx] xf86-video-intel: 3 commits - src/intel_display.c src/intel_dri.c src/intel.h

Julien Cristau jcristau at debian.org
Thu Mar 24 02:02:56 CET 2011


Hi Keith,

a couple suggestions below from a quick look over these patches.

On Wed, Mar 23, 2011 at 17:24:57 -0700, Keith Packard wrote:

> commit e1ff5182304e00c0d392092069422cae7626cf8d
> Author: Keith Packard <keithp at keithp.com>
> Date:   Wed Mar 9 17:00:41 2011 -0800
> 
>     Handle drawable/client destruction in pending swaps/flips
>     
>     A pending swap or flip holds references to drawables and clients which
>     become invalid when destroyed. Add suitable resources to the database
>     to track those lifetimes and clean up the pending data structure then.
>     
>     Later, when the pending swap or flip occurs, handle a missing drawable
>     by just discarding the flip or swap. Handle a missing client by not
>     sending an event or reply.
>     
>     Signed-off-by: Keith Packard <keithp at keithp.com>
> 
[...]
> diff --git a/src/intel_display.c b/src/intel_display.c
> index eb07cf5..4734844 100644
> --- a/src/intel_display.c
> +++ b/src/intel_display.c
> @@ -1512,7 +1512,7 @@ static const xf86CrtcConfigFuncsRec intel_xf86crtc_config_funcs = {
>  
>  static void
>  intel_vblank_handler(int fd, unsigned int frame, unsigned int tv_sec,
> -		       unsigned int tv_usec, DRI2FrameEventPtr event)
> +		       unsigned int tv_usec, void *event)

This seems to just revert a change from the previous commit?

>  {
>  	I830DRI2FrameEventHandler(frame, tv_sec, tv_usec, event);
>  }
> diff --git a/src/intel_dri.c b/src/intel_dri.c
> index 9e8c370..f039e9d 100644
> --- a/src/intel_dri.c
> +++ b/src/intel_dri.c
> @@ -577,6 +577,69 @@ I830DRI2DrawablePipe(DrawablePtr pDraw)
[...]
> +/*
> + * Hook this frame event into the server resource
> + * database so we can clean it up if the drawable or
> + * client exits while the swap is pending
> + */
> +static Bool
> +i830_dri2_add_frame_event(DRI2FrameEventPtr frame_event)
> +{
> +	frame_event->client_id = FakeClientID(frame_event->client->index);
> +
> +	if (!AddResource(frame_event->client_id, frame_event_client_type, frame_event))
> +		return FALSE;
> +
> +	if (!AddResource(frame_event->drawable_id, frame_event_drawable_type, frame_event))
> +		return FALSE;
> +
> +	return TRUE;
> +}
> +
> +static void
> +i830_dri2_del_frame_event(DRI2FrameEventPtr frame_event)
> +{
> +	if (frame_event->client_id)
> +		FreeResourceByType(frame_event->client_id, frame_event_client_type, FALSE);
> +	if (frame_event->drawable_id)
> +		FreeResourceByType(frame_event->drawable_id, frame_event_drawable_type, FALSE);
> +}
> +
>  static void
>  I830DRI2ExchangeBuffers(DrawablePtr draw, DRI2BufferPtr front,
>  			DRI2BufferPtr back)
> @@ -642,11 +705,18 @@ I830DRI2ScheduleFlip(struct intel_screen_private *intel,
>  	flip_info->event_data = data;
>  	flip_info->frame = target_msc;
>  
> +	i830_dri2_add_frame_event(flip_info);
> +

if (!i830_dri_add_frame_event(flip_info))
    return FALSE;
?

>  	/* Page flip the full screen buffer */
>  	back_priv = back->driverPrivate;
> -	return intel_do_pageflip(intel,
> -				 intel_get_pixmap_bo(back_priv->pixmap),
> -				 flip_info, ref_crtc_hw_id);
> +	if (intel_do_pageflip(intel,
> +			      intel_get_pixmap_bo(back_priv->pixmap),
> +			      flip_info, ref_crtc_hw_id))
> +		return TRUE;
> +
> +	i830_dri2_del_frame_event(flip_info);
> +	free(flip_info);
> +	return FALSE;
>  }
>  
>  static Bool
[...]
> @@ -876,6 +958,8 @@ I830DRI2ScheduleSwap(ClientPtr client, DrawablePtr draw, DRI2BufferPtr front,
>  	I830DRI2ReferenceBuffer(front);
>  	I830DRI2ReferenceBuffer(back);
>  
> +	i830_dri2_add_frame_event(swap_info);
> +

if (!i830_dri2_add_frame_event(swap_info)
    goto blit_fallback;
?

>  	/* Get current count */
>  	vbl.request.type = DRM_VBLANK_RELATIVE;
>  	if (pipe > 0)
[...]

Cheers,
Julien



More information about the Intel-gfx mailing list