diff options
author | Tom Stellard <[email protected]> | 2014-01-24 15:48:26 -0500 |
---|---|---|
committer | Tom Stellard <[email protected]> | 2014-01-27 11:09:15 -0500 |
commit | d51dbe048afd2131eb3675e9cd868ce73325a61d (patch) | |
tree | 7b09236837020ff5c792eb706d816969b7277128 /src/gallium/drivers/r600/evergreen_compute.c | |
parent | 3518606c149393a656a653459972ef35aa527c55 (diff) |
r600g/compute: Emit DEALLOC_STATE on cayman after dispatching a compute shader.
This is necessary to prevent the next SURFACE_SYNC packet from
hanging the GPU.
https://bugs.freedesktop.org/show_bug.cgi?id=73418
Reviewed-by: Marek Olšák <[email protected]>
Reviewed-by: Alex Deucher <[email protected]>
CC: "9.2" "10.0" <[email protected]>
Diffstat (limited to 'src/gallium/drivers/r600/evergreen_compute.c')
-rw-r--r-- | src/gallium/drivers/r600/evergreen_compute.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/gallium/drivers/r600/evergreen_compute.c b/src/gallium/drivers/r600/evergreen_compute.c index a2db69b6fac..70efe5c5a87 100644 --- a/src/gallium/drivers/r600/evergreen_compute.c +++ b/src/gallium/drivers/r600/evergreen_compute.c @@ -489,7 +489,14 @@ static void compute_emit_cs(struct r600_context *ctx, const uint *block_layout, ctx->b.flags = 0; if (ctx->b.chip_class >= CAYMAN) { - ctx->skip_surface_sync_on_next_cs_flush = true; + cs->buf[cs->cdw++] = PKT3(PKT3_EVENT_WRITE, 0, 0); + cs->buf[cs->cdw++] = EVENT_TYPE(EVENT_TYPE_CS_PARTIAL_FLUSH) | EVENT_INDEX(4); + /* DEALLOC_STATE prevents the GPU from hanging when a + * SURFACE_SYNC packet is emitted some time after a DISPATCH_DIRECT + * with any of the CB*_DEST_BASE_ENA or DB_DEST_BASE_ENA bits set. + */ + cs->buf[cs->cdw++] = PKT3C(PKT3_DEALLOC_STATE, 0, 0); + cs->buf[cs->cdw++] = 0; } #if 0 |