diff options
author | Dave Airlie <[email protected]> | 2018-08-07 01:41:20 +0100 |
---|---|---|
committer | Dave Airlie <[email protected]> | 2018-08-21 20:45:38 +0100 |
commit | 32529e60849dd20d167f14cb8542c5798343f0e0 (patch) | |
tree | 91003a038f71084695c86be8b3a889648a282c90 /src/gallium/drivers/r600/evergreen_compute.c | |
parent | 41d58e20983576212636c11afd6ca25ebd60b68f (diff) |
r600/eg: rework atomic counter emission with flushes
With the current code, we didn't do the space checks prior
to atomic counter setup emission, but we also didn't add
atomic counters to the space check so we could get a flush
later as well.
These flushes would be bad, and lead to problems with
parallel tests. We have to ensure the atomic counter copy in,
draw emits and counter copy out are kept in the same command
submission unit.
This reworks the code to drop some useless masks, make the
counting separate to the emits, and make the space checker
handle atomic counter space.
[airlied: want this in 18.2]
Fixes: 06993e4ee (r600: add support for hw atomic counters. (v3))
Diffstat (limited to 'src/gallium/drivers/r600/evergreen_compute.c')
-rw-r--r-- | src/gallium/drivers/r600/evergreen_compute.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index 90eae1e2829..a77f58242e3 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -715,7 +715,6 @@ static void compute_emit_cs(struct r600_context *rctx, rctx->cmd_buf_is_compute = true; } - r600_need_cs_space(rctx, 0, true); if (rctx->cs_shader_state.shader->ir_type == PIPE_SHADER_IR_TGSI) { r600_shader_select(&rctx->b.b, rctx->cs_shader_state.shader->sel, &compute_dirty); current = rctx->cs_shader_state.shader->sel->current; @@ -742,16 +741,22 @@ static void compute_emit_cs(struct r600_context *rctx, } rctx->cs_block_grid_sizes[3] = rctx->cs_block_grid_sizes[7] = 0; rctx->driver_consts[PIPE_SHADER_COMPUTE].cs_block_grid_size_dirty = true; + + evergreen_emit_atomic_buffer_setup_count(rctx, current, combined_atomics, &atomic_used_mask); + r600_need_cs_space(rctx, 0, true, util_bitcount(atomic_used_mask)); + if (need_buf_const) { eg_setup_buffer_constants(rctx, PIPE_SHADER_COMPUTE); } r600_update_driver_const_buffers(rctx, true); - if (evergreen_emit_atomic_buffer_setup(rctx, current, combined_atomics, &atomic_used_mask)) { + evergreen_emit_atomic_buffer_setup(rctx, true, combined_atomics, atomic_used_mask); + if (atomic_used_mask) { radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0)); radeon_emit(cs, EVENT_TYPE(EVENT_TYPE_CS_PARTIAL_FLUSH) | EVENT_INDEX(4)); } - } + } else + r600_need_cs_space(rctx, 0, true, 0); /* Initialize all the compute-related registers. * |