diff options
author | Wladimir J. van der Laan <laanwj@gmail.com> | 2017-11-01 11:17:53 +0100 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2017-11-02 10:58:48 +0100 |
commit | 8fbd82f464f26a56167f7962174b2b69756a105a (patch) | |
tree | f5bc646ce5e3cd7b33564b35005e2a4172a81c99 | |
parent | c39f39106d5578598f37bea235b4b0504ee6764e (diff) |
etnaviv: don't do resolve-in-place without valid TS
GC3000 resolve-in-place assumes that the TS state is configured.
If it is not, this will result in MMU errors. This is especially
apparent when using glGenMipmaps().
Fixes: 78ade659569e ("etnaviv: Do GC3000 resolve-in-place when possible")
Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Wladimir J. van der Laan <laanwj@gmail.com>
Tested-by: Chris Healy <cphealy@gmail.com>
Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_clear_blit.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_emit.c | 4 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_rs.c | 1 | ||||
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_rs.h | 2 |
4 files changed, 11 insertions, 0 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c index 7b3fc1822b..21f50b7c2e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c +++ b/src/gallium/drivers/etnaviv/etnaviv_clear_blit.c @@ -555,6 +555,7 @@ etna_try_rs_blit(struct pipe_context *pctx, } /* Set up color TS to source surface before blit, if needed */ + bool source_ts_valid = false; if (src->levels[blit_info->src.level].ts_size && src->levels[blit_info->src.level].ts_valid) { struct etna_reloc reloc; @@ -579,6 +580,8 @@ etna_try_rs_blit(struct pipe_context *pctx, etna_set_state(ctx->stream, VIVS_TS_COLOR_CLEAR_VALUE, src->levels[blit_info->src.level].clear_value); + + source_ts_valid = true; } else { etna_set_state(ctx->stream, VIVS_TS_MEM_CONFIG, ts_mem_config); } @@ -593,6 +596,7 @@ etna_try_rs_blit(struct pipe_context *pctx, .source_stride = src_lev->stride, .source_padded_width = src_lev->padded_width, .source_padded_height = src_lev->padded_height, + .source_ts_valid = source_ts_valid, .dest_format = translate_rs_format(dst_format), .dest_tiling = dst->layout, .dest = dst->bo, diff --git a/src/gallium/drivers/etnaviv/etnaviv_emit.c b/src/gallium/drivers/etnaviv/etnaviv_emit.c index 707b1e7349..5397aa33ce 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_emit.c +++ b/src/gallium/drivers/etnaviv/etnaviv_emit.c @@ -171,6 +171,10 @@ etna_submit_rs_state(struct etna_context *ctx, struct etna_cmd_stream *stream = ctx->stream; struct etna_coalesce coalesce; + if (cs->RS_KICKER_INPLACE && !cs->source_ts_valid) + /* Inplace resolve is no-op if TS is not configured */ + return; + ctx->stats.rs_operations++; if (cs->RS_KICKER_INPLACE) { diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index c9072c2645..60c2c39101 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -133,6 +133,7 @@ etna_compile_rs_state(struct etna_context *ctx, struct compiled_rs_state *cs, /* Total number of tiles (same as for autodisable) */ cs->RS_KICKER_INPLACE = rs->source_padded_width * rs->source_padded_height / 16; } + cs->source_ts_valid = rs->source_ts_valid; } void diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.h b/src/gallium/drivers/etnaviv/etnaviv_rs.h index 171d3fa009..41a596055f 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.h +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.h @@ -33,6 +33,7 @@ struct rs_state { uint8_t downsample_x : 1; /* Downsample in x direction */ uint8_t downsample_y : 1; /* Downsample in y direction */ + uint8_t source_ts_valid : 1; uint8_t source_format; /* RS_FORMAT_XXX */ uint8_t source_tiling; /* ETNA_LAYOUT_XXX */ @@ -61,6 +62,7 @@ struct rs_state { /* treat this as opaque structure */ struct compiled_rs_state { + uint8_t source_ts_valid : 1; uint32_t RS_CONFIG; uint32_t RS_SOURCE_STRIDE; uint32_t RS_DEST_STRIDE; |