If we map the bo upon creation, we can avoid the latency of mmapping it when querying, and later use the asynchronous, persistent map of the predicate to do a quick query.
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 | 15 +++++++++++++ src/mesa/drivers/dri/i965/brw_bufmgr.h | 2 ++ src/mesa/drivers/dri/i965/brw_context.h | 1 + src/mesa/drivers/dri/i965/gen6_queryobj.c | 37 ++++++++++++++++++++++--------- 4 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.c b/src/mesa/drivers/dri/i965/brw_bufmgr.c index 01590a0b0a..9028b538c6 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.c +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.c @@ -775,6 +775,21 @@ brw_bo_map(struct brw_context *brw, struct brw_bo *bo, unsigned flags) return brw_bo_map_gtt(brw, bo, flags); } +void +brw_bo_map_sync(struct brw_context *brw, struct brw_bo *bo, unsigned flags) +{ + unsigned domain; + + if (bo->tiling_mode != I915_TILING_NONE && !(flags & MAP_RAW)) + domain = I915_GEM_DOMAIN_GTT; + else if (can_map_cpu(bo, flags)) + domain = I915_GEM_DOMAIN_CPU; + else + domain = I915_GEM_DOMAIN_GTT; + + set_domain(brw, __func__, bo, domain, flags & MAP_WRITE ? domain : 0); +} + int brw_bo_unmap(struct brw_bo *bo) { diff --git a/src/mesa/drivers/dri/i965/brw_bufmgr.h b/src/mesa/drivers/dri/i965/brw_bufmgr.h index 3a397be695..214b75bf1a 100644 --- a/src/mesa/drivers/dri/i965/brw_bufmgr.h +++ b/src/mesa/drivers/dri/i965/brw_bufmgr.h @@ -196,6 +196,8 @@ void brw_bo_unreference(struct brw_bo *bo); */ MUST_CHECK void *brw_bo_map(struct brw_context *brw, struct brw_bo *bo, unsigned flags); +void brw_bo_map_sync(struct brw_context *brw, struct brw_bo *bo, unsigned flags); + /** * Reduces the refcount on the userspace mapping of the buffer * object. diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h index c5acb83ad0..117b1ecdca 100644 --- a/src/mesa/drivers/dri/i965/brw_context.h +++ b/src/mesa/drivers/dri/i965/brw_context.h @@ -419,6 +419,7 @@ struct brw_query_object { /** Last query BO associated with this query. */ struct brw_bo *bo; + uint64_t *results; /** Last index in bo with query data for this object. */ int last_index; diff --git a/src/mesa/drivers/dri/i965/gen6_queryobj.c b/src/mesa/drivers/dri/i965/gen6_queryobj.c index f913f986ae..18af608166 100644 --- a/src/mesa/drivers/dri/i965/gen6_queryobj.c +++ b/src/mesa/drivers/dri/i965/gen6_queryobj.c @@ -221,7 +221,9 @@ gen6_queryobj_get_results(struct gl_context *ctx, if (query->bo == NULL) return; - uint64_t *results = brw_bo_map(brw, query->bo, MAP_READ); + brw_bo_map_sync(brw, query->bo, MAP_READ | MAP_COHERENT); + uint64_t *results = query->results; + switch (query->Base.Target) { case GL_TIME_ELAPSED: /* The query BO contains the starting and ending timestamps. @@ -296,7 +298,6 @@ gen6_queryobj_get_results(struct gl_context *ctx, default: unreachable("Unrecognized query target in brw_queryobj_get_results()"); } - brw_bo_unmap(query->bo); /* Now that we've processed the data stored in the query's buffer object, * we can release it. @@ -307,6 +308,23 @@ gen6_queryobj_get_results(struct gl_context *ctx, query->Base.Ready = true; } +static int gen6_alloc_query(struct brw_context *brw, + struct brw_query_object *query) +{ + /* Since we're starting a new query, we need to throw away old results. */ + if (query->bo) + brw_bo_unreference(query->bo); + + query->bo = brw_bo_alloc(brw->bufmgr, "query results", 4096, 4096); + query->results = brw_bo_map(brw, query->bo, + MAP_READ | MAP_COHERENT | MAP_ASYNC); + + /* For ARB_query_buffer_object: The result is not available */ + set_query_availability(brw, query, false); + + return 0; +} + /** * Driver hook for glBeginQuery(). * @@ -318,14 +336,7 @@ gen6_begin_query(struct gl_context *ctx, struct gl_query_object *q) { struct brw_context *brw = brw_context(ctx); struct brw_query_object *query = (struct brw_query_object *)q; - const int idx = GEN6_QUERY_RESULTS; - - /* Since we're starting a new query, we need to throw away old results. */ - brw_bo_unreference(query->bo); - query->bo = brw_bo_alloc(brw->bufmgr, "query results", 4096, 4096); - - /* For ARB_query_buffer_object: The result is not available */ - set_query_availability(brw, query, false); + const int idx = gen6_alloc_query(brw, query) + GEN6_QUERY_RESULTS; switch (query->Base.Target) { case GL_TIME_ELAPSED: @@ -539,8 +550,12 @@ gen6_query_counter(struct gl_context *ctx, struct gl_query_object *q) { struct brw_context *brw = brw_context(ctx); struct brw_query_object *query = (struct brw_query_object *)q; - brw_query_counter(ctx, q); + const int idx = gen6_alloc_query(brw, query) + GEN6_QUERY_RESULTS; + + brw_write_timestamp(brw, query->bo, idx); set_query_availability(brw, query, true); + + query->flushed = false; } /* Initialize Gen6+-specific query object functions. */ -- 2.11.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev