There should be no way for endframe to ever need recursion.. Signed-off-by: Maarten Lankhorst <m.b.lankho...@gmail.com> --- src/gallium/state_trackers/xorg/xvmc/surface.c | 23 +++++++++++++---------- 1 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/gallium/state_trackers/xorg/xvmc/surface.c b/src/gallium/state_trackers/xorg/xvmc/surface.c index ffdac3d..3025f0e 100644 --- a/src/gallium/state_trackers/xorg/xvmc/surface.c +++ b/src/gallium/state_trackers/xorg/xvmc/surface.c @@ -122,7 +122,7 @@ SetDecoderStatus(XvMCSurfacePrivate *surface) } static void -RecursiveEndFrame(XvMCSurfacePrivate *surface) +EndFrame(XvMCSurfacePrivate *surface) { XvMCContextPrivate *context_priv; unsigned i; @@ -134,12 +134,11 @@ RecursiveEndFrame(XvMCSurfacePrivate *surface) for ( i = 0; i < 2; ++i ) { if (surface->ref[i]) { XvMCSurface *ref = surface->ref[i]; + XvMCSurfacePrivate *refpriv; - assert(ref); - - surface->ref[i] = NULL; - RecursiveEndFrame(ref->privData); - surface->ref[i] = ref; + assert(ref && ref->privData); + refpriv = ref->privData; + assert(!refpriv->picture_structure); // There's just no sane way this can happen.. } } @@ -260,10 +259,10 @@ Status XvMCRenderSurface(Display *dpy, XvMCContext *context, unsigned int pictur // call end frame on all referenced frames if (past_surface) - RecursiveEndFrame(past_surface->privData); + EndFrame(past_surface->privData); if (future_surface) - RecursiveEndFrame(future_surface->privData); + EndFrame(future_surface->privData); xvmc_mb = macroblocks->macro_blocks + first_macroblock; @@ -275,7 +274,7 @@ Status XvMCRenderSurface(Display *dpy, XvMCContext *context, unsigned int pictur (xvmc_mb->x == 0 && xvmc_mb->y == 0))) { // If they change anyway we must assume that the current frame is ended - RecursiveEndFrame(target_surface_priv); + EndFrame(target_surface_priv); } target_surface_priv->ref[0] = past_surface; @@ -390,7 +389,11 @@ Status XvMCPutSurface(Display *dpy, XvMCSurface *surface, Drawable drawable, assert(desty + desth - 1 < drawable_surface->height); */ - RecursiveEndFrame(surface_priv); + if (surface_priv->ref[0]) + EndFrame(surface_priv->ref[0]->privData); + if (surface_priv->ref[1]) + EndFrame(surface_priv->ref[1]->privData); + EndFrame(surface_priv); context_priv->decoder->flush(context_priv->decoder); -- 1.7.7.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev