radeonsi: decompress DCC in set_sampler_view instead of create_sampler_view (v2)
authorMarek Olšák <marek.olsak@amd.com>
Fri, 24 Mar 2017 02:16:41 +0000 (03:16 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Fri, 31 Mar 2017 18:57:53 +0000 (20:57 +0200)
v2: don't add a new decompress helper function

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_descriptors.c
src/gallium/drivers/radeonsi/si_pipe.h
src/gallium/drivers/radeonsi/si_state.c

index f28202f20a89a38c2609c17f05ecb89951c208bd..2b911585a69ee58e88595c8c5e5836f0f6770d50 100644 (file)
@@ -480,12 +480,21 @@ static void si_set_sampler_view(struct si_context *sctx,
 
        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,
@@ -505,8 +514,7 @@ static void si_set_sampler_view(struct si_context *sctx,
                                                       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 {
index e1df3b65261499f531f66b17721173d33d8392c4..3a6503a7a448e5f16cc4ec17ec6c3ca540036845 100644 (file)
@@ -127,6 +127,7 @@ struct si_sampler_view {
        unsigned                        base_level;
        unsigned                        block_width;
        bool is_stencil_sampler;
+       bool dcc_incompatible;
 };
 
 #define SI_SAMPLER_STATE_MAGIC 0x34f1c35a
index 2c2e3c77f6e1697f580e5bc7ecf78ddf35748b4a..f8c6faf955205838e7c61b4416de80ab5c823a97 100644 (file)
@@ -3437,9 +3437,10 @@ si_create_sampler_view_custom(struct pipe_context *ctx,
                }
        }
 
-       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,