diff options
author | Jerome Glisse <jglisse@redhat.com> | 2010-09-26 12:06:46 -0400 |
---|---|---|
committer | Jerome Glisse <jglisse@redhat.com> | 2010-09-26 12:06:46 -0400 |
commit | a852615946b98de2d832d4907f09649803577db7 (patch) | |
tree | 2d5def85d8c6c573d9f839cbf28673e24783fb7a /src/gallium/winsys/r600/drm/r600_state2.c | |
parent | 6f16e497af9bf5938541d2088e91cc79f1641a19 (diff) |
r600g: disable early cull optimization when occlusion query running
When occlusion query are running we want to have accurate
fragment count thus disable any early culling optimization
GPU has.
Based on work from Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Diffstat (limited to 'src/gallium/winsys/r600/drm/r600_state2.c')
-rw-r--r-- | src/gallium/winsys/r600/drm/r600_state2.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/src/gallium/winsys/r600/drm/r600_state2.c b/src/gallium/winsys/r600/drm/r600_state2.c index e1f32da91b..d60c37fc90 100644 --- a/src/gallium/winsys/r600/drm/r600_state2.c +++ b/src/gallium/winsys/r600/drm/r600_state2.c @@ -943,6 +943,20 @@ void r600_context_draw(struct r600_context *ctx, const struct r600_draw *draw) } } + /* queries need some special values */ + if (ctx->num_query_running) { + if (ctx->radeon->family >= CHIP_RV770) { + r600_context_reg(ctx, R600_GROUP_CONTEXT, + R_028D0C_DB_RENDER_CONTROL, + S_028D0C_R700_PERFECT_ZPASS_COUNTS(1), + S_028D0C_R700_PERFECT_ZPASS_COUNTS(1)); + } + r600_context_reg(ctx, R600_GROUP_CONTEXT, + R_028D10_DB_RENDER_OVERRIDE, + S_028D10_NOOP_CULL_DISABLE(1), + S_028D10_NOOP_CULL_DISABLE(1)); + } + if ((ctx->pm4_dirty_cdwords + ndwords + ctx->pm4_cdwords) > ctx->pm4_ndwords) { /* need to flush */ r600_context_flush(ctx); @@ -1181,6 +1195,7 @@ void r600_query_begin(struct r600_context *ctx, struct r600_query *query) query->state |= R600_QUERY_STATE_STARTED; query->state ^= R600_QUERY_STATE_ENDED; + ctx->num_query_running++; } void r600_query_end(struct r600_context *ctx, struct r600_query *query) @@ -1197,6 +1212,7 @@ void r600_query_end(struct r600_context *ctx, struct r600_query *query) query->num_results += 16; query->state ^= R600_QUERY_STATE_STARTED; query->state |= R600_QUERY_STATE_ENDED; + ctx->num_query_running--; } struct r600_query *r600_context_query_create(struct r600_context *ctx, unsigned query_type) |