From d60ae64527dfba55c998e869c743b519fbf90a3c Mon Sep 17 00:00:00 2001 From: Danylo Piliaiev Date: Thu, 18 Jul 2024 17:43:21 +0200 Subject: [PATCH] tu/a750: Allow mutable images to have UBWC with all compatible formats A750+ added a special flag that allows HW to correctly interpret UBWC, including UBWC fast-clear when casting image to a different format permitted by Vulkan. So it's possible to have UBWC enabled for image that has e.g. R32_UINT and R8G8B8A8_UNORM in the mutable formats list. Signed-off-by: Danylo Piliaiev Part-of: --- src/freedreno/common/freedreno_dev_info.h | 7 +++++ src/freedreno/common/freedreno_devices.py | 1 + src/freedreno/fdl/fd6_view.c | 16 ++++++++---- src/freedreno/fdl/freedreno_layout.h | 1 + src/freedreno/registers/adreno/a6xx.xml | 26 ++++++++++++++----- src/freedreno/vulkan/tu_clear_blit.cc | 3 +++ src/freedreno/vulkan/tu_image.cc | 17 +++++++++--- src/freedreno/vulkan/tu_image.h | 1 + .../drivers/freedreno/a6xx/fd6_image.cc | 1 + .../drivers/freedreno/a6xx/fd6_texture.cc | 1 + 10 files changed, 59 insertions(+), 15 deletions(-) diff --git a/src/freedreno/common/freedreno_dev_info.h b/src/freedreno/common/freedreno_dev_info.h index 3a54d63b85d..a178fa2c020 100644 --- a/src/freedreno/common/freedreno_dev_info.h +++ b/src/freedreno/common/freedreno_dev_info.h @@ -283,6 +283,13 @@ struct fd_dev_info { bool enable_tp_ubwc_flag_hint; bool storage_8bit; + + /* A750+ added a special flag that allows HW to correctly interpret UBWC, including + * UBWC fast-clear when casting image to a different format permitted by Vulkan. + * So it's possible to have UBWC enabled for image that has e.g. R32_UINT and + * R8G8B8A8_UNORM in the mutable formats list. + */ + bool ubwc_all_formats_compatible; } a7xx; }; diff --git a/src/freedreno/common/freedreno_devices.py b/src/freedreno/common/freedreno_devices.py index 1dcfc7a43e5..79c69e42c66 100644 --- a/src/freedreno/common/freedreno_devices.py +++ b/src/freedreno/common/freedreno_devices.py @@ -871,6 +871,7 @@ a7xx_750 = A7XXProps( no_gs_hw_binning_quirk = True, gs_vpc_adjacency_quirk = True, storage_8bit = True, + ubwc_all_formats_compatible = True, ) a730_magic_regs = dict( diff --git a/src/freedreno/fdl/fd6_view.c b/src/freedreno/fdl/fd6_view.c index 1e25fea5b41..c6c811f7942 100644 --- a/src/freedreno/fdl/fd6_view.c +++ b/src/freedreno/fdl/fd6_view.c @@ -253,7 +253,9 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_TEX_CONST_0_SWAP(swap) | fdl6_texswiz(args, has_z24uint_s8uint) | A6XX_TEX_CONST_0_MIPLVLS(args->level_count - 1); - view->descriptor[1] = A6XX_TEX_CONST_1_WIDTH(width) | A6XX_TEX_CONST_1_HEIGHT(height); + view->descriptor[1] = + A6XX_TEX_CONST_1_WIDTH(width) | A6XX_TEX_CONST_1_HEIGHT(height) | + COND(args->ubwc_fc_mutable, A6XX_TEX_CONST_1_MUTABLEEN); view->descriptor[2] = A6XX_TEX_CONST_2_PITCHALIGN(layout->pitchalign - 6) | A6XX_TEX_CONST_2_PITCH(pitch) | @@ -340,7 +342,8 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_SP_PS_2D_SRC_INFO_SAMPLES(util_logbase2(layout->nr_samples)) | COND(samples_average, A6XX_SP_PS_2D_SRC_INFO_SAMPLES_AVERAGE) | A6XX_SP_PS_2D_SRC_INFO_UNK20 | - A6XX_SP_PS_2D_SRC_INFO_UNK22; + A6XX_SP_PS_2D_SRC_INFO_UNK22 | + COND(args->ubwc_fc_mutable, A6XX_SP_PS_2D_SRC_INFO_MUTABLEEN); view->SP_PS_2D_SRC_SIZE = A6XX_SP_PS_2D_SRC_SIZE_WIDTH(width) | @@ -420,7 +423,8 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_RB_MRT_BUF_INFO_COLOR_TILE_MODE(tile_mode) | A6XX_RB_MRT_BUF_INFO_COLOR_FORMAT(color_format) | COND(args->chip >= A7XX && ubwc_enabled, A7XX_RB_MRT_BUF_INFO_LOSSLESSCOMPEN) | - A6XX_RB_MRT_BUF_INFO_COLOR_SWAP(color_swap); + A6XX_RB_MRT_BUF_INFO_COLOR_SWAP(color_swap) | + COND(args->ubwc_fc_mutable, A7XX_RB_MRT_BUF_INFO_MUTABLEEN); view->SP_FS_MRT_REG = A6XX_SP_FS_MRT_REG_COLOR_FORMAT(color_format) | @@ -432,14 +436,16 @@ fdl6_view_init(struct fdl6_view *view, const struct fdl_layout **layouts, A6XX_RB_2D_DST_INFO_TILE_MODE(tile_mode) | A6XX_RB_2D_DST_INFO_COLOR_SWAP(color_swap) | COND(ubwc_enabled, A6XX_RB_2D_DST_INFO_FLAGS) | - COND(util_format_is_srgb(args->format), A6XX_RB_2D_DST_INFO_SRGB); + COND(util_format_is_srgb(args->format), A6XX_RB_2D_DST_INFO_SRGB) | + COND(args->ubwc_fc_mutable, A6XX_RB_2D_DST_INFO_MUTABLEEN);; view->RB_BLIT_DST_INFO = A6XX_RB_BLIT_DST_INFO_TILE_MODE(tile_mode) | A6XX_RB_BLIT_DST_INFO_SAMPLES(util_logbase2(layout->nr_samples)) | A6XX_RB_BLIT_DST_INFO_COLOR_FORMAT(blit_format) | A6XX_RB_BLIT_DST_INFO_COLOR_SWAP(color_swap) | - COND(ubwc_enabled, A6XX_RB_BLIT_DST_INFO_FLAGS); + COND(ubwc_enabled, A6XX_RB_BLIT_DST_INFO_FLAGS) | + COND(args->ubwc_fc_mutable, A6XX_RB_BLIT_DST_INFO_MUTABLEEN); } void diff --git a/src/freedreno/fdl/freedreno_layout.h b/src/freedreno/fdl/freedreno_layout.h index 4b45b5d08ce..531046dfe3c 100644 --- a/src/freedreno/fdl/freedreno_layout.h +++ b/src/freedreno/fdl/freedreno_layout.h @@ -296,6 +296,7 @@ struct fdl_view_args { enum pipe_format format; enum fdl_view_type type; enum fdl_chroma_location chroma_offsets[2]; + bool ubwc_fc_mutable; }; #define FDL6_TEX_CONST_DWORDS 16 diff --git a/src/freedreno/registers/adreno/a6xx.xml b/src/freedreno/registers/adreno/a6xx.xml index 53a45322842..f50f17907f4 100644 --- a/src/freedreno/registers/adreno/a6xx.xml +++ b/src/freedreno/registers/adreno/a6xx.xml @@ -4172,6 +4172,7 @@ to upconvert to 32b float internally? + @@ -4470,11 +4471,21 @@ to upconvert to 32b float internally? + + + + + + + + + + + - - + @@ -5845,7 +5856,7 @@ to upconvert to 32b float internally? badly named or the functionality moved in a6xx. But downstream kernel calls this "a6xx_sp_ps_tp_2d_cluster" --> - + @@ -5856,7 +5867,7 @@ to upconvert to 32b float internally? - + @@ -6380,7 +6391,7 @@ to upconvert to 32b float internally? - + Texture constant dwords @@ -6420,6 +6431,7 @@ to upconvert to 32b float internally? +