Sorry, but I still don't understand the logic of this :/

What we want to check for is that all the DCC bytes of a mip-level are contiguous, right?

Why does it matter for that whether a level is the last level?

Here's the thought experiment that I can't make sense of: Let's say that you have format, base level, and number of levels N so that the last-level condition applies. That is, all levels up to and including N-2 have dccRamAligned true. Level N-1 has dccRamAligned false, but the patch as-is will still consider it fast-clearable.

Now you take the same format and base level, but allocate N+1 levels. Presumably we now also get levels up to and including N-2 with dccRamAligned true, but levels N-1 and N will have dccRamAligned false and will be considered not fast-clearable.

Why is level N-1 fast clearable in the first case but not the second? That's what doesn't make sense to me. Am I missing something here?

Thanks,
Nicolai


On 27.04.2018 04:13, Marek Olšák wrote:
Ping. Thanks.

On Tue, Apr 24, 2018 at 3:56 PM, Marek Olšák <mar...@gmail.com <mailto:mar...@gmail.com>> wrote:

    From: Marek Olšák <marek.ol...@amd.com <mailto:marek.ol...@amd.com>>

    v2: require the previous level to be clearable for determining whether
         the last unaligned level is clearable
    ---
      src/amd/common/ac_surface.c | 18 +++++++++++++++++-
      1 file changed, 17 insertions(+), 1 deletion(-)

    diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c
    index a23952717e3..487f6c6431b 100644
    --- a/src/amd/common/ac_surface.c
    +++ b/src/amd/common/ac_surface.c
    @@ -336,36 +336,52 @@ static int gfx6_compute_level(ADDR_HANDLE addrlib,
                     surf->u.legacy.tiling_index[level] =
    AddrSurfInfoOut->tileIndex;

             surf->surf_size = surf_level->offset +
    AddrSurfInfoOut->surfSize;

             /* Clear DCC fields at the beginning. */
             surf_level->dcc_offset = 0;

             /* The previous level's flag tells us if we can use DCC for
    this level. */
             if (AddrSurfInfoIn->flags.dccCompatible &&
                 (level == 0 || AddrDccOut->subLvlCompressible)) {
    +               bool prev_level_clearable = level == 0 ||
+  AddrDccOut->dccRamSizeAligned;
    +
                     AddrDccIn->colorSurfSize = AddrSurfInfoOut->surfSize;
                     AddrDccIn->tileMode = AddrSurfInfoOut->tileMode;
                     AddrDccIn->tileInfo = *AddrSurfInfoOut->pTileInfo;
                     AddrDccIn->tileIndex = AddrSurfInfoOut->tileIndex;
                     AddrDccIn->macroModeIndex =
    AddrSurfInfoOut->macroModeIndex;

                     ret = AddrComputeDccInfo(addrlib,
                                              AddrDccIn,
                                              AddrDccOut);

                     if (ret == ADDR_OK) {
                             surf_level->dcc_offset = surf->dcc_size;
    -                       surf_level->dcc_fast_clear_size =
    AddrDccOut->dccFastClearSize;
                             surf->num_dcc_levels = level + 1;
                             surf->dcc_size = surf_level->dcc_offset +
    AddrDccOut->dccRamSize;
                             surf->dcc_alignment =
    MAX2(surf->dcc_alignment, AddrDccOut->dccRamBaseAlign);
    +
    +                       /* If the DCC size of a subresource (1 mip
    level or 1 slice)
    +                        * is not aligned, the DCC memory layout is
    not contiguous for
    +                        * that subresource, which means we can't
    use fast clear.
    +                        *
    +                        * We only do fast clears for whole mipmap
    levels. If we did
    +                        * per-slice fast clears, the same
    restriction would apply.
    +                        * (i.e. only compute the slice size and see
    if it's aligned)
    +                        */
    +                       if (AddrDccOut->dccRamSizeAligned ||
    +                           (prev_level_clearable && level ==
    config->info.levels - 1))
    +                               surf_level->dcc_fast_clear_size =
    AddrDccOut->dccFastClearSize;
    +                       else
    +                               surf_level->dcc_fast_clear_size = 0;
                     }
             }

             /* TC-compatible HTILE. */
             if (!is_stencil &&
                 AddrSurfInfoIn->flags.depth &&
                 surf_level->mode == RADEON_SURF_MODE_2D &&
                 level == 0) {
                     AddrHtileIn->flags.tcCompatible =
    AddrSurfInfoIn->flags.tcCompatible;
                     AddrHtileIn->pitch = AddrSurfInfoOut->pitch;
-- 2.17.0




_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev



--
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

Reply via email to