diff options
author | Marek Olšák <marek.olsak@amd.com> | 2014-09-03 13:58:57 +0200 |
---|---|---|
committer | Marek Olšák <marek.olsak@amd.com> | 2014-09-04 16:15:21 +0200 |
commit | 3dbf55c1be5a8867616e475d943c776d8245d0cc (patch) | |
tree | 59485e2fedc40c450004ae2d52e45280d6655d9c | |
parent | 374f3e9e19f064007ea8a864fbd00f1ae7deafd1 (diff) |
r600g,radeonsi: make sure there's enough CS space before resuming queries
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83432
Cc: "10.2 10.3" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
-rw-r--r-- | src/gallium/drivers/radeon/r600_query.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c index 503737ca3e..590db13f0a 100644 --- a/src/gallium/drivers/radeon/r600_query.c +++ b/src/gallium/drivers/radeon/r600_query.c @@ -807,12 +807,40 @@ void r600_suspend_nontimer_queries(struct r600_common_context *ctx) assert(ctx->num_cs_dw_nontimer_queries_suspend == 0); } +static unsigned r600_queries_num_cs_dw_for_resuming(struct r600_common_context *ctx) +{ + struct r600_query *query; + unsigned num_dw = 0; + + LIST_FOR_EACH_ENTRY(query, &ctx->active_nontimer_queries, list) { + /* begin + end */ + num_dw += query->num_cs_dw * 2; + + /* Workaround for the fact that + * num_cs_dw_nontimer_queries_suspend is incremented for every + * resumed query, which raises the bar in need_cs_space for + * queries about to be resumed. + */ + num_dw += query->num_cs_dw; + } + /* primitives generated query */ + num_dw += ctx->streamout.enable_atom.num_dw; + /* guess for ZPASS enable or PERFECT_ZPASS_COUNT enable updates */ + num_dw += 13; + + return num_dw; +} + void r600_resume_nontimer_queries(struct r600_common_context *ctx) { struct r600_query *query; assert(ctx->num_cs_dw_nontimer_queries_suspend == 0); + /* Check CS space here. Resuming must not be interrupted by flushes. */ + ctx->need_gfx_cs_space(&ctx->b, + r600_queries_num_cs_dw_for_resuming(ctx), TRUE); + LIST_FOR_EACH_ENTRY(query, &ctx->active_nontimer_queries, list) { r600_emit_query_begin(ctx, query); } |