[Mesa-dev] [PATCH 2/4] i965: Fix up a failed CPU/WC mmaping with a GTT mapping

Chris Wilson chris at chris-wilson.co.uk
Fri Jul 21 20:52:16 UTC 2017


Quoting Kenneth Graunke (2017-07-12 08:22:23)
> From: Chris Wilson <chris at chris-wilson.co.uk>
> +static void *
>  brw_bo_map_gtt(struct brw_context *brw, struct brw_bo *bo, unsigned flags)
>  {
>     struct brw_bufmgr *bufmgr = bo->bufmgr;
> @@ -824,10 +831,30 @@ brw_bo_map(struct brw_context *brw, struct brw_bo *bo, unsigned flags)
>  {
>     if (bo->tiling_mode != I915_TILING_NONE && !(flags & MAP_RAW))
>        return brw_bo_map_gtt(brw, bo, flags);
> -   else if (can_map_cpu(bo, flags))
> -      return brw_bo_map_cpu(brw, bo, flags);
> +
> +   void *map;
> +
> +   if (can_map_cpu(bo, flags))
> +      map = brw_bo_map_cpu(brw, bo, flags);
>     else
> -      return brw_bo_map_gtt(brw, bo, flags);
> +      map = brw_bo_map_wc(brw, bo, flags);
> +
> +   /* Allow the attempt to fail by falling back to the GTT where necessary.
> +    *
> +    * Not every buffer can be mmaped directly using the CPU (or WC), for
> +    * example buffers that wrap stolen memory or are imported from other
> +    * devices. For those, we have little choice but to use a GTT mmapping.
> +    * However, if we use a slow GTT mmapping for reads where we expected fast
> +    * access, that order of magnitude difference in throughput will be clearly
> +    * expressed by angry users.
> +    */
> +   if (!map) {

One more issue, we should not supply a GTT fallback for MAP_RAW (at
least not without removing the fence detiling), so this should be

if (!map && !(flags & MAP_RAW)) {
-Chris


More information about the mesa-dev mailing list