[Mesa-dev] [PATCH] st/glx: Fix endless loop in drawable validation

Jose Fonseca jfonseca at vmware.com
Tue Jul 5 05:17:19 PDT 2011


I didn't reproduce this issue here yet, but this looks like a sensible thing to do regardless -- we should never invalidate anything if the size does not change.

Jose

----- Original Message -----
> This fixes a regression introduced with commit
> 
> "st-api: Rework how drawables are invalidated v3"
> 
> where the glx state tracker manager would invalidate a drawable each
> time it
> checks the drawable dimensions, even during a validate call, which
> resulted in an endless loop, since the state tracker would
> immediately
> detect the new invalidation and rerun the validate...
> 
> This change marks the drawable invalid only if the drawable
> dimensions actually
> changed during the validate, which will result in at most a single
> unnecessary validate by the context running a validate during which
> the
> dimensions changed.
> 
> To avoid unnecessary validates altogether, we need to implement yet
> another
> st-api change: Returning the current time stamp from the validate
> function,
> as suggested by Chia-I Wu. The glx state tracker manager could then
> return
> the stamp resulting from the last drawable dimension check.
> 
> Signed-off-by: Thomas Hellstrom <thellstrom at vmware.com>
> ---
>  src/gallium/state_trackers/glx/xlib/xm_api.c |    9 ++++++++-
>  1 files changed, 8 insertions(+), 1 deletions(-)
> 
> diff --git a/src/gallium/state_trackers/glx/xlib/xm_api.c
> b/src/gallium/state_trackers/glx/xlib/xm_api.c
> index 1be6dd9..8f6406d 100644
> --- a/src/gallium/state_trackers/glx/xlib/xm_api.c
> +++ b/src/gallium/state_trackers/glx/xlib/xm_api.c
> @@ -1124,11 +1124,18 @@ xmesa_notify_invalid_buffer(XMesaBuffer b)
>  void
>  xmesa_check_buffer_size(XMesaBuffer b)
>  {
> +   GLuint old_width, old_height;
> +
>     if (b->type == PBUFFER)
>        return;
>  
> +   old_width = b->width;
> +   old_height = b->height;
> +
>     xmesa_get_window_size(b->xm_visual->display, b, &b->width,
>     &b->height);
> -   xmesa_notify_invalid_buffer(b);
> +
> +   if (b->width != old_width || b->height != old_height)
> +      xmesa_notify_invalid_buffer(b);
>  }
>  
>  
> --
> 1.6.2.5
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list