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 <[email protected]> > 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 <[email protected]> > [...] > 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 _______________________________________________ Intel-gfx mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/intel-gfx
