r600g: fix streamout on RS780 and RS880

The latest kernel from git is required. Transform feedback (along with GL3.0)
is turned off on older kernels.
This commit is contained in:
Marek Olšák 2012-09-25 01:43:49 +02:00
parent 588263e7a7
commit d063c7b142
2 changed files with 14 additions and 7 deletions

View File

@ -1019,10 +1019,11 @@ 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 */
(ctx->family >= CHIP_RS780 &&
ctx->family <= CHIP_RV740 ? 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 */
(ctx->family > CHIP_R600 && ctx->family < CHIP_RS780 ? 2 : 0) + /* SURFACE_BASE_UPDATE */
ctx->num_cs_dw_streamout_end, TRUE);
if (ctx->chip_class >= EVERGREEN) {
@ -1055,7 +1056,7 @@ void r600_context_streamout_begin(struct r600_context *ctx)
/* R7xx requires this packet after updating BUFFER_BASE.
* Without this, R7xx locks up. */
if (ctx->chip_class == R700) {
if (ctx->family >= CHIP_RS780 && ctx->family <= CHIP_RV740) {
cs->buf[cs->cdw++] = PKT3(PKT3_STRMOUT_BASE_UPDATE, 1, 0);
cs->buf[cs->cdw++] = i;
cs->buf[cs->cdw++] = va >> 8;
@ -1095,7 +1096,7 @@ void r600_context_streamout_begin(struct r600_context *ctx)
}
}
if (ctx->family > CHIP_R600 && ctx->family < CHIP_RV770) {
if (ctx->family > CHIP_R600 && ctx->family < CHIP_RS780) {
cs->buf[cs->cdw++] = PKT3(PKT3_SURFACE_BASE_UPDATE, 0, 0);
cs->buf[cs->cdw++] = update_flags;
}

View File

@ -949,13 +949,19 @@ struct pipe_screen *r600_screen_create(struct radeon_winsys *ws)
/* Figure out streamout kernel support. */
switch (rscreen->chip_class) {
case R600:
case EVERGREEN:
case CAYMAN:
rscreen->has_streamout = rscreen->info.drm_minor >= 14;
if (rscreen->family < CHIP_RS780) {
rscreen->has_streamout = rscreen->info.drm_minor >= 14;
} else {
rscreen->has_streamout = rscreen->info.drm_minor >= 23;
}
break;
case R700:
rscreen->has_streamout = rscreen->info.drm_minor >= 17;
break;
case EVERGREEN:
case CAYMAN:
rscreen->has_streamout = rscreen->info.drm_minor >= 14;
break;
}
if (r600_init_tiling(rscreen)) {