diff options
Diffstat (limited to 'src/gallium/drivers/etnaviv/etnaviv_rs.c')
-rw-r--r-- | src/gallium/drivers/etnaviv/etnaviv_rs.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_rs.c b/src/gallium/drivers/etnaviv/etnaviv_rs.c index 5c108a6c7a..c9072c2645 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_rs.c +++ b/src/gallium/drivers/etnaviv/etnaviv_rs.c @@ -118,10 +118,21 @@ etna_compile_rs_state(struct etna_context *ctx, struct compiled_rs_state *cs, cs->RS_FILL_VALUE[3] = rs->clear_value[3]; cs->RS_EXTRA_CONFIG = VIVS_RS_EXTRA_CONFIG_AA(rs->aa) | VIVS_RS_EXTRA_CONFIG_ENDIAN(rs->endian_mode); - /* TODO: cs->RS_UNK016B0 = s->size / 64 ? - * The blob does this consistently but there seems to be no currently supported - * model that needs it. + + /* If source the same as destination, and the hardware supports this, + * do an in-place resolve to fill in unrendered tiles. */ + if (ctx->specs.single_buffer && rs->source == rs->dest && + rs->source_offset == rs->dest_offset && + rs->source_format == rs->dest_format && + rs->source_tiling == rs->dest_tiling && + rs->source_stride == rs->dest_stride && + !rs->downsample_x && !rs->downsample_y && + !rs->swap_rb && !rs->flip && + !rs->clear_mode && rs->source_padded_width) { + /* Total number of tiles (same as for autodisable) */ + cs->RS_KICKER_INPLACE = rs->source_padded_width * rs->source_padded_height / 16; + } } void |