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?
+