[Mesa-dev] [PATCH 2/4] radeonsi: enable DCC fast clear for 128-bit formats

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Wed Sep 7 13:59:15 UTC 2016


On Wed, Sep 7, 2016 at 3:42 PM, Marek Olšák <maraeo at gmail.com> wrote:
> On Wed, Sep 7, 2016 at 2:11 PM, Bas Nieuwenhuizen
> <bas at basnieuwenhuizen.nl> wrote:
>> On Wed, Sep 7, 2016 at 1:46 PM, Marek Olšák <maraeo at gmail.com> wrote:
>>> From: Marek Olšák <marek.olsak at amd.com>
>>>
>>> ---
>>>  src/gallium/drivers/radeon/r600_texture.c | 45 ++++++++++++++++++++++---------
>>>  1 file changed, 32 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/src/gallium/drivers/radeon/r600_texture.c b/src/gallium/drivers/radeon/r600_texture.c
>>> index aee768f..074fed8 100644
>>> --- a/src/gallium/drivers/radeon/r600_texture.c
>>> +++ b/src/gallium/drivers/radeon/r600_texture.c
>>> @@ -2193,112 +2193,127 @@ void vi_separate_dcc_process_and_reset_stats(struct pipe_context *ctx,
>>>  /* FAST COLOR CLEAR */
>>>
>>>  static void evergreen_set_clear_color(struct r600_texture *rtex,
>>>                                       enum pipe_format surface_format,
>>>                                       const union pipe_color_union *color)
>>>  {
>>>         union util_color uc;
>>>
>>>         memset(&uc, 0, sizeof(uc));
>>>
>>> -       if (util_format_is_pure_uint(surface_format)) {
>>> +       if (util_format_get_blocksizebits(surface_format) == 128) {
>>> +               /* DCC fast clear only:
>>> +                *   CLEAR_WORD0 = R = G = B
>>> +                *   CLEAR_WORD1 = A
>>> +                */
>>> +               assert(color->ui[0] == color->ui[1] &&
>>> +                      color->ui[0] == color->ui[2]);
>>> +               uc.ui[0] = color->ui[0];
>>> +               uc.ui[1] = color->ui[3];
>>> +       } else if (util_format_is_pure_uint(surface_format)) {
>>>                 util_format_write_4ui(surface_format, color->ui, 0, &uc, 0, 0, 0, 1, 1);
>>>         } else if (util_format_is_pure_sint(surface_format)) {
>>>                 util_format_write_4i(surface_format, color->i, 0, &uc, 0, 0, 0, 1, 1);
>>>         } else {
>>>                 util_pack_color(color->f, surface_format, &uc);
>>>         }
>>>
>>>         memcpy(rtex->color_clear_value, &uc, 2 * sizeof(uint32_t));
>>>  }
>>>
>>> -static void vi_get_fast_clear_parameters(enum pipe_format surface_format,
>>> +static bool vi_get_fast_clear_parameters(enum pipe_format surface_format,
>>>                                          const union pipe_color_union *color,
>>>                                          uint32_t* reset_value,
>>>                                          bool* clear_words_needed)
>>>  {
>>>         bool values[4] = {};
>>>         int i;
>>>         bool main_value = false;
>>>         bool extra_value = false;
>>>         int extra_channel;
>>>         const struct util_format_description *desc = util_format_description(surface_format);
>>>
>>> +       if (desc->block.bits == 128 &&
>>> +           (color->ui[0] != color->ui[1] ||
>>> +            color->ui[0] != color->ui[2]))
>>> +               return false;
>>> +
>>
>> Don't we also need to return false if the pixel size is 128 bits and
>> and the clear values aren't 0/1 (or integer format equivalents)? You
>> can probably do that by replacing most of the "return true;"
>> statements with "return desc->bloc.bits <= 64;".
>
> No. The only requirement is that R==G==B. 0/1 values are only for the
> TC-compatible fast clear without the elimination pass, but any values
> are allowed with the elimination pass.
>
>>
>> Furthermore, as far as I understood, if the DCC texture is bound to
>> CB, then tiles always get expanded to the clear color that we have in
>> the registers. However there is only space for 64 bits in there. Does
>> the hardware automatically ignore these values for 128 bit formats?
>
> CLEAR_WORD0 is used for R,G,B which must be equal like the first code
> comment shows.

Ok, for some reason I had a TC-compatible fast clear in mind.

This series is:

Reviewed-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>

>
> Marek


More information about the mesa-dev mailing list