On Tuesday, September 4, 2018 2:57:29 AM PDT Lionel Landwerlin wrote:
> Both brw_bo_map_cpu() & brw_bo_map_wc() assert if mapping the
> underlying BO fails. Failing back to brw_bo_map_gtt() doesn't seem to
> make any sense for that reason.
> 
> We also only call brw_bo_map_gtt() for tiled buffers which as far as
> we know are never mapped coherent (coherent is a parameter reserved
> for buffer object which are always allocated linear). So explicitly
> assert if we ever run into this case.
> 
> This makes checking the kernel about whether GTT maps are actually
> coherent unnecessary.
> 
> Signed-off-by: Lionel Landwerlin <lionel.g.landwer...@intel.com>
> ---
>  src/mesa/drivers/dri/i965/brw_bufmgr.c | 21 ++-------------------
>  1 file changed, 2 insertions(+), 19 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c 
> b/src/mesa/drivers/dri/i965/brw_bufmgr.c
> index f1675b191c1..e0008905164 100644
> --- a/src/mesa/drivers/dri/i965/brw_bufmgr.c
> +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c
> @@ -1095,6 +1095,8 @@ brw_bo_map_gtt(struct brw_context *brw, struct brw_bo 
> *bo, unsigned flags)
>  {
>     struct brw_bufmgr *bufmgr = bo->bufmgr;
>  
> +   assert((flags & MAP_COHERENT) == 0);
> +
>     /* Get a mapping of the buffer if we haven't before. */
>     if (bo->map_gtt == NULL) {
>        DBG("bo_map_gtt: mmap %d (%s)\n", bo->gem_handle, bo->name);
> @@ -1186,25 +1188,6 @@ brw_bo_map(struct brw_context *brw, struct brw_bo *bo, 
> unsigned flags)
>     else
>        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.
> -    *
> -    * We skip MAP_RAW because we want to avoid map_gtt's fence detiling.
> -    */
> -   if (!map && !(flags & MAP_RAW)) {
> -      if (brw) {
> -         perf_debug("Fallback GTT mapping for %s with access flags %x\n",
> -                    bo->name, flags);
> -      }
> -      map = brw_bo_map_gtt(brw, bo, flags);
> -   }
> -
>     return map;
>  }
>  
> 

This will break on Cherryview Chromebook kernels, which are too old to
support WC maps, and therefore fall back to GTT maps even for linear
buffers. :(

Which brings up an awful point...in that case...we will hit GTT maps
with the MAP_COHERENT bit set.  Assuming Cherryview has the buffering
Chris mentioned, then we're hosed.  It seems like our options are:

1. Mandate new kernels with WC support (not likely to fly...)
2. Disable ARB_buffer_storage/EXT_buffer_storage if the platform has
   this buffering and the kernel doesn't support WC maps
3. Just continue exposing the broken semi-coherent map, treat it as a
   known bug that would be fixed by upgrading the kernel...

Chris, what platforms are affected by this?

--Ken

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to