r600g: fix OQ on evergreen
authorAlex Deucher <alexdeucher@gmail.com>
Mon, 31 Jan 2011 07:47:54 +0000 (02:47 -0500)
committerAlex Deucher <alexdeucher@gmail.com>
Mon, 31 Jan 2011 07:49:27 +0000 (02:49 -0500)
6xx/7xx have a max of 4 DBs, evergreen have a max of 8.

Signed-off-by: Alex Deucher <alexdeucher@gmail.com>
src/gallium/drivers/r600/r600.h
src/gallium/winsys/r600/drm/r600_hw_context.c

index 15cfb7f0c463ac4d8d734b820cb68c5cf2b98179..64c52bca795a248bed777e55002796d733413fee 100644 (file)
@@ -250,7 +250,7 @@ struct r600_context {
        struct list_head        query_list;
        unsigned                num_query_running;
        struct list_head        fenced_bo;
-       unsigned                num_db; /* for OQ */
+       unsigned                max_db; /* for OQ */
 };
 
 struct r600_draw {
index 53879a57fa508f6202845e7080471fc4da0700c4..f4e2aaa772cdea66a19f8e7a01ec4e3826a3a3a1 100644 (file)
@@ -753,7 +753,10 @@ int r600_context_init(struct r600_context *ctx, struct radeon *radeon)
        LIST_INITHEAD(&ctx->dirty);
 
        /* TODO update this value correctly */
-       ctx->num_db = 4;
+       if (radeon->family >= CHIP_CEDAR)
+               ctx->max_db = 8;
+       else
+               ctx->max_db = 4;
 
        return 0;
 out_err:
@@ -1265,7 +1268,7 @@ static boolean r600_query_result(struct r600_context *ctx, struct r600_query *qu
        if (!results)
                return FALSE;
 
-       size = query->num_results * (query->type == PIPE_QUERY_OCCLUSION_COUNTER ? ctx->num_db : 1);
+       size = query->num_results * (query->type == PIPE_QUERY_OCCLUSION_COUNTER ? ctx->max_db : 1);
        for (i = 0; i < size; i += 4) {
                start = (u64)results[i] | (u64)results[i + 1] << 32;
                end = (u64)results[i + 2] | (u64)results[i + 3] << 32;
@@ -1344,7 +1347,7 @@ void r600_query_end(struct r600_context *ctx, struct r600_query *query)
        ctx->pm4[ctx->pm4_cdwords++] = 0;
        r600_context_bo_reloc(ctx, &ctx->pm4[ctx->pm4_cdwords - 1], query->buffer);
 
-       query->num_results += 4 * (query->type == PIPE_QUERY_OCCLUSION_COUNTER ? ctx->num_db : 1);
+       query->num_results += 4 * (query->type == PIPE_QUERY_OCCLUSION_COUNTER ? ctx->max_db : 1);
        query->state ^= R600_QUERY_STATE_STARTED;
        query->state |= R600_QUERY_STATE_ENDED;
        ctx->num_query_running--;