[Mesa-dev] [PATCH] intel: Do temporary CPU maps of textures that are too big to GTT map.

Daniel Vetter daniel at ffwll.ch
Fri Apr 5 15:34:19 PDT 2013


On Fri, Apr 05, 2013 at 01:17:43PM -0700, Eric Anholt wrote:
> This still fails, since 8192*4bpp == 32768, which is too big to use the
> blitter on.
> 
> v2: Be more conservative about the size of the GTT -- I'd forgotten some
>     of the horror of older hardware.

Agreed on your other comments, we need to have a proper interface for
userspace to figure this out. And snoopable bos obviously need a separate
cache, otherwise we'll drown in clflush. On the patch:

Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>

> ---
>  src/mesa/drivers/dri/intel/intel_mipmap_tree.c |   23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
> index ffdaec5..152d4631 100644
> --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
> @@ -1703,6 +1703,25 @@ intel_miptree_map_singlesample(struct intel_context *intel,
>  {
>     struct intel_miptree_map *map;
>  
> +   /* Estimate the size of the mappable aperture into the GTT.  There's an
> +    * ioctl to get the whole GTT size, but not one to get the mappable subset.
> +    * Generally it's 256MB, but some gen4+ (particularly things like G41)
> +    * occasionally has only 128, and 830-class hardware could be either 64 or
> +    * 128.  Since the kernel doesn't expose information to let us actually
> +    * determine the size, just be pessimistic.
> +    */
> +   uint32_t gtt_size = 128 * 1024 * 1024;
> +   if (intel->gen == 2)
> +      gtt_size = 64 * 1024 * 1024;
> +
> +   /* We don't want to map two objects such that a memcpy between them would
> +    * just fault one mapping in and then the other over and over forever.  So
> +    * we would need to divide the GTT size by 2.  Additionally, some GTT is
> +    * taken up by things like the framebuffer and the ringbuffer and such, so
> +    * be more conservative.
> +    */
> +   uint32_t max_gtt_map_object_size = gtt_size / 4;
> +
>     assert(mt->num_samples <= 1);
>  
>     map = intel_miptree_attach_map(mt, level, slice, x, y, w, h, mode);
> @@ -1749,6 +1768,10 @@ intel_miptree_map_singlesample(struct intel_context *intel,
>              mt->region->tiling == I915_TILING_X &&
>              mt->region->pitch < 32768) {
>        intel_miptree_map_blit(intel, mt, map, level, slice);
> +   } else if (mt->region->bo->size >= max_gtt_map_object_size) {
> +      assert(mt->region->pitch < 32768 ||
> +             mt->region->tiling == I915_TILING_NONE);
> +      intel_miptree_map_blit(intel, mt, map, level, slice);
>     } else {
>        intel_miptree_map_gtt(intel, mt, map, level, slice);
>     }
> -- 
> 1.7.10.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch


More information about the mesa-dev mailing list