On Friday, June 9, 2017 6:01:38 AM PDT Chris Wilson wrote:
> Ony non-llc architectures where we are primarily reading back the
> results of the GPU queries, then we can improve performance by using a
> cacheable mapping of the results. Unfortunately, enabling snooping makes
> the writes from the GPU slower, which may adversely affect pipelined
> query operations (where the results are used directly by the GPU and not
> CPU).

We're essentially writing two DWords, and reading two DWords - so we aren't
primarily reading.  However, with your next patch, where we want to be able
to asynchronously poll the status via CheckQuery()...we'll be reading a
bunch more.  It might make sense to mention this polling in the commit
message.

> 
> Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
> Cc: Kenneth Graunke <kenn...@whitecape.org>
> Cc: Matt Turner <matts...@gmail.com>
> ---
>  src/mesa/drivers/dri/i965/brw_bufmgr.c    | 21 +++++++++++++++++++++
>  src/mesa/drivers/dri/i965/brw_bufmgr.h    |  2 ++
>  src/mesa/drivers/dri/i965/gen6_queryobj.c |  2 ++
>  3 files changed, 25 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c 
> b/src/mesa/drivers/dri/i965/brw_bufmgr.c
> index 9028b538c6..824bc55fb2 100644
> --- a/src/mesa/drivers/dri/i965/brw_bufmgr.c
> +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c
> @@ -626,6 +626,27 @@ brw_bo_unreference(struct brw_bo *bo)
>     }
>  }
>  
> +static bool __brw_bo_set_caching(struct brw_bo *bo, int caching)

static bool
__brw_bo_set_caching(struct brw_bo *bo, int caching)

> +{
> +   struct drm_i915_gem_caching arg = {
> +      .handle = bo->gem_handle,
> +      .caching = caching
> +   };
> +   return drmIoctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_SET_CACHING, &arg) == 
> 0;
> +}
> +
> +void brw_bo_set_cache_coherent(struct brw_bo *bo)

void
brw_bo_set_cache_coherent(struct brw_bo *bo)

With those three changes,
Reviewed-by: Kenneth Graunke <kenn...@whitecape.org>

> +{
> +   if (bo->cache_coherent)
> +      return;
> +
> +   if (!__brw_bo_set_caching(bo, I915_CACHING_CACHED))
> +      return;
> +
> +   bo->reusable = false;
> +   bo->cache_coherent = true;
> +}
> +
>  static void
>  set_domain(struct brw_context *brw, const char *action,
>             struct brw_bo *bo, uint32_t read_domains, uint32_t write_domain)
> diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h 
> b/src/mesa/drivers/dri/i965/brw_bufmgr.h
> index 214b75bf1a..188d6c5ee0 100644
> --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h
> +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h
> @@ -188,6 +188,8 @@ void brw_bo_unreference(struct brw_bo *bo);
>  #define MAP_INTERNAL_MASK       (0xff << 24)
>  #define MAP_RAW                 (0x01 << 24)
>  
> +void brw_bo_set_cache_coherent(struct brw_bo *bo);
> +
>  /**
>   * Maps the buffer into userspace.
>   *
> diff --git a/src/mesa/drivers/dri/i965/gen6_queryobj.c 
> b/src/mesa/drivers/dri/i965/gen6_queryobj.c
> index 18af608166..5c95a4bae9 100644
> --- a/src/mesa/drivers/dri/i965/gen6_queryobj.c
> +++ b/src/mesa/drivers/dri/i965/gen6_queryobj.c
> @@ -316,6 +316,8 @@ static int gen6_alloc_query(struct brw_context *brw,
>        brw_bo_unreference(query->bo);
>  
>     query->bo = brw_bo_alloc(brw->bufmgr, "query results", 4096, 4096);
> +   brw_bo_set_cache_coherent(query->bo);
> +
>     query->results = brw_bo_map(brw, query->bo,
>                                 MAP_READ | MAP_COHERENT | MAP_ASYNC);
>  
> 

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