radeonsi: disable DCC when importing a texture from an incompatible driver
authorMarek Olšák <marek.olsak@amd.com>
Tue, 27 Aug 2019 18:37:24 +0000 (14:37 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 10 Sep 2019 03:43:03 +0000 (23:43 -0400)
and unify the code.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
src/gallium/drivers/radeonsi/si_texture.c

index be614e66440a2c865ebe605e0694406a8e0ecd64..cb239c3a6e6e34fc41e791a7d719d0ede6f537c8 100644 (file)
@@ -443,6 +443,13 @@ static bool si_can_disable_dcc(struct si_texture *tex)
                !(tex->buffer.external_usage & PIPE_HANDLE_USAGE_FRAMEBUFFER_WRITE));
 }
 
+static void si_texture_zero_dcc_fields(struct si_texture *tex)
+{
+       tex->dcc_offset = 0;
+       tex->display_dcc_offset = 0;
+       tex->dcc_retile_map_offset = 0;
+}
+
 static bool si_texture_discard_dcc(struct si_screen *sscreen,
                                   struct si_texture *tex)
 {
@@ -454,9 +461,7 @@ static bool si_texture_discard_dcc(struct si_screen *sscreen,
        assert(tex->dcc_separate_buffer == NULL);
 
        /* Disable DCC. */
-       tex->dcc_offset = 0;
-       tex->display_dcc_offset = 0;
-       tex->dcc_retile_map_offset = 0;
+       si_texture_zero_dcc_fields(tex);
 
        /* Notify all contexts about the change. */
        p_atomic_inc(&sscreen->dirty_tex_counter);
@@ -755,6 +760,9 @@ static bool si_read_tex_bo_metadata(struct si_screen *sscreen,
        if (md->size_metadata < 10 * 4 || /* at least 2(header) + 8(desc) dwords */
            md->metadata[0] == 0 || /* invalid version number */
            md->metadata[1] != si_get_bo_metadata_word1(sscreen)) /* invalid PCI ID */ {
+               /* Disable DCC because it might not be enabled. */
+               si_texture_zero_dcc_fields(tex);
+
                /* Don't report an error if the texture comes from an incompatible driver,
                 * but this might not work.
                 */
@@ -829,7 +837,7 @@ static bool si_read_tex_bo_metadata(struct si_screen *sscreen,
                /* Disable DCC. dcc_offset is always set by texture_from_handle
                 * and must be cleared here.
                 */
-               tex->dcc_offset = 0;
+               si_texture_zero_dcc_fields(tex);
        }
 
        return true;