On Wed, Aug 04, 2010 at 11:52:46AM -0700, Dave Del Debbio wrote:
> This upstream patch courtesy of Chris Wilson <ch...@chirs-wilson.co.uk> 
> both limits tied pitches to 8192 on pre-i965 and enables switching from one
> VT to another without terminating your Xsession. :)

You must have a pretty big monitor to be hitting this, this wasn't
mentioned when I was told about your issues before.

I'll get this tested here (hadn't got to this patch in my upstream
trawling yet).

-0-
> 
> Tested on a Thinkpad X301 with an Aug 3 amd64 snapshot..  
> 
> Please see
>  
> http://cgit.freedesktop.org/mesa/drm/commit/?id=726210f87d558d558022f35bc8c839e798a19f0c
> 
> --- intel_bufmgr_gem.c.orig   Wed Aug  4 06:42:44 2010
> +++ intel_bufmgr_gem.c        Wed Aug  4 07:07:44 2010
> @@ -252,7 +252,7 @@
>   */
>  static unsigned long
>  drm_intel_gem_bo_tile_pitch(drm_intel_bufmgr_gem *bufmgr_gem,
> -                         unsigned long pitch, uint32_t tiling_mode)
> +                         unsigned long pitch, uint32_t *tiling_mode)
>  {
>       unsigned long tile_width;
>       unsigned long i;
> @@ -260,10 +260,10 @@
>       /* If untiled, then just align it so that we can do rendering
>        * to it with the 3D engine.
>        */
> -     if (tiling_mode == I915_TILING_NONE)
> +     if (*tiling_mode == I915_TILING_NONE)
>               return ALIGN(pitch, 64);
>  
> -     if (tiling_mode == I915_TILING_X)
> +     if (*tiling_mode == I915_TILING_X)
>               tile_width = 512;
>       else
>               tile_width = 128;
> @@ -272,6 +272,14 @@
>       if (bufmgr_gem->gen >= 4)
>               return ROUND_UP_TO(pitch, tile_width);
>  
> +     /* The older hardware has a maximum pitch of 8192 with tiled
> +     * surfaces, so fallback to untiled if it's too large.
> +     */
> +     if (pitch > 8192) {
> +             *tiling_mode = I915_TILING_NONE;
> +             return ALIGN(pitch, 64);
> +}
> +
>       /* Pre-965 needs power of two tile width */
>       for (i = tile_width; i < pitch; i <<= 1)
>               ;
> @@ -679,7 +687,7 @@
>       stride = x * cpp;
>       stride = drm_intel_gem_bo_tile_pitch(bufmgr_gem, stride, *tiling_mode);
>       size = stride * aligned_y;
> -     size = drm_intel_gem_bo_tile_size(bufmgr_gem, size, tiling_mode);
> +     size = drm_intel_gem_bo_tile_size(bufmgr_gem, size, *tiling_mode);
>  
>       bo = drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags);
>       if (!bo)

-- 
One way to stop a runaway horse is to bet on him.

Reply via email to