diff options
author | Marek Olšák <[email protected]> | 2019-01-04 19:19:54 -0500 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-04-04 09:53:24 -0400 |
commit | 2c09eb41221eb704e9e7a21654828173158d1a7d (patch) | |
tree | 6adb48d0372e6dd5562080ef7740190414abb9a6 /src/amd | |
parent | 029bfa3d253ca70186e245ccf0a7e17bb40a5bab (diff) |
radeonsi: add support for displayable DCC for 1 RB chips
This is the simpler codepath - just disable RB and pipe alignment for DCC.
Diffstat (limited to 'src/amd')
-rw-r--r-- | src/amd/common/ac_gpu_info.c | 2 | ||||
-rw-r--r-- | src/amd/common/ac_gpu_info.h | 3 | ||||
-rw-r--r-- | src/amd/common/ac_surface.c | 25 | ||||
-rw-r--r-- | src/amd/common/ac_surface.h | 2 |
4 files changed, 29 insertions, 3 deletions
diff --git a/src/amd/common/ac_gpu_info.c b/src/amd/common/ac_gpu_info.c index fc8c6a09d2f..a6d249a6d2f 100644 --- a/src/amd/common/ac_gpu_info.c +++ b/src/amd/common/ac_gpu_info.c @@ -503,6 +503,8 @@ void ac_print_gpu_info(struct radeon_info *info) printf(" clock_crystal_freq = %i\n", info->clock_crystal_freq); printf(" tcc_cache_line_size = %u\n", info->tcc_cache_line_size); + printf(" use_display_dcc_unaligned = %u\n", info->use_display_dcc_unaligned); + printf("Memory info:\n"); printf(" pte_fragment_size = %u\n", info->pte_fragment_size); printf(" gart_page_size = %u\n", info->gart_page_size); diff --git a/src/amd/common/ac_gpu_info.h b/src/amd/common/ac_gpu_info.h index b1ef9c53734..99fed520618 100644 --- a/src/amd/common/ac_gpu_info.h +++ b/src/amd/common/ac_gpu_info.h @@ -56,6 +56,9 @@ struct radeon_info { uint32_t clock_crystal_freq; uint32_t tcc_cache_line_size; + /* Disable RB and pipe alignment to skip the retile blit. (1 RB chips only) */ + bool use_display_dcc_unaligned; + /* Memory info. */ uint32_t pte_fragment_size; uint32_t gart_page_size; diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c index 27e63c318e6..1f43b607174 100644 --- a/src/amd/common/ac_surface.c +++ b/src/amd/common/ac_surface.c @@ -478,7 +478,8 @@ static bool get_display_flag(const struct ac_surf_config *config, unsigned num_channels = config->info.num_channels; unsigned bpe = surf->bpe; - if (surf->flags & RADEON_SURF_SCANOUT && + if (!(surf->flags & RADEON_SURF_Z_OR_SBUFFER) && + surf->flags & RADEON_SURF_SCANOUT && config->info.samples <= 1 && surf->blk_w <= 2 && surf->blk_h == 1) { /* subsampled */ @@ -1217,7 +1218,7 @@ static int gfx9_compute_miptree(ADDR_HANDLE addrlib, surf->u.gfx9.dcc.rb_aligned = din.dccKeyFlags.rbAligned; surf->u.gfx9.dcc.pipe_aligned = din.dccKeyFlags.pipeAligned; - surf->u.gfx9.dcc_pitch_max = dout.pitch - 1; + surf->u.gfx9.display_dcc_pitch_max = dout.pitch - 1; surf->dcc_size = dout.dccRamSize; surf->dcc_alignment = dout.dccRamBaseAlign; surf->num_dcc_levels = in->numMipLevels; @@ -1453,6 +1454,19 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib, AddrSurfInfoIn.flags.metaPipeUnaligned = 0; AddrSurfInfoIn.flags.metaRbUnaligned = 0; + /* The display hardware can only read DCC with RB_ALIGNED=0 and + * PIPE_ALIGNED=0. PIPE_ALIGNED really means L2CACHE_ALIGNED. + * + * The CB block requires RB_ALIGNED=1 except 1 RB chips. + * PIPE_ALIGNED is optional, but PIPE_ALIGNED=0 requires L2 flushes + * after rendering, so PIPE_ALIGNED=1 is recommended. + */ + if (info->use_display_dcc_unaligned && is_color_surface && + AddrSurfInfoIn.flags.display) { + AddrSurfInfoIn.flags.metaPipeUnaligned = 1; + AddrSurfInfoIn.flags.metaRbUnaligned = 1; + } + switch (mode) { case RADEON_SURF_MODE_LINEAR_ALIGNED: assert(config->info.samples <= 1); @@ -1525,6 +1539,13 @@ static int gfx9_compute_surface(ADDR_HANDLE addrlib, surf->bpe * 8, &displayable); if (r) return r; + + /* Display needs unaligned DCC. */ + if (info->use_display_dcc_unaligned && + surf->num_dcc_levels && + (surf->u.gfx9.dcc.pipe_aligned || + surf->u.gfx9.dcc.rb_aligned)) + displayable = false; } surf->is_displayable = displayable; diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h index 7ae166c70a3..eb50c37c3c2 100644 --- a/src/amd/common/ac_surface.h +++ b/src/amd/common/ac_surface.h @@ -149,7 +149,7 @@ struct gfx9_surf_layout { /* Mipmap level offset within the slice in bytes. Only valid for LINEAR. */ uint32_t offset[RADEON_SURF_MAX_LEVELS]; - uint16_t dcc_pitch_max; /* (mip chain pitch - 1) */ + uint16_t display_dcc_pitch_max; /* (mip chain pitch - 1) */ uint64_t stencil_offset; /* separate stencil */ }; |