[Mesa-dev] [PATCH 2/4] radeonsi: enable DCC fast clear for 128-bit formats
Marek Olšák
maraeo at gmail.com
Wed Sep 7 13:42:12 UTC 2016
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.
Marek
More information about the mesa-dev
mailing list