summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarek Olšák <marek.olsak@amd.com>2024-04-14 18:54:59 -0400
committerMarge Bot <emma+marge@anholt.net>2024-05-15 06:42:33 +0000
commitb91220a825d74d79606e23d4fd8b89312bf6079f (patch)
tree8febef37155cd5692d20d6d991e656290d2acd5e
parentb771d1355747d9379761dbc709394d792c628b39 (diff)
radeonsi: remove slow code from si_msaa_resolve_blit_via_CB
This is mainly a cleanup. It wasn't faster. Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29053>
-rw-r--r--src/gallium/drivers/radeonsi/si_blit.c63
-rw-r--r--src/gallium/drivers/radeonsi/si_pipe.h14
-rw-r--r--src/gallium/drivers/radeonsi/si_texture.c23
3 files changed, 10 insertions, 90 deletions
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index cbe2e86cc63..5a9ac89a5c1 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -1113,12 +1113,9 @@ bool si_msaa_resolve_blit_via_CB(struct pipe_context *ctx, const struct pipe_bli
struct si_texture *src = (struct si_texture *)info->src.resource;
struct si_texture *dst = (struct si_texture *)info->dst.resource;
- ASSERTED struct si_texture *stmp;
unsigned dst_width = u_minify(info->dst.resource->width0, info->dst.level);
unsigned dst_height = u_minify(info->dst.resource->height0, info->dst.level);
enum pipe_format format = info->src.format;
- struct pipe_resource *tmp, templ;
- struct pipe_blit_info blit;
/* Check basic requirements for hw resolve. */
if (!(info->src.resource->nr_samples > 1 && info->dst.resource->nr_samples <= 1 &&
@@ -1150,33 +1147,30 @@ bool si_msaa_resolve_blit_via_CB(struct pipe_context *ctx, const struct pipe_bli
/* Check the remaining constraints. */
if (src->surface.micro_tile_mode != dst->surface.micro_tile_mode ||
need_rgb_to_bgr) {
+ /* Changing the microtile mode is not possible with GFX10. */
+ if (sctx->gfx_level >= GFX10)
+ return false;
+
/* The next fast clear will switch to this mode to
* get direct hw resolve next time if the mode is
* different now.
- *
- * TODO-GFX10: This does not work in GFX10 because MSAA
- * is restricted to 64KB_R_X and 64KB_Z_X swizzle modes.
- * In some cases we could change the swizzle of the
- * destination texture instead, but the more general
- * solution is to implement compute shader resolve.
*/
if (src->surface.micro_tile_mode != dst->surface.micro_tile_mode)
src->last_msaa_resolve_target_micro_mode = dst->surface.micro_tile_mode;
if (need_rgb_to_bgr)
src->swap_rgb_to_bgr_on_next_clear = true;
- goto resolve_to_temp;
+ return false;
}
/* Resolving into a surface with DCC is unsupported. Since
* it's being overwritten anyway, clear it to uncompressed.
- * This is still the fastest codepath even with this clear.
*/
if (vi_dcc_enabled(dst, info->dst.level)) {
struct si_clear_info clear_info;
if (!vi_dcc_get_clear_info(sctx, dst, info->dst.level, DCC_UNCOMPRESSED, &clear_info))
- goto resolve_to_temp;
+ return false;
si_execute_clears(sctx, &clear_info, 1, SI_CLEAR_TYPE_DCC, info->render_condition_enable);
dst->dirty_level_mask &= ~(1 << info->dst.level);
@@ -1187,50 +1181,7 @@ bool si_msaa_resolve_blit_via_CB(struct pipe_context *ctx, const struct pipe_bli
return true;
}
-resolve_to_temp:
- /* Shader-based resolve is VERY SLOW. Instead, resolve into
- * a temporary texture and blit.
- */
- memset(&templ, 0, sizeof(templ));
- templ.target = PIPE_TEXTURE_2D;
- templ.format = info->src.resource->format;
- templ.width0 = info->src.resource->width0;
- templ.height0 = info->src.resource->height0;
- templ.depth0 = 1;
- templ.array_size = 1;
- templ.usage = PIPE_USAGE_DEFAULT;
- templ.flags = SI_RESOURCE_FLAG_FORCE_MSAA_TILING | SI_RESOURCE_FLAG_FORCE_MICRO_TILE_MODE |
- SI_RESOURCE_FLAG_MICRO_TILE_MODE_SET(src->surface.micro_tile_mode) |
- SI_RESOURCE_FLAG_DISABLE_DCC | SI_RESOURCE_FLAG_DRIVER_INTERNAL;
-
- /* The src and dst microtile modes must be the same. */
- if (sctx->gfx_level <= GFX8 && src->surface.micro_tile_mode == RADEON_MICRO_MODE_DISPLAY)
- templ.bind = PIPE_BIND_SCANOUT;
- else
- templ.bind = 0;
-
- tmp = ctx->screen->resource_create(ctx->screen, &templ);
- if (!tmp)
- return false;
- stmp = (struct si_texture *)tmp;
- /* Match the channel order of src. */
- stmp->swap_rgb_to_bgr = src->swap_rgb_to_bgr;
-
- assert(!stmp->surface.is_linear);
- assert(src->surface.micro_tile_mode == stmp->surface.micro_tile_mode);
-
- /* resolve */
- si_do_CB_resolve(sctx, info, tmp, 0, 0, format);
-
- /* blit */
- blit = *info;
- blit.src.resource = tmp;
- blit.src.box.z = 0;
-
- ctx->blit(ctx, &blit);
-
- pipe_resource_reference(&tmp, NULL);
- return true;
+ return false;
}
static void si_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index 2b12327d237..f76730d9f31 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -100,23 +100,13 @@ struct ac_llvm_compiler;
#define SI_RESOURCE_FLAG_FORCE_LINEAR (PIPE_RESOURCE_FLAG_DRV_PRIV << 0)
#define SI_RESOURCE_FLAG_FLUSHED_DEPTH (PIPE_RESOURCE_FLAG_DRV_PRIV << 1)
-#define SI_RESOURCE_FLAG_FORCE_MSAA_TILING (PIPE_RESOURCE_FLAG_DRV_PRIV << 2)
-#define SI_RESOURCE_FLAG_DISABLE_DCC (PIPE_RESOURCE_FLAG_DRV_PRIV << 3)
+#define SI_RESOURCE_FLAG_GL2_BYPASS (PIPE_RESOURCE_FLAG_DRV_PRIV << 2)
+#define SI_RESOURCE_FLAG_DISCARDABLE (PIPE_RESOURCE_FLAG_DRV_PRIV << 3) /* Discard instead of evict. */
#define SI_RESOURCE_FLAG_DRIVER_INTERNAL (PIPE_RESOURCE_FLAG_DRV_PRIV << 4)
#define SI_RESOURCE_FLAG_READ_ONLY (PIPE_RESOURCE_FLAG_DRV_PRIV << 5)
#define SI_RESOURCE_FLAG_32BIT (PIPE_RESOURCE_FLAG_DRV_PRIV << 6)
#define SI_RESOURCE_FLAG_CLEAR (PIPE_RESOURCE_FLAG_DRV_PRIV << 7)
#define SI_RESOURCE_AUX_PLANE (PIPE_RESOURCE_FLAG_DRV_PRIV << 8)
-/* Set a micro tile mode: */
-#define SI_RESOURCE_FLAG_FORCE_MICRO_TILE_MODE (PIPE_RESOURCE_FLAG_DRV_PRIV << 9)
-#define SI_RESOURCE_FLAG_MICRO_TILE_MODE_SHIFT (util_logbase2(PIPE_RESOURCE_FLAG_DRV_PRIV) + 10)
-#define SI_RESOURCE_FLAG_MICRO_TILE_MODE_SET(x) \
- (((x)&0x3) << SI_RESOURCE_FLAG_MICRO_TILE_MODE_SHIFT)
-#define SI_RESOURCE_FLAG_MICRO_TILE_MODE_GET(x) \
- (((x) >> SI_RESOURCE_FLAG_MICRO_TILE_MODE_SHIFT) & 0x3)
-#define SI_RESOURCE_FLAG_GL2_BYPASS (PIPE_RESOURCE_FLAG_DRV_PRIV << 12)
-/* Discard instead of evict. */
-#define SI_RESOURCE_FLAG_DISCARDABLE (PIPE_RESOURCE_FLAG_DRV_PRIV << 13)
enum si_has_gs {
GS_OFF,
diff --git a/src/gallium/drivers/radeonsi/si_texture.c b/src/gallium/drivers/radeonsi/si_texture.c
index a749c06829c..274ac472380 100644
--- a/src/gallium/drivers/radeonsi/si_texture.c
+++ b/src/gallium/drivers/radeonsi/si_texture.c
@@ -252,9 +252,6 @@ static int si_init_surface(struct si_screen *sscreen, struct radeon_surf *surfac
/* Disable DCC? (it can't be disabled if modifiers are used) */
if (sscreen->info.gfx_level >= GFX8 && modifier == DRM_FORMAT_MOD_INVALID && !is_imported) {
/* Global options that disable DCC. */
- if (ptex->flags & SI_RESOURCE_FLAG_DISABLE_DCC)
- flags |= RADEON_SURF_DISABLE_DCC;
-
if (ptex->nr_samples >= 2 && sscreen->debug_flags & DBG(NO_DCC_MSAA))
flags |= RADEON_SURF_DISABLE_DCC;
@@ -341,23 +338,6 @@ static int si_init_surface(struct si_screen *sscreen, struct radeon_surf *surfac
if (sscreen->debug_flags & DBG(NO_FMASK))
flags |= RADEON_SURF_NO_FMASK;
- if (sscreen->info.gfx_level == GFX9 && (ptex->flags & SI_RESOURCE_FLAG_FORCE_MICRO_TILE_MODE)) {
- flags |= RADEON_SURF_FORCE_MICRO_TILE_MODE;
- surface->micro_tile_mode = SI_RESOURCE_FLAG_MICRO_TILE_MODE_GET(ptex->flags);
- }
-
- if (ptex->flags & SI_RESOURCE_FLAG_FORCE_MSAA_TILING) {
- /* GFX11 shouldn't get here because the flag is only used by the CB MSAA resolving
- * that GFX11 doesn't have.
- */
- assert(sscreen->info.gfx_level <= GFX10_3);
-
- flags |= RADEON_SURF_FORCE_SWIZZLE_MODE;
-
- if (sscreen->info.gfx_level >= GFX10)
- surface->u.gfx9.swizzle_mode = ADDR_SW_64KB_R_X;
- }
-
if (ptex->flags & PIPE_RESOURCE_FLAG_SPARSE) {
flags |= RADEON_SURF_NO_FMASK |
RADEON_SURF_NO_HTILE |
@@ -1279,7 +1259,6 @@ static enum radeon_surf_mode si_choose_tiling(struct si_screen *sscreen,
bool tc_compatible_htile)
{
const struct util_format_description *desc = util_format_description(templ->format);
- bool force_tiling = templ->flags & SI_RESOURCE_FLAG_FORCE_MSAA_TILING;
bool is_depth_stencil = util_format_is_depth_or_stencil(templ->format) &&
!(templ->flags & SI_RESOURCE_FLAG_FLUSHED_DEPTH);
@@ -1300,7 +1279,7 @@ static enum radeon_surf_mode si_choose_tiling(struct si_screen *sscreen,
/* Handle common candidates for the linear mode.
* Compressed textures and DB surfaces must always be tiled.
*/
- if (!force_tiling && !is_depth_stencil && !util_format_is_compressed(templ->format)) {
+ if (!is_depth_stencil && !util_format_is_compressed(templ->format)) {
if (sscreen->debug_flags & DBG(NO_TILING) ||
(templ->bind & PIPE_BIND_SCANOUT && sscreen->debug_flags & DBG(NO_DISPLAY_TILING)))
return RADEON_SURF_MODE_LINEAR_ALIGNED;