summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorNicolai Hähnle <[email protected]>2017-07-27 19:41:26 +0200
committerNicolai Hähnle <[email protected]>2017-08-02 09:49:06 +0200
commit1c5b7d5235d2174c415928759c0fdacba31f2d28 (patch)
treeb96969298e8167a5c6eb0684080caa0189df901b /src/gallium
parentdfc1502c841863b01481f5e88af658f699cca12e (diff)
radeonsi: avoid redundant SET_PREDICATION packet with QBO workaround
The QBO workaround compute grid launch emits the render condition atom when dirty, so install the render condition in the context only after launching the compute grid. This avoids a redundant SET_PREDICATION. Reviewed-by: Marek Olšák <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/radeon/r600_query.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/gallium/drivers/radeon/r600_query.c b/src/gallium/drivers/radeon/r600_query.c
index 5879a07586c..4069d2eb90a 100644
--- a/src/gallium/drivers/radeon/r600_query.c
+++ b/src/gallium/drivers/radeon/r600_query.c
@@ -1790,10 +1790,6 @@ static void r600_render_condition(struct pipe_context *ctx,
struct r600_query_buffer *qbuf;
struct r600_atom *atom = &rctx->render_cond_atom;
- rctx->render_cond = query;
- rctx->render_cond_invert = condition;
- rctx->render_cond_mode = mode;
-
/* Compute the size of SET_PREDICATION packets. */
atom->num_dw = 0;
if (query) {
@@ -1820,6 +1816,11 @@ static void r600_render_condition(struct pipe_context *ctx,
&rquery->workaround_offset,
(struct pipe_resource **)&rquery->workaround_buf);
+ /* Reset to NULL to avoid a redundant SET_PREDICATION
+ * from launching the compute grid.
+ */
+ rctx->render_cond = NULL;
+
ctx->get_query_result_resource(
ctx, query, true, PIPE_QUERY_TYPE_U64, 0,
&rquery->workaround_buf->b.b, rquery->workaround_offset);
@@ -1836,6 +1837,10 @@ static void r600_render_condition(struct pipe_context *ctx,
}
}
+ rctx->render_cond = query;
+ rctx->render_cond_invert = condition;
+ rctx->render_cond_mode = mode;
+
rctx->set_atom_dirty(rctx, atom, query != NULL);
}