r600g: use modulo for computing index into query (ring) buffers
authorMarek Olšák <maraeo@gmail.com>
Tue, 8 Nov 2011 22:05:36 +0000 (23:05 +0100)
committerMarek Olšák <maraeo@gmail.com>
Tue, 8 Nov 2011 23:18:53 +0000 (00:18 +0100)
src/gallium/drivers/r600/r600_hw_context.c

index c854307bde2595d745e5ad7e1c81ee5f4fea0cea..6e3080ddc5156abbfdb0317cdf8863130bf4426d 100644 (file)
@@ -1640,9 +1640,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query)
                r600_context_flush(ctx, RADEON_FLUSH_ASYNC);
        }
 
-       new_results_end = query->results_end + query->result_size;
-       if (new_results_end >= query->buffer->b.b.b.width0)
-               new_results_end = 0;
+       new_results_end = (query->results_end + query->result_size) % query->buffer->b.b.b.width0;
 
        /* collect current results if query buffer is full */
        if (new_results_end == query->results_start) {
@@ -1718,10 +1716,7 @@ void r600_query_end(struct r600_context *ctx, struct r600_query *query)
        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0, 0);
        ctx->pm4[ctx->pm4_cdwords++] = r600_context_bo_reloc(ctx, query->buffer, RADEON_USAGE_WRITE);
 
-       query->results_end += query->result_size;
-       if (query->results_end >= query->buffer->b.b.b.width0)
-               query->results_end = 0;
-
+       query->results_end = (query->results_end + query->result_size) % query->buffer->b.b.b.width0;
        ctx->num_query_running--;
 }
 
@@ -1741,10 +1736,7 @@ void r600_query_predication(struct r600_context *ctx, struct r600_query *query,
                u32 op;
 
                /* find count of the query data blocks */
-               count = query->buffer->b.b.b.width0 + query->results_end - query->results_start;
-               if (count >= query->buffer->b.b.b.width0) {
-                       count -= query->buffer->b.b.b.width0;
-               }
+               count = (query->buffer->b.b.b.width0 + query->results_end - query->results_start) % query->buffer->b.b.b.width0;
                count /= query->result_size;
 
                if (ctx->pm4_cdwords + 5 * count > ctx->pm4_ndwords)
@@ -1761,9 +1753,8 @@ void r600_query_predication(struct r600_context *ctx, struct r600_query *query,
                        ctx->pm4[ctx->pm4_cdwords++] = PKT3(PKT3_NOP, 0, 0);
                        ctx->pm4[ctx->pm4_cdwords++] = r600_context_bo_reloc(ctx, query->buffer,
                                                                             RADEON_USAGE_READ);
-                       results_base += query->result_size;
-                       if (results_base >= query->buffer->b.b.b.width0)
-                               results_base = 0;
+                       results_base = (results_base + query->result_size) % query->buffer->b.b.b.width0;
+
                        /* set CONTINUE bit for all packets except the first */
                        op |= PREDICATION_CONTINUE;
                }