Signed-off-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl> --- src/gallium/drivers/radeonsi/si_blit.c | 18 ++++++++++++------ src/gallium/drivers/radeonsi/si_descriptors.c | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c index 98913e5..1c08329 100644 --- a/src/gallium/drivers/radeonsi/si_blit.c +++ b/src/gallium/drivers/radeonsi/si_blit.c @@ -255,7 +255,8 @@ void si_flush_depth_textures(struct si_context *sctx, static void si_blit_decompress_color(struct pipe_context *ctx, struct r600_texture *rtex, unsigned first_level, unsigned last_level, - unsigned first_layer, unsigned last_layer) + unsigned first_layer, unsigned last_layer, + bool need_dcc_decompress) { struct si_context *sctx = (struct si_context *)ctx; unsigned layer, level, checked_last_layer, max_layer; @@ -264,6 +265,9 @@ static void si_blit_decompress_color(struct pipe_context *ctx, return; for (level = first_level; level <= last_level; level++) { + if (!(rtex->dirty_level_mask & (1 << level)) && !need_dcc_decompress) + continue; + if (!(rtex->dirty_level_mask & (1 << level)) && !(rtex->dcc_compressed_level_mask & (1 << level))) continue; @@ -284,7 +288,7 @@ static void si_blit_decompress_color(struct pipe_context *ctx, if(rtex->fmask.size) { custom_blend = sctx->custom_blend_decompress; - } else if(rtex->dcc_buffer) { + } else if(rtex->dcc_buffer && need_dcc_decompress) { /* also eliminates the fast clear if necessary */ custom_blend = sctx->custom_blend_dcc_decompress; } else { @@ -302,7 +306,9 @@ static void si_blit_decompress_color(struct pipe_context *ctx, * I don't think this case occurs often though. */ if (first_layer == 0 && last_layer == max_layer) { rtex->dirty_level_mask &= ~(1 << level); - rtex->dcc_compressed_level_mask &= ~(1 << level); + + if(need_dcc_decompress) + rtex->dcc_compressed_level_mask &= ~(1 << level); } } } @@ -327,7 +333,7 @@ void si_decompress_color_textures(struct si_context *sctx, si_blit_decompress_color(&sctx->b.b, tex, view->u.tex.first_level, view->u.tex.last_level, - 0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level)); + 0, util_max_layer(&tex->resource.b.b, view->u.tex.first_level), false); } } @@ -450,7 +456,7 @@ static void si_decompress_subresource(struct pipe_context *ctx, first_layer, last_layer); } else if (rtex->fmask.size || rtex->cmask.size || rtex->dcc_buffer) { si_blit_decompress_color(ctx, rtex, level, level, - first_layer, last_layer); + first_layer, last_layer, false); } } @@ -719,7 +725,7 @@ static void si_flush_resource(struct pipe_context *ctx, if (!rtex->is_depth && (rtex->cmask.size || rtex->dcc_buffer)) { si_blit_decompress_color(ctx, rtex, 0, res->last_level, - 0, util_max_layer(res, 0)); + 0, util_max_layer(res, 0), true); } } diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index d23da1d..14ebd92 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -245,7 +245,7 @@ static void si_set_sampler_views(struct pipe_context *ctx, } else { samplers->depth_texture_mask &= ~(1 << slot); } - if (rtex->cmask.size || rtex->fmask.size || rtex->dcc_buffer) { + if (rtex->cmask.size || rtex->fmask.size) { samplers->compressed_colortex_mask |= 1 << slot; } else { samplers->compressed_colortex_mask &= ~(1 << slot); -- 2.5.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev