diff options
author | Marek Olšák <[email protected]> | 2012-06-14 22:32:51 +0200 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2012-06-15 22:43:00 +0200 |
commit | cb4d1d377d7a1143db48feb48ef54dfa3b29487d (patch) | |
tree | d19a4e7b7f457801fbc253cb7f53a64a77a6a1b2 | |
parent | f01594be0ee34758fc62274b9e967a2a4c3595df (diff) |
r600g: fix lockups with streamout on r7xx
This requires the latest streamout kernel patches.
Streamout is disabled by default on r7xx, so this patch is safe for regular
users.
Reviewed-by: Alex Deucher <[email protected]>
-rw-r--r-- | src/gallium/drivers/r600/r600_hw_context.c | 14 | ||||
-rw-r--r-- | src/gallium/drivers/r600/r600d.h | 1 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/gallium/drivers/r600/r600_hw_context.c b/src/gallium/drivers/r600/r600_hw_context.c index 1b1c6f4af65..9303d09167c 100644 --- a/src/gallium/drivers/r600/r600_hw_context.c +++ b/src/gallium/drivers/r600/r600_hw_context.c @@ -1331,6 +1331,7 @@ void r600_context_streamout_begin(struct r600_context *ctx) 12 + /* flush_vgt_streamout */ 6 + /* set_streamout_enable */ util_bitcount(buffer_en) * 7 + /* SET_CONTEXT_REG */ + (ctx->chip_class == R700 ? util_bitcount(buffer_en) * 5 : 0) + /* STRMOUT_BASE_UPDATE */ util_bitcount(buffer_en & ctx->streamout_append_bitmask) * 8 + /* STRMOUT_BUFFER_UPDATE */ util_bitcount(buffer_en & ~ctx->streamout_append_bitmask) * 6 + /* STRMOUT_BUFFER_UPDATE */ (ctx->family > CHIP_R600 && ctx->family < CHIP_RV770 ? 2 : 0) + /* SURFACE_BASE_UPDATE */ @@ -1366,6 +1367,19 @@ void r600_context_streamout_begin(struct r600_context *ctx) r600_context_bo_reloc(ctx, r600_resource(t[i]->b.buffer), RADEON_USAGE_WRITE); + /* R7xx requires this packet after updating BUFFER_BASE. + * Without this, R7xx locks up. */ + if (ctx->chip_class == R700) { + cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BASE_UPDATE, 1, 0); + cs->buf[cs->cdw++] = i; + cs->buf[cs->cdw++] = va >> 8; + + cs->buf[cs->cdw++] = PKT3(PKT3_NOP, 0, 0); + cs->buf[cs->cdw++] = + r600_context_bo_reloc(ctx, r600_resource(t[i]->b.buffer), + RADEON_USAGE_WRITE); + } + if (ctx->streamout_append_bitmask & (1 << i)) { va = r600_resource_va(&ctx->screen->screen, (void*)t[i]->filled_size); diff --git a/src/gallium/drivers/r600/r600d.h b/src/gallium/drivers/r600/r600d.h index 933d99e1a4b..ab36d73b14f 100644 --- a/src/gallium/drivers/r600/r600d.h +++ b/src/gallium/drivers/r600/r600d.h @@ -106,6 +106,7 @@ #define PKT3_SET_RESOURCE 0x6D #define PKT3_SET_SAMPLER 0x6E #define PKT3_SET_CTL_CONST 0x6F +#define PKT3_STRMOUT_BASE_UPDATE 0x72 #define PKT3_SURFACE_BASE_UPDATE 0x73 #define SURFACE_BASE_UPDATE_DEPTH (1 << 0) #define SURFACE_BASE_UPDATE_COLOR(x) (2 << (x)) |