From 87526f849033709849c05995d9b4cd1e9ad027f4 Mon Sep 17 00:00:00 2001 From: Caterina Shablia Date: Wed, 17 Dec 2025 07:12:11 +0000 Subject: [PATCH] wip --- include/drm-uapi/drm_fourcc.h | 7 +++++++ src/panfrost/genxml/v10.xml | 4 +++- src/panfrost/genxml/v12.xml | 4 +++- src/panfrost/genxml/v13.xml | 4 +++- src/panfrost/lib/pan_desc.c | 29 +++++++++++++++++++++++++++++ src/panfrost/lib/pan_desc.h | 6 ++++++ src/panfrost/lib/pan_mod.c | 1 + src/panfrost/lib/pan_texture.c | 13 +++++++++---- 8 files changed, 61 insertions(+), 7 deletions(-) diff --git a/include/drm-uapi/drm_fourcc.h b/include/drm-uapi/drm_fourcc.h index e527b24bd82..cc199c9101b 100644 --- a/include/drm-uapi/drm_fourcc.h +++ b/include/drm-uapi/drm_fourcc.h @@ -1422,6 +1422,13 @@ drm_fourcc_canonicalize_nvidia_format_mod(__u64 modifier) #define DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED \ DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 1ULL) + +/* + * Arm 64k interleaved + */ +#define DRM_FORMAT_MOD_ARM_64K_INTERLEAVED \ + DRM_FORMAT_MOD_ARM_CODE(DRM_FORMAT_MOD_ARM_TYPE_MISC, 2ULL) + /* * Allwinner tiled modifier * diff --git a/src/panfrost/genxml/v10.xml b/src/panfrost/genxml/v10.xml index 05092c5cbca..bde9e24e8f6 100644 --- a/src/panfrost/genxml/v10.xml +++ b/src/panfrost/genxml/v10.xml @@ -366,6 +366,7 @@ + @@ -941,7 +942,7 @@ - + @@ -1156,6 +1157,7 @@ + diff --git a/src/panfrost/genxml/v12.xml b/src/panfrost/genxml/v12.xml index 107600e9fbf..96a3df92568 100644 --- a/src/panfrost/genxml/v12.xml +++ b/src/panfrost/genxml/v12.xml @@ -367,6 +367,7 @@ + @@ -1177,7 +1178,7 @@ - + @@ -1419,6 +1420,7 @@ + diff --git a/src/panfrost/genxml/v13.xml b/src/panfrost/genxml/v13.xml index a9feb530361..7d4abb873fd 100644 --- a/src/panfrost/genxml/v13.xml +++ b/src/panfrost/genxml/v13.xml @@ -367,6 +367,7 @@ + @@ -1486,7 +1487,7 @@ - + @@ -1721,6 +1722,7 @@ + diff --git a/src/panfrost/lib/pan_desc.c b/src/panfrost/lib/pan_desc.c index 3bdb4b71425..04af351317f 100644 --- a/src/panfrost/lib/pan_desc.c +++ b/src/panfrost/lib/pan_desc.c @@ -827,6 +827,35 @@ GENX(pan_emit_afrc_color_attachment)(const struct pan_fb_info *fb, cfg.writeback_buffer.surface_stride = surf_stride; } } + +void +GENX(pan_emit_interleaved_64k_color_attachment)(const struct pan_fb_info *fb, + unsigned rt_idx, + unsigned layer_or_z_slice, + unsigned cbuf_offset, void *payload) +{ + const struct pan_fb_color_attachment *rt = &fb->rts[rt_idx]; + const struct pan_image_view *iview = rt->view; + uint64_t base, row_stride, surf_stride; + + get_tiled_or_linear_att_mem_props(pan_image_view_get_color_plane(iview), + iview->first_level, layer_or_z_slice, + &base, &row_stride, &surf_stride); + + /* TODO: YUV RT. */ + assert(!pan_format_is_yuv(iview->format)); + pan_cast_and_pack(payload, RGB_RENDER_TARGET, cfg) { + rt_common_cfg(rt, cbuf_offset, fb->tile_size, cfg); + cfg.write_enable = true; + cfg.writeback_block_format = MALI_BLOCK_FORMAT_INTERLEAVED_64K; + get_rt_formats(iview->format, &cfg.writeback_format, &cfg.internal_format, + &cfg.swizzle); + cfg.srgb = util_format_is_srgb(iview->format); + cfg.writeback_buffer.base = base; + cfg.writeback_buffer.row_stride = row_stride; + cfg.writeback_buffer.surface_stride = surf_stride; + } +} #endif #endif diff --git a/src/panfrost/lib/pan_desc.h b/src/panfrost/lib/pan_desc.h index af067b0cad5..7851eeaf923 100644 --- a/src/panfrost/lib/pan_desc.h +++ b/src/panfrost/lib/pan_desc.h @@ -315,6 +315,12 @@ void GENX(pan_emit_afrc_color_attachment)(const struct pan_fb_info *fb, unsigned rt_idx, unsigned layer_or_z_slice, unsigned cbuf_offset, void *payload); + +void +GENX(pan_emit_interleaved_64k_color_attachment)(const struct pan_fb_info *fb, + unsigned rt_idx, + unsigned layer_or_z_slice, + unsigned cbuf_offset, void *payload); #endif unsigned GENX(pan_emit_fbd)(const struct pan_fb_info *fb, unsigned layer_idx, diff --git a/src/panfrost/lib/pan_mod.c b/src/panfrost/lib/pan_mod.c index f02f92196af..2d0de43e47b 100644 --- a/src/panfrost/lib/pan_mod.c +++ b/src/panfrost/lib/pan_mod.c @@ -726,6 +726,7 @@ static const struct pan_mod_handler pan_mod_handlers[] = { PAN_MOD_DEF(linear), #if PAN_ARCH >= 10 PAN_MOD_DEF(afrc), + // PAN_MOD_DEF(interleaved_64k), #endif }; diff --git a/src/panfrost/lib/pan_texture.c b/src/panfrost/lib/pan_texture.c index a3a5f850f58..435ef70916c 100644 --- a/src/panfrost/lib/pan_texture.c +++ b/src/panfrost/lib/pan_texture.c @@ -410,7 +410,8 @@ emit_generic_plane(const struct pan_image_view *iview, int plane_idx, /* 3-planar formats must use Chroma 2p planes for the U V planes. */ assert(plane_idx == 0 || desc->layout != UTIL_FORMAT_LAYOUT_PLANAR3); assert(props->modifier == DRM_FORMAT_MOD_LINEAR || - props->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED); + props->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED || + props->modifier == DRM_FORMAT_MOD_ARM_64K_INTERLEAVED); get_linear_or_u_tiled_plane_props(iview, plane_idx, mip_level, layer_or_z_slice, &plane_addr, &row_stride, @@ -418,9 +419,13 @@ emit_generic_plane(const struct pan_image_view *iview, int plane_idx, pan_cast_and_pack(payload, GENERIC_PLANE, cfg) { cfg.clump_ordering = - props->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED - ? MALI_CLUMP_ORDERING_TILED_U_INTERLEAVED - : MALI_CLUMP_ORDERING_LINEAR; + props->modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED ? + MALI_CLUMP_ORDERING_TILED_U_INTERLEAVED : +#if PAN_ARCH >= 10 + props->modifier == DRM_FORMAT_MOD_ARM_64K_INTERLEAVED ? + MALI_CLUMP_ORDERING_INTERLEAVED_64K : +#endif + MALI_CLUMP_ORDERING_LINEAR; cfg.clump_format = pan_clump_format(iview->format); PLANE_SET_SIZE(cfg, plane_size); cfg.pointer = plane_addr;