[Mesa-dev] [PATCH] i965: Embrace "unlimited" GTT mmap support

Ian Romanick idr at freedesktop.org
Thu Aug 25 20:43:53 UTC 2016


On 08/24/2016 12:42 PM, Chris Wilson wrote:
> From about kernel 4.9, GTT mmaps are virtually unlimited. A new
> parameter, I915_PARAM_MMAP_GTT_VERSION, is added to advertise the
> feature so query it and use it to avoid limiting tiled allocations to
> only fit within the mappable aperture.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/drivers/dri/i965/brw_context.c  | 17 ++---------------
>  src/mesa/drivers/dri/i965/brw_context.h  |  2 +-
>  src/mesa/drivers/dri/i965/intel_screen.c | 32 ++++++++++++++++++++++++++++++++
>  src/mesa/drivers/dri/i965/intel_screen.h |  2 ++
>  4 files changed, 37 insertions(+), 16 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c
> index b0f9063..79dba1e 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.c
> +++ b/src/mesa/drivers/dri/i965/brw_context.c
> @@ -1033,21 +1033,6 @@ brwCreateContext(gl_api api,
>     brw->urb.max_ds_entries = devinfo->urb.max_ds_entries;
>     brw->urb.max_gs_entries = devinfo->urb.max_gs_entries;
>  
> -   /* 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.
> -    * It turns out it's basically always 256MB, though some ancient hardware
> -    * was smaller.
> -    */
> -   uint32_t gtt_size = 256 * 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.
> -    */
> -   brw->max_gtt_map_object_size = gtt_size / 4;
> -
>     if (brw->gen == 6)
>        brw->urb.gs_present = false;
>  
> @@ -1058,6 +1043,8 @@ brwCreateContext(gl_api api,
>  
>     brw->predicate.state = BRW_PREDICATE_STATE_RENDER;
>  
> +   brw->max_gtt_map_object_size = screen->max_gtt_map_object_size;
> +
>     brw->use_resource_streamer = screen->has_resource_streamer &&
>        (env_var_as_boolean("INTEL_USE_HW_BT", false) ||
>         env_var_as_boolean("INTEL_USE_GATHER", false));
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index f2dd164..523f36c 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -861,7 +861,7 @@ struct brw_context
>      */
>     bool perf_debug;
>  
> -   uint32_t max_gtt_map_object_size;
> +   uint64_t max_gtt_map_object_size;
>  
>     int gen;
>     int gt;
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.c b/src/mesa/drivers/dri/i965/intel_screen.c
> index 98f1c76..62eacba 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.c
> +++ b/src/mesa/drivers/dri/i965/intel_screen.c
> @@ -1006,6 +1006,17 @@ intel_get_boolean(struct intel_screen *screen, int param)
>     return (intel_get_param(screen, param, &value) == 0) && value;
>  }
>  
> +static int
> +intel_get_integer(struct intel_screen *screen, int param)
> +{
> +   int value = -1;
> +
> +   if (intel_get_param(screen, param, &value) == 0)
> +	   return value;
> +
> +   return -1;
> +}
> +
>  static void
>  intelDestroyScreen(__DRIscreen * sPriv)
>  {
> @@ -1576,6 +1587,27 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
>     if (INTEL_DEBUG & DEBUG_AUB)
>        drm_intel_bufmgr_gem_set_aub_dump(intelScreen->bufmgr, true);
>  
> +#define I915_PARAM_MMAP_GTT_VERSION 40 /* XXX delete me with new libdrm */
> +   if (intel_get_integer(intelScreen, I915_PARAM_MMAP_GTT_VERSION) >= 1) {
> +      /* Theorectically unlimited! */
> +      intelScreen->max_gtt_map_object_size = UINT64_MAX;

Well... not quite unlimited, right?  Isn't the actual VMA space less
than 64-bits?  I thought it was more like 48 bits.

> +   } else {
> +      /* 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.
> +       * It turns out it's basically always 256MB, though some ancient hardware
> +       * was smaller.
> +       */
> +      uint32_t gtt_size = 256 * 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.
> +       */
> +      intelScreen->max_gtt_map_object_size = gtt_size / 4;
> +   }
> +
>     intelScreen->hw_has_swizzling = intel_detect_swizzling(intelScreen);
>     intelScreen->hw_has_timestamp = intel_detect_timestamp(intelScreen);
>  
> diff --git a/src/mesa/drivers/dri/i965/intel_screen.h b/src/mesa/drivers/dri/i965/intel_screen.h
> index 35cd5df..fa806a3 100644
> --- a/src/mesa/drivers/dri/i965/intel_screen.h
> +++ b/src/mesa/drivers/dri/i965/intel_screen.h
> @@ -44,6 +44,8 @@ struct intel_screen
>  
>     __DRIscreen *driScrnPriv;
>  
> +   uint64_t max_gtt_map_object_size;
> +
>     bool no_hw;
>     bool hw_has_swizzling;
>     bool has_fence_fd;
> 



More information about the mesa-dev mailing list