[Mesa-dev] [PATCH 3/9] gallium/radeon: formalize that r600_query_hw_add_result doesn't need a context

Marek Olšák maraeo at gmail.com
Wed Mar 29 17:58:48 UTC 2017


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeon/r600_perfcounter.c |  2 +-
 src/gallium/drivers/radeon/r600_query.c       | 13 +++++++------
 src/gallium/drivers/radeon/r600_query.h       |  2 +-
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/radeon/r600_perfcounter.c b/src/gallium/drivers/radeon/r600_perfcounter.c
index bf24aab..48f609b 100644
--- a/src/gallium/drivers/radeon/r600_perfcounter.c
+++ b/src/gallium/drivers/radeon/r600_perfcounter.c
@@ -189,21 +189,21 @@ static void r600_pc_query_emit_stop(struct r600_common_context *ctx,
 }
 
 static void r600_pc_query_clear_result(struct r600_query_hw *hwquery,
 				       union pipe_query_result *result)
 {
 	struct r600_query_pc *query = (struct r600_query_pc *)hwquery;
 
 	memset(result, 0, sizeof(result->batch[0]) * query->num_counters);
 }
 
-static void r600_pc_query_add_result(struct r600_common_context *ctx,
+static void r600_pc_query_add_result(struct r600_common_screen *rscreen,
 				     struct r600_query_hw *hwquery,
 				     void *buffer,
 				     union pipe_query_result *result)
 {
 	struct r600_query_pc *query = (struct r600_query_pc *)hwquery;
 	uint64_t *results = buffer;
 	unsigned i, j;
 
 	for (i = 0; i < query->num_counters; ++i) {
 		struct r600_pc_counter *counter = &query->counters[i];
diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c
index e269c39..b4e36c8 100644
--- a/src/gallium/drivers/radeon/r600_query.c
+++ b/src/gallium/drivers/radeon/r600_query.c
@@ -508,21 +508,21 @@ static struct r600_query_ops query_hw_ops = {
 };
 
 static void r600_query_hw_do_emit_start(struct r600_common_context *ctx,
 					struct r600_query_hw *query,
 					struct r600_resource *buffer,
 					uint64_t va);
 static void r600_query_hw_do_emit_stop(struct r600_common_context *ctx,
 				       struct r600_query_hw *query,
 				       struct r600_resource *buffer,
 				       uint64_t va);
-static void r600_query_hw_add_result(struct r600_common_context *ctx,
+static void r600_query_hw_add_result(struct r600_common_screen *rscreen,
 				     struct r600_query_hw *, void *buffer,
 				     union pipe_query_result *result);
 static void r600_query_hw_clear_result(struct r600_query_hw *,
 				       union pipe_query_result *);
 
 static struct r600_query_hw_ops query_hw_default_hw_ops = {
 	.prepare_buffer = r600_query_hw_prepare_buffer,
 	.emit_start = r600_query_hw_do_emit_start,
 	.emit_stop = r600_query_hw_do_emit_stop,
 	.clear_result = r600_query_hw_clear_result,
@@ -1030,26 +1030,26 @@ static unsigned r600_query_read_result(void *map, unsigned start_index, unsigned
 	end = (uint64_t)current_result[end_index] |
 	      (uint64_t)current_result[end_index+1] << 32;
 
 	if (!test_status_bit ||
 	    ((start & 0x8000000000000000UL) && (end & 0x8000000000000000UL))) {
 		return end - start;
 	}
 	return 0;
 }
 
-static void r600_query_hw_add_result(struct r600_common_context *ctx,
+static void r600_query_hw_add_result(struct r600_common_screen *rscreen,
 				     struct r600_query_hw *query,
 				     void *buffer,
 				     union pipe_query_result *result)
 {
-	unsigned max_rbs = ctx->screen->info.num_render_backends;
+	unsigned max_rbs = rscreen->info.num_render_backends;
 
 	switch (query->b.type) {
 	case PIPE_QUERY_OCCLUSION_COUNTER: {
 		for (unsigned i = 0; i < max_rbs; ++i) {
 			unsigned results_base = i * 16;
 			result->u64 +=
 				r600_query_read_result(buffer + results_base, 0, 2, true);
 		}
 		break;
 	}
@@ -1085,21 +1085,21 @@ static void r600_query_hw_add_result(struct r600_common_context *ctx,
 			r600_query_read_result(buffer, 2, 6, true);
 		result->so_statistics.primitives_storage_needed +=
 			r600_query_read_result(buffer, 0, 4, true);
 		break;
 	case PIPE_QUERY_SO_OVERFLOW_PREDICATE:
 		result->b = result->b ||
 			r600_query_read_result(buffer, 2, 6, true) !=
 			r600_query_read_result(buffer, 0, 4, true);
 		break;
 	case PIPE_QUERY_PIPELINE_STATISTICS:
-		if (ctx->chip_class >= EVERGREEN) {
+		if (rscreen->chip_class >= EVERGREEN) {
 			result->pipeline_statistics.ps_invocations +=
 				r600_query_read_result(buffer, 0, 22, false);
 			result->pipeline_statistics.c_primitives +=
 				r600_query_read_result(buffer, 2, 24, false);
 			result->pipeline_statistics.c_invocations +=
 				r600_query_read_result(buffer, 4, 26, false);
 			result->pipeline_statistics.vs_invocations +=
 				r600_query_read_result(buffer, 6, 28, false);
 			result->pipeline_statistics.gs_invocations +=
 				r600_query_read_result(buffer, 8, 30, false);
@@ -1183,46 +1183,47 @@ static void r600_get_query_result_resource(struct pipe_context *ctx,
 static void r600_query_hw_clear_result(struct r600_query_hw *query,
 				       union pipe_query_result *result)
 {
 	util_query_clear_result(result, query->b.type);
 }
 
 bool r600_query_hw_get_result(struct r600_common_context *rctx,
 			      struct r600_query *rquery,
 			      bool wait, union pipe_query_result *result)
 {
+	struct r600_common_screen *rscreen = rctx->screen;
 	struct r600_query_hw *query = (struct r600_query_hw *)rquery;
 	struct r600_query_buffer *qbuf;
 
 	query->ops->clear_result(query, result);
 
 	for (qbuf = &query->buffer; qbuf; qbuf = qbuf->previous) {
 		unsigned results_base = 0;
 		void *map;
 
 		map = r600_buffer_map_sync_with_rings(rctx, qbuf->buf,
 						      PIPE_TRANSFER_READ |
 						      (wait ? 0 : PIPE_TRANSFER_DONTBLOCK));
 		if (!map)
 			return false;
 
 		while (results_base != qbuf->results_end) {
-			query->ops->add_result(rctx, query, map + results_base,
+			query->ops->add_result(rscreen, query, map + results_base,
 					       result);
 			results_base += query->result_size;
 		}
 	}
 
 	/* Convert the time to expected units. */
 	if (rquery->type == PIPE_QUERY_TIME_ELAPSED ||
 	    rquery->type == PIPE_QUERY_TIMESTAMP) {
-		result->u64 = (1000000 * result->u64) / rctx->screen->info.clock_crystal_freq;
+		result->u64 = (1000000 * result->u64) / rscreen->info.clock_crystal_freq;
 	}
 	return true;
 }
 
 /* Create the compute shader that is used to collect the results.
  *
  * One compute grid with a single thread is launched for every query result
  * buffer. The thread (optionally) reads a previous summary buffer, then
  * accumulates data from the query result buffer, and writes the result either
  * to a summary buffer to be consumed by the next grid invocation or to the
diff --git a/src/gallium/drivers/radeon/r600_query.h b/src/gallium/drivers/radeon/r600_query.h
index d39663a..b9ab44c 100644
--- a/src/gallium/drivers/radeon/r600_query.h
+++ b/src/gallium/drivers/radeon/r600_query.h
@@ -145,21 +145,21 @@ struct r600_query_hw_ops {
 	bool (*prepare_buffer)(struct r600_common_screen *,
 			       struct r600_query_hw *,
 			       struct r600_resource *);
 	void (*emit_start)(struct r600_common_context *,
 			   struct r600_query_hw *,
 			   struct r600_resource *buffer, uint64_t va);
 	void (*emit_stop)(struct r600_common_context *,
 			  struct r600_query_hw *,
 			  struct r600_resource *buffer, uint64_t va);
 	void (*clear_result)(struct r600_query_hw *, union pipe_query_result *);
-	void (*add_result)(struct r600_common_context *ctx,
+	void (*add_result)(struct r600_common_screen *screen,
 			   struct r600_query_hw *, void *buffer,
 			   union pipe_query_result *result);
 };
 
 struct r600_query_buffer {
 	/* The buffer where query results are stored. */
 	struct r600_resource		*buf;
 	/* Offset of the next free result after current query data */
 	unsigned			results_end;
 	/* If a query buffer is full, a new buffer is created and the old one
-- 
2.7.4



More information about the mesa-dev mailing list