diff options
author | Marek Olšák <[email protected]> | 2014-03-09 22:12:26 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2014-03-11 18:51:20 +0100 |
commit | f549129564e018e21f58483f697cc7073854247b (patch) | |
tree | 1effcfe3311d02629a33fe1dd2c927a3c83eb0a6 /src/gallium/drivers/radeonsi | |
parent | 958ef47a6dea652d79a676625b69b3dec6042395 (diff) |
r600g, radeonsi: fix primitives-generated query with disabled streamout
Buffers are disabled by VGT_STRMOUT_BUFFER_CONFIG, but the query only works
if VGT_STRMOUT_CONFIG.STREAMOUT_0_EN is enabled.
This moves VGT_STRMOUT_CONFIG to its own state. The register is set to 1
if either streamout or the primitives-generated query is enabled.
However, the primitives-emitted query is also incremented, so it's disabled
by setting VGT_STRMOUT_BUFFER_SIZE to 0 when there is no buffer bound.
This fixes piglit:
ARB_transform_feedback2/counting with pause
EXT_transform_feedback/primgen-query transform-feedback-disabled
Reviewed-by: Michel Dänzer <[email protected]>
Diffstat (limited to 'src/gallium/drivers/radeonsi')
-rw-r--r-- | src/gallium/drivers/radeonsi/si_hw_context.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_pipe.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_pipe.h | 1 | ||||
-rw-r--r-- | src/gallium/drivers/radeonsi/si_state.c | 1 |
4 files changed, 3 insertions, 1 deletions
diff --git a/src/gallium/drivers/radeonsi/si_hw_context.c b/src/gallium/drivers/radeonsi/si_hw_context.c index 21a683ff5f7..c952c8d31f7 100644 --- a/src/gallium/drivers/radeonsi/si_hw_context.c +++ b/src/gallium/drivers/radeonsi/si_hw_context.c @@ -177,6 +177,7 @@ void si_begin_new_cs(struct si_context *ctx) } ctx->framebuffer.atom.dirty = true; + ctx->b.streamout.enable_atom.dirty = true; si_all_descriptors_begin_new_cs(ctx); ctx->b.initial_gfx_cs_size = ctx->b.rings.gfx.cs->cdw; diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 95f022be874..0efd4ebcb85 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -148,6 +148,7 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, void * sctx->atoms.cache_flush = &sctx->cache_flush; sctx->atoms.streamout_begin = &sctx->b.streamout.begin_atom; + sctx->atoms.streamout_enable = &sctx->b.streamout.enable_atom; switch (sctx->b.chip_class) { case SI: diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index e8aa13e2df8..47dc8e754ee 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -108,6 +108,7 @@ struct si_context { * updated in memory. */ struct r600_atom *cache_flush; struct r600_atom *streamout_begin; + struct r600_atom *streamout_enable; /* must be after streamout_begin */ struct r600_atom *framebuffer; }; struct r600_atom *array[0]; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index b012d0991c1..8dd2885f70b 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -3064,7 +3064,6 @@ void si_init_config(struct si_context *sctx) si_pm4_set_reg(pm4, R_028B68_VGT_GS_VERT_ITEMSIZE_3, 0); si_pm4_set_reg(pm4, R_028B90_VGT_GS_INSTANCE_CNT, 0); - si_pm4_set_reg(pm4, R_028B94_VGT_STRMOUT_CONFIG, 0x0); si_pm4_set_reg(pm4, R_028B98_VGT_STRMOUT_BUFFER_CONFIG, 0x0); if (sctx->b.chip_class == SI) { si_pm4_set_reg(pm4, R_028AA8_IA_MULTI_VGT_PARAM, |