Mesa (master): r600g: the type of OCCLUSION_PREDICATE result should be boolean

Marek Olšák mareko at kemper.freedesktop.org
Thu Nov 10 23:08:43 UTC 2011


Module: Mesa
Branch: master
Commit: 72c1658554b2d1e90e687340c5db4fec939b3901
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=72c1658554b2d1e90e687340c5db4fec939b3901

Author: Marek Olšák <maraeo at gmail.com>
Date:   Thu Nov 10 23:38:31 2011 +0100

r600g: the type of OCCLUSION_PREDICATE result should be boolean

---

 src/gallium/drivers/r600/r600.h            |    5 ++++-
 src/gallium/drivers/r600/r600_hw_context.c |   19 +++++++++++--------
 src/gallium/drivers/r600/r600_query.c      |    4 ++--
 3 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/r600/r600.h b/src/gallium/drivers/r600/r600.h
index 28c1ee1..f04bcae 100644
--- a/src/gallium/drivers/r600/r600.h
+++ b/src/gallium/drivers/r600/r600.h
@@ -164,7 +164,10 @@ struct r600_range {
 };
 
 struct r600_query {
-	u64					result;
+	union {
+		uint64_t			u64;
+		boolean				b;
+	} result;
 	/* The kind of query */
 	unsigned				type;
 	/* Offset of the first result for current query */
diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c
index 867c6a0..c510167 100644
--- a/src/gallium/drivers/r600/r600_hw_context.c
+++ b/src/gallium/drivers/r600/r600_hw_context.c
@@ -1617,21 +1617,21 @@ static boolean r600_query_result(struct r600_context *ctx, struct r600_query *qu
 	switch (query->type) {
 	case PIPE_QUERY_OCCLUSION_COUNTER:
 		while (results_base != query->results_end) {
-			query->result +=
+			query->result.u64 +=
 				r600_query_read_result(map + results_base, 0, 2, true);
 			results_base = (results_base + 16) % query->buffer->b.b.b.width0;
 		}
 		break;
 	case PIPE_QUERY_OCCLUSION_PREDICATE:
 		while (results_base != query->results_end) {
-			query->result = query->result ||
-				r600_query_read_result(map + results_base, 0, 2, true);
+			query->result.b = query->result.b ||
+				r600_query_read_result(map + results_base, 0, 2, true) != 0;
 			results_base = (results_base + 16) % query->buffer->b.b.b.width0;
 		}
 		break;
 	case PIPE_QUERY_TIME_ELAPSED:
 		while (results_base != query->results_end) {
-			query->result +=
+			query->result.u64 +=
 				r600_query_read_result(map + results_base, 0, 2, false);
 			results_base = (results_base + query->result_size) % query->buffer->b.b.b.width0;
 		}
@@ -1830,24 +1830,27 @@ boolean r600_context_query_result(struct r600_context *ctx,
 				struct r600_query *query,
 				boolean wait, void *vresult)
 {
-	uint64_t *result = (uint64_t*)vresult;
+	boolean *result_b = (boolean*)vresult;
+	uint64_t *result_u64 = (uint64_t*)vresult;
 
 	if (!r600_query_result(ctx, query, wait))
 		return FALSE;
 
 	switch (query->type) {
 	case PIPE_QUERY_OCCLUSION_COUNTER:
+		*result_u64 = query->result.u64;
+		break;
 	case PIPE_QUERY_OCCLUSION_PREDICATE:
-		*result = query->result;
+		*result_b = query->result.b;
 		break;
 	case PIPE_QUERY_TIME_ELAPSED:
-		*result = (1000000 * query->result) / ctx->screen->info.r600_clock_crystal_freq;
+		*result_u64 = (1000000 * query->result.u64) / ctx->screen->info.r600_clock_crystal_freq;
 		break;
 	default:
 		assert(0);
 	}
 
-	query->result = 0;
+	memset(&query->result, 0, sizeof(query->result));
 	return TRUE;
 }
 
diff --git a/src/gallium/drivers/r600/r600_query.c b/src/gallium/drivers/r600/r600_query.c
index afdb038..ec0d91f 100644
--- a/src/gallium/drivers/r600/r600_query.c
+++ b/src/gallium/drivers/r600/r600_query.c
@@ -42,7 +42,7 @@ static void r600_begin_query(struct pipe_context *ctx, struct pipe_query *query)
 	struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
 	struct r600_query *rquery = (struct r600_query *)query;
 
-	rquery->result = 0;
+	memset(&rquery->result, 0, sizeof(rquery->result));
 	rquery->results_start = rquery->results_end;
 	r600_query_begin(&rctx->ctx, (struct r600_query *)query);
 	LIST_ADDTAIL(&rquery->list, &rctx->ctx.active_query_list);
@@ -76,7 +76,7 @@ static void r600_render_condition(struct pipe_context *ctx,
 	int wait_flag = 0;
 
 	/* If we already have nonzero result, render unconditionally */
-	if (query != NULL && rquery->result != 0) {
+	if (query != NULL && rquery->result.u64 != 0) {
 		if (rctx->current_render_cond) {
 			r600_render_condition(ctx, NULL, 0);
 		}




More information about the mesa-commit mailing list