[Mesa-dev] [PATCH 04/10] gallium/radeon: don't call u_format helpers if we have that info already

Marek Olšák maraeo at gmail.com
Mon Oct 31 23:25:35 UTC 2016


On Mon, Oct 31, 2016 at 10:04 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> On 29.10.2016 13:17, Marek Olšák wrote:
>>
>> From: Marek Olšák <marek.olsak at amd.com>
>>
>> ---
>>  src/gallium/drivers/radeon/r600_texture.c | 13 +++++--------
>>  src/gallium/drivers/radeonsi/si_blit.c    |  5 +++--
>>  2 files changed, 8 insertions(+), 10 deletions(-)
>>
>> diff --git a/src/gallium/drivers/radeon/r600_texture.c
>> b/src/gallium/drivers/radeon/r600_texture.c
>> index 46281cb..364ed40 100644
>> --- a/src/gallium/drivers/radeon/r600_texture.c
>> +++ b/src/gallium/drivers/radeon/r600_texture.c
>> @@ -46,22 +46,21 @@ bool r600_prepare_for_dma_blit(struct
>> r600_common_context *rctx,
>>                                struct r600_texture *rdst,
>>                                unsigned dst_level, unsigned dstx,
>>                                unsigned dsty, unsigned dstz,
>>                                struct r600_texture *rsrc,
>>                                unsigned src_level,
>>                                const struct pipe_box *src_box)
>>  {
>>         if (!rctx->dma.cs)
>>                 return false;
>>
>> -       if (util_format_get_blocksizebits(rdst->resource.b.b.format) !=
>> -           util_format_get_blocksizebits(rsrc->resource.b.b.format))
>> +       if (rdst->surface.bpe != rsrc->surface.bpe)
>>                 return false;
>>
>>         /* MSAA: Blits don't exist in the real world. */
>>         if (rsrc->resource.b.b.nr_samples > 1 ||
>>             rdst->resource.b.b.nr_samples > 1)
>>                 return false;
>>
>>         /* Depth-stencil surfaces:
>>          *   When dst is linear, the DB->CB copy preserves HTILE.
>>          *   When dst is tiled, the 3D path must be used to update HTILE.
>> @@ -174,26 +173,24 @@ static void r600_copy_from_staging_texture(struct
>> pipe_context *ctx, struct r600
>>         }
>>
>>         rctx->dma_copy(ctx, dst, transfer->level,
>>                        transfer->box.x, transfer->box.y, transfer->box.z,
>>                        src, 0, &sbox);
>>  }
>>
>>  static unsigned r600_texture_get_offset(struct r600_texture *rtex,
>> unsigned level,
>>                                         const struct pipe_box *box)
>>  {
>> -       enum pipe_format format = rtex->resource.b.b.format;
>> -
>>         return rtex->surface.level[level].offset +
>>                box->z * rtex->surface.level[level].slice_size +
>> -              box->y / util_format_get_blockheight(format) *
>> rtex->surface.level[level].pitch_bytes +
>> -              box->x / util_format_get_blockwidth(format) *
>> util_format_get_blocksize(format);
>> +              box->y / rtex->surface.blk_h *
>> rtex->surface.level[level].pitch_bytes +
>> +              box->x / rtex->surface.blk_w * rtex->surface.bpe;
>>  }
>>
>>  static int r600_init_surface(struct r600_common_screen *rscreen,
>>                              struct radeon_surf *surface,
>>                              const struct pipe_resource *ptex,
>>                              enum radeon_surf_mode array_mode,
>>                              unsigned pitch_in_bytes_override,
>>                              unsigned offset,
>>                              bool is_imported,
>>                              bool is_scanout,
>> @@ -2188,21 +2185,21 @@ 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_get_blocksizebits(surface_format) == 128) {
>> +       if (rtex->surface.bpe == 16) {
>>                 /* 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);
>> @@ -2495,21 +2492,21 @@ void evergreen_do_fast_color_clear(struct
>> r600_common_context *rctx,
>>
>> &clear_words_needed))
>>                                 continue;
>>
>>                         vi_dcc_clear_level(rctx, tex, 0, reset_value);
>>
>>                         if (clear_words_needed)
>>                                 tex->dirty_level_mask |= 1 <<
>> fb->cbufs[i]->u.tex.level;
>>                         tex->separate_dcc_dirty = true;
>>                 } else {
>>                         /* 128-bit formats are unusupported */
>> -                       if
>> (util_format_get_blocksizebits(fb->cbufs[i]->format) > 64) {
>> +                       if (tex->surface.bpe > 8) {
>>                                 continue;
>>                         }
>>
>>                         /* Stoney/RB+ doesn't work with CMASK fast clear.
>> */
>>                         if (rctx->family == CHIP_STONEY)
>>                                 continue;
>>
>>                         /* ensure CMASK is enabled */
>>                         r600_texture_alloc_cmask_separate(rctx->screen,
>> tex);
>>                         if (tex->cmask.size == 0) {
>> diff --git a/src/gallium/drivers/radeonsi/si_blit.c
>> b/src/gallium/drivers/radeonsi/si_blit.c
>> index 0f46d71..fe17f73 100644
>> --- a/src/gallium/drivers/radeonsi/si_blit.c
>> +++ b/src/gallium/drivers/radeonsi/si_blit.c
>> @@ -831,20 +831,21 @@ struct texture_orig_info {
>>
>>  void si_resource_copy_region(struct pipe_context *ctx,
>>                              struct pipe_resource *dst,
>>                              unsigned dst_level,
>>                              unsigned dstx, unsigned dsty, unsigned dstz,
>>                              struct pipe_resource *src,
>>                              unsigned src_level,
>>                              const struct pipe_box *src_box)
>>  {
>>         struct si_context *sctx = (struct si_context *)ctx;
>> +       struct r600_texture *rsrc = (struct r600_texture*)src;
>
>
> I think this is technically undefined behavior since the check against
> PIPE_BUFFER only comes later.

Are you sure? A pointer is a number and that code just assigns that number.

Marek


More information about the mesa-dev mailing list