Both patches: Reviewed-by: Nicolai Hähnle <nicolai.haeh...@amd.com>
On 30.03.2017 16:30, Marek Olšák wrote:
From: Marek Olšák <marek.ol...@amd.com> v2: don't add a new decompress helper function --- src/gallium/drivers/radeonsi/si_descriptors.c | 14 +++++++++++--- src/gallium/drivers/radeonsi/si_pipe.h | 1 + src/gallium/drivers/radeonsi/si_state.c | 7 ++++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/radeonsi/si_descriptors.c b/src/gallium/drivers/radeonsi/si_descriptors.c index f28202f..2b91158 100644 --- a/src/gallium/drivers/radeonsi/si_descriptors.c +++ b/src/gallium/drivers/radeonsi/si_descriptors.c @@ -473,47 +473,55 @@ static void si_set_sampler_view(struct si_context *sctx, struct si_sampler_views *views = &sctx->samplers[shader].views; struct si_sampler_view *rview = (struct si_sampler_view*)view; struct si_descriptors *descs = si_sampler_descriptors(sctx, shader); uint32_t *desc = descs->list + slot * 16; if (views->views[slot] == view && !disallow_early_out) return; if (view) { struct r600_texture *rtex = (struct r600_texture *)view->texture; + bool is_buffer = rtex->resource.b.b.target == PIPE_BUFFER; + + if (unlikely(!is_buffer && rview->dcc_incompatible)) { + if (vi_dcc_enabled(rtex, view->u.tex.first_level)) + if (!r600_texture_disable_dcc(&sctx->b, rtex)) + sctx->b.decompress_dcc(&sctx->b.b, rtex); + + rview->dcc_incompatible = false; + } assert(rtex); /* views with texture == NULL aren't supported */ pipe_sampler_view_reference(&views->views[slot], view); memcpy(desc, rview->state, 8*4); - if (rtex->resource.b.b.target == PIPE_BUFFER) { + if (is_buffer) { rtex->resource.bind_history |= PIPE_BIND_SAMPLER_VIEW; si_set_buf_desc_address(&rtex->resource, view->u.buf.offset, desc + 4); } else { bool is_separate_stencil = rtex->db_compatible && rview->is_stencil_sampler; si_set_mutable_tex_desc_fields(sctx->screen, rtex, rview->base_level_info, rview->base_level, rview->base.u.tex.first_level, rview->block_width, is_separate_stencil, desc); } - if (rtex->resource.b.b.target != PIPE_BUFFER && - rtex->fmask.size) { + if (!is_buffer && rtex->fmask.size) { memcpy(desc + 8, rview->fmask_state, 8*4); } else { /* Disable FMASK and bind sampler state in [12:15]. */ memcpy(desc + 8, null_texture_descriptor, 4*4); if (views->sampler_states[slot]) memcpy(desc + 12, views->sampler_states[slot]->val, 4*4); diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h index e1df3b6..3a6503a 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.h +++ b/src/gallium/drivers/radeonsi/si_pipe.h @@ -120,20 +120,21 @@ struct si_blend_color { struct si_sampler_view { struct pipe_sampler_view base; /* [0..7] = image descriptor * [4..7] = buffer descriptor */ uint32_t state[8]; uint32_t fmask_state[8]; const struct legacy_surf_level *base_level_info; unsigned base_level; unsigned block_width; bool is_stencil_sampler; + bool dcc_incompatible; }; #define SI_SAMPLER_STATE_MAGIC 0x34f1c35a struct si_sampler_state { #ifdef DEBUG unsigned magic; #endif uint32_t val[4]; }; diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c index 2c2e3c7..f8c6faf 100644 --- a/src/gallium/drivers/radeonsi/si_state.c +++ b/src/gallium/drivers/radeonsi/si_state.c @@ -3430,23 +3430,24 @@ si_create_sampler_view_custom(struct pipe_context *ctx, case PIPE_FORMAT_X24S8_UINT: case PIPE_FORMAT_S8X24_UINT: case PIPE_FORMAT_X32_S8X24_UINT: pipe_format = PIPE_FORMAT_S8_UINT; surflevel = tmp->surface.u.legacy.stencil_level; break; default:; } } - vi_disable_dcc_if_incompatible_format(&sctx->b, texture, - state->u.tex.first_level, - state->format); + view->dcc_incompatible = + vi_dcc_formats_are_incompatible(texture, + state->u.tex.first_level, + state->format); si_make_texture_descriptor(sctx->screen, tmp, true, state->target, pipe_format, state_swizzle, first_level, last_level, state->u.tex.first_layer, last_layer, width, height, depth, view->state, view->fmask_state); view->base_level_info = &surflevel[base_level]; view->base_level = base_level;
-- Lerne, wie die Welt wirklich ist, Aber vergiss niemals, wie sie sein sollte. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev