diff --git a/src/panfrost/genxml/decode.c b/src/panfrost/genxml/decode.c index a0dfbca06a0..8ab981a6c58 100644 --- a/src/panfrost/genxml/decode.c +++ b/src/panfrost/genxml/decode.c @@ -72,24 +72,142 @@ pandecode_midgard_tiler_descriptor(struct pandecode_context *ctx, #if PAN_ARCH >= 5 static void -pandecode_render_target(struct pandecode_context *ctx, uint64_t gpu_va, - unsigned gpu_id, - const struct MALI_FRAMEBUFFER_PARAMETERS *fb) +pandecode_rt(struct pandecode_context *ctx, unsigned index, uint64_t gpu_va) +{ + uint64_t rt_va = gpu_va + index * pan_size(RENDER_TARGET); + const struct mali_render_target_packed *PANDECODE_PTR_VAR(ctx, rtp, rt_va); + + pan_unpack(rtp, RENDER_TARGET, rt); +#if PAN_ARCH >= 10 + switch (rt.rgb.writeback_mode) { + case MALI_WRITEBACK_MODE_COMPAT: + break; + case MALI_WRITEBACK_MODE_AFRC_RGB: + DUMP_UNPACKED(ctx, AFRC_RGB_RENDER_TARGET, rt.afrc_rgb, + "AFRC RGB Color Render Target %d:\n", index); + break; + case MALI_WRITEBACK_MODE_AFRC_YUV: + DUMP_UNPACKED(ctx, AFRC_YUV_RENDER_TARGET, rt.afrc_yuv, + "AFRC YUV Color Render Target %d:\n", index); + break; + default: + unreachable("Invalid writeback mode"); + } +#endif + + switch (rt.rgb.writeback_block_format) { +#if PAN_ARCH >= 7 + case MALI_BLOCK_FORMAT_NO_WRITE: +#else + case MALI_BLOCK_FORMAT_TILED_LINEAR: +#endif + case MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED: + case MALI_BLOCK_FORMAT_LINEAR: + if (rt.rgb.yuv_enable) { + DUMP_UNPACKED(ctx, YUV_RENDER_TARGET, rt.yuv, + "%s YUV Color Render Target %d:\n", + rt.rgb.writeback_block_format == MALI_BLOCK_FORMAT_LINEAR + ? "Linear" + : "U-Tiled", + index); + } else { + DUMP_UNPACKED(ctx, RGB_RENDER_TARGET, rt.rgb, + "%s RGB Color Render Target %d:\n", + rt.rgb.writeback_block_format == MALI_BLOCK_FORMAT_LINEAR + ? "Linear" + : "U-Tiled", + index); + } + break; +#if PAN_ARCH >= 7 + case MALI_BLOCK_FORMAT_AFBC_TILED: +#endif + case MALI_BLOCK_FORMAT_AFBC: +#if PAN_ARCH >= 6 + if (rt.rgb.yuv_enable) { + DUMP_UNPACKED(ctx, AFBC_YUV_RENDER_TARGET, rt.afbc_yuv, + "AFBC YUV Color Render Target %d:\n", index); + break; + } +#else + assert(!rt.rgb.yuv_enable); +#endif + + DUMP_UNPACKED(ctx, AFBC_RGB_RENDER_TARGET, rt.afbc_rgb, + "AFBC RGB Color Render Target %d:\n", index); + break; + } +} + +static void +pandecode_rts(struct pandecode_context *ctx, uint64_t gpu_va, unsigned gpu_id, + const struct MALI_FRAMEBUFFER_PARAMETERS *fb) { pandecode_log(ctx, "Color Render Targets @%" PRIx64 ":\n", gpu_va); ctx->indent++; - for (int i = 0; i < (fb->render_target_count); i++) { - uint64_t rt_va = gpu_va + i * pan_size(RENDER_TARGET); - const struct mali_render_target_packed *PANDECODE_PTR_VAR( - ctx, rtp, (uint64_t)rt_va); - DUMP_CL(ctx, RENDER_TARGET, rtp, "Color Render Target %d:\n", i); - } + for (int i = 0; i < (fb->render_target_count); i++) + pandecode_rt(ctx, i, gpu_va); ctx->indent--; pandecode_log(ctx, "\n"); } + +static void +pandecode_zs_crc_ext(struct pandecode_context *ctx, uint64_t gpu_va) +{ + const struct mali_zs_crc_extension_packed *PANDECODE_PTR_VAR( + ctx, zs_crc_packed, (uint64_t)gpu_va); + + pan_unpack(zs_crc_packed, ZS_CRC_EXTENSION, zs_crc); + DUMP_UNPACKED(ctx, CRC, zs_crc.crc, "CRC:\n"); + + switch (zs_crc.zs.block_format) { +#if PAN_ARCH >= 7 + case MALI_BLOCK_FORMAT_NO_WRITE: +#else + case MALI_BLOCK_FORMAT_TILED_LINEAR: #endif + case MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED: + case MALI_BLOCK_FORMAT_LINEAR: + DUMP_UNPACKED(ctx, ZS_TARGET, zs_crc.zs, "ZS:\n"); + break; +#if PAN_ARCH >= 7 + case MALI_BLOCK_FORMAT_AFBC_TILED: +#endif + case MALI_BLOCK_FORMAT_AFBC: + DUMP_UNPACKED(ctx, AFBC_ZS_TARGET, zs_crc.afbc_zs, "ZS:\n"); + break; + + default: + unreachable("Invalid block format"); + } + + switch (zs_crc.s.block_format) { +#if PAN_ARCH >= 7 + case MALI_BLOCK_FORMAT_NO_WRITE: +#else + case MALI_BLOCK_FORMAT_TILED_LINEAR: +#endif + case MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED: + case MALI_BLOCK_FORMAT_LINEAR: + DUMP_UNPACKED(ctx, S_TARGET, zs_crc.s, "S:\n"); + break; +#if PAN_ARCH >= 9 + case MALI_BLOCK_FORMAT_AFBC_TILED: + case MALI_BLOCK_FORMAT_AFBC: + DUMP_UNPACKED(ctx, AFBC_S_TARGET, zs_crc.afbc_s, "S:\n"); + break; +#endif + + default: + unreachable("Invalid block format"); + } + + pandecode_log(ctx, "\n"); +} +#endif + #if PAN_ARCH >= 6 static void @@ -175,16 +293,13 @@ GENX(pandecode_fbd)(struct pandecode_context *ctx, uint64_t gpu_va, gpu_va += pan_size(FRAMEBUFFER); if (params.has_zs_crc_extension) { - const struct mali_zs_crc_extension_packed *PANDECODE_PTR_VAR( - ctx, zs_crc, (uint64_t)gpu_va); - DUMP_CL(ctx, ZS_CRC_EXTENSION, zs_crc, "ZS CRC Extension:\n"); - pandecode_log(ctx, "\n"); + pandecode_zs_crc_ext(ctx, gpu_va); gpu_va += pan_size(ZS_CRC_EXTENSION); } if (is_fragment) - pandecode_render_target(ctx, gpu_va, gpu_id, ¶ms); + pandecode_rts(ctx, gpu_va, gpu_id, ¶ms); return (struct pandecode_fbd){ .rt_count = params.render_target_count, diff --git a/src/panfrost/genxml/v10.xml b/src/panfrost/genxml/v10.xml index 51f0e2d7651..86bfaeedf31 100644 --- a/src/panfrost/genxml/v10.xml +++ b/src/panfrost/genxml/v10.xml @@ -1666,33 +1666,70 @@ - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + - + - - - - - + - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1712,8 +1749,46 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1723,9 +1798,23 @@ + - + + + + + + + + + + + + + + @@ -1737,28 +1826,13 @@ + - - - - - - - - - - - - - - - - - + - + @@ -1769,10 +1843,84 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/panfrost/genxml/v12.xml b/src/panfrost/genxml/v12.xml index aea309c51dc..a3251ac8b29 100644 --- a/src/panfrost/genxml/v12.xml +++ b/src/panfrost/genxml/v12.xml @@ -1861,7 +1861,8 @@ - + + @@ -1954,33 +1955,72 @@ - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + + - + - - - - - + - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2000,39 +2040,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2040,13 +2047,10 @@ - - - - + - + @@ -2057,10 +2061,157 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/panfrost/genxml/v13.xml b/src/panfrost/genxml/v13.xml index 1969aefdab9..b5d17bf489d 100644 --- a/src/panfrost/genxml/v13.xml +++ b/src/panfrost/genxml/v13.xml @@ -2163,7 +2163,8 @@ - + + @@ -2260,33 +2261,72 @@ - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + + - + - - - - - + - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2306,39 +2346,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -2346,13 +2353,10 @@ - - - - + - + @@ -2363,10 +2367,157 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/panfrost/genxml/v5.xml b/src/panfrost/genxml/v5.xml index e1863ff8acf..516f1f381d3 100644 --- a/src/panfrost/genxml/v5.xml +++ b/src/panfrost/genxml/v5.xml @@ -918,33 +918,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + @@ -971,7 +988,58 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -988,28 +1056,9 @@ - - - - - - - - - - - - - - - - - - - - + - + @@ -1021,17 +1070,21 @@ - - - - - - - - + + + + + + + + + + + +
diff --git a/src/panfrost/genxml/v6.xml b/src/panfrost/genxml/v6.xml index 617eadc4208..6828808b0bc 100644 --- a/src/panfrost/genxml/v6.xml +++ b/src/panfrost/genxml/v6.xml @@ -980,26 +980,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - + + + + @@ -1026,8 +1051,46 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1037,9 +1100,23 @@ + - + + + + + + + + + + + + + + @@ -1053,20 +1130,12 @@ + - - - - - - - - - - + - + @@ -1078,10 +1147,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/panfrost/genxml/v7.xml b/src/panfrost/genxml/v7.xml index 42e371aa58c..a11fd001f53 100644 --- a/src/panfrost/genxml/v7.xml +++ b/src/panfrost/genxml/v7.xml @@ -1075,27 +1075,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + @@ -1115,8 +1136,44 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1126,9 +1183,22 @@ + - + + + + + + + + + + + + + @@ -1142,20 +1212,12 @@ + - - - - - - - - - - + - + @@ -1166,10 +1228,34 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/panfrost/genxml/v9.xml b/src/panfrost/genxml/v9.xml index 2ec0f2c282d..5b82b8e45a0 100644 --- a/src/panfrost/genxml/v9.xml +++ b/src/panfrost/genxml/v9.xml @@ -1097,33 +1097,70 @@ - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + - + - - - - - + - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1143,8 +1180,44 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1154,9 +1227,22 @@ + - + + + + + + + + + + + + + @@ -1168,20 +1254,12 @@ + - - - - - - - - - - + - + @@ -1192,10 +1270,32 @@ - + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/panfrost/lib/pan_desc.c b/src/panfrost/lib/pan_desc.c index 6e896026a11..bee5ee0b63d 100644 --- a/src/panfrost/lib/pan_desc.c +++ b/src/panfrost/lib/pan_desc.c @@ -234,15 +234,18 @@ GENX(pan_emit_linear_s_attachment)(const struct pan_fb_info *fb, unsigned layer_or_z_slice, void *payload) { const struct pan_image_view *s = fb->zs.view.s; + uint64_t base, row_stride, surf_stride; - pan_cast_and_pack(payload, ZS_CRC_EXTENSION, cfg) { - cfg.s_msaa = mali_sampling_mode(s); - cfg.s_write_format = translate_s_format(s->format); - cfg.s_block_format = MALI_BLOCK_FORMAT_LINEAR; - get_tiled_or_linear_att_mem_props( - pan_image_view_get_s_plane(s), s->first_level, layer_or_z_slice, - &cfg.s_writeback_base, &cfg.s_writeback_row_stride, - &cfg.s_writeback_surface_stride); + get_tiled_or_linear_att_mem_props(pan_image_view_get_s_plane(s), + s->first_level, layer_or_z_slice, &base, + &row_stride, &surf_stride); + pan_cast_and_pack(payload, S_TARGET, cfg) { + cfg.msaa = mali_sampling_mode(s); + cfg.write_format = translate_s_format(s->format); + cfg.block_format = MALI_BLOCK_FORMAT_LINEAR; + cfg.base = base; + cfg.row_stride = row_stride; + cfg.surface_stride = surf_stride; } } @@ -255,15 +258,17 @@ GENX(pan_emit_afbc_s_attachment)(const struct pan_fb_info *fb, #if PAN_ARCH >= 9 const struct pan_image_view *s = fb->zs.view.s; const struct pan_image_plane_ref pref = pan_image_view_get_s_plane(s); + uint64_t header, body_offset, hdr_row_stride; - pan_cast_and_pack(payload, ZS_CRC_EXTENSION, cfg) { - cfg.s_msaa = mali_sampling_mode(s); - cfg.s_write_format = translate_zs_format(s->format); - cfg.s_block_format = get_afbc_block_format(pref.image->props.modifier); - - get_afbc_att_mem_props(pref, s->first_level, layer_or_z_slice, - &cfg.s_writeback_base, &cfg.s_afbc_body_offset, - &cfg.s_writeback_row_stride); + get_afbc_att_mem_props(pref, s->first_level, layer_or_z_slice, &header, + &body_offset, &hdr_row_stride); + pan_cast_and_pack(payload, AFBC_S_TARGET, cfg) { + cfg.msaa = mali_sampling_mode(s); + cfg.write_format = translate_zs_format(s->format); + cfg.block_format = get_afbc_block_format(pref.image->props.modifier); + cfg.header = header; + cfg.body_offset = body_offset; + cfg.header_row_stride = hdr_row_stride; } #endif } @@ -273,15 +278,18 @@ GENX(pan_emit_u_tiled_s_attachment)(const struct pan_fb_info *fb, unsigned layer_or_z_slice, void *payload) { const struct pan_image_view *s = fb->zs.view.s; + uint64_t base, row_stride, surf_stride; - pan_cast_and_pack(payload, ZS_CRC_EXTENSION, cfg) { - cfg.s_msaa = mali_sampling_mode(s); - cfg.s_write_format = translate_s_format(s->format); - cfg.s_block_format = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED; - get_tiled_or_linear_att_mem_props( - pan_image_view_get_s_plane(s), s->first_level, layer_or_z_slice, - &cfg.s_writeback_base, &cfg.s_writeback_row_stride, - &cfg.s_writeback_surface_stride); + get_tiled_or_linear_att_mem_props(pan_image_view_get_s_plane(s), + s->first_level, layer_or_z_slice, &base, + &row_stride, &surf_stride); + pan_cast_and_pack(payload, S_TARGET, cfg) { + cfg.msaa = mali_sampling_mode(s); + cfg.write_format = translate_s_format(s->format); + cfg.block_format = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED; + cfg.base = base; + cfg.row_stride = row_stride; + cfg.surface_stride = surf_stride; } } @@ -290,18 +298,18 @@ GENX(pan_emit_linear_zs_attachment)(const struct pan_fb_info *fb, unsigned layer_or_z_slice, void *payload) { const struct pan_image_view *zs = fb->zs.view.zs; + uint64_t base, row_stride, surf_stride; - pan_cast_and_pack(payload, ZS_CRC_EXTENSION, cfg) { - cfg.zs_msaa = mali_sampling_mode(zs); - cfg.zs_write_format = translate_zs_format(zs->format); - cfg.zs_block_format = MALI_BLOCK_FORMAT_LINEAR; - get_tiled_or_linear_att_mem_props( - pan_image_view_get_zs_plane(zs), zs->first_level, layer_or_z_slice, - &cfg.zs_writeback_base, &cfg.zs_writeback_row_stride, - &cfg.zs_writeback_surface_stride); - - if (cfg.zs_write_format == MALI_ZS_FORMAT_D24S8) - cfg.s_writeback_base = cfg.zs_writeback_base; + get_tiled_or_linear_att_mem_props(pan_image_view_get_zs_plane(zs), + zs->first_level, layer_or_z_slice, &base, + &row_stride, &surf_stride); + pan_cast_and_pack(payload, ZS_TARGET, cfg) { + cfg.msaa = mali_sampling_mode(zs); + cfg.write_format = translate_zs_format(zs->format); + cfg.block_format = MALI_BLOCK_FORMAT_LINEAR; + cfg.base = base; + cfg.row_stride = row_stride; + cfg.surface_stride = surf_stride; } } @@ -310,18 +318,18 @@ GENX(pan_emit_u_tiled_zs_attachment)(const struct pan_fb_info *fb, unsigned layer_or_z_slice, void *payload) { const struct pan_image_view *zs = fb->zs.view.zs; + uint64_t base, row_stride, surf_stride; - pan_cast_and_pack(payload, ZS_CRC_EXTENSION, cfg) { - cfg.zs_msaa = mali_sampling_mode(zs); - cfg.zs_write_format = translate_zs_format(zs->format); - cfg.zs_block_format = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED; - get_tiled_or_linear_att_mem_props( - pan_image_view_get_zs_plane(zs), zs->first_level, layer_or_z_slice, - &cfg.zs_writeback_base, &cfg.zs_writeback_row_stride, - &cfg.zs_writeback_surface_stride); - - if (cfg.zs_write_format == MALI_ZS_FORMAT_D24S8) - cfg.s_writeback_base = cfg.zs_writeback_base; + get_tiled_or_linear_att_mem_props(pan_image_view_get_zs_plane(zs), + zs->first_level, layer_or_z_slice, &base, + &row_stride, &surf_stride); + pan_cast_and_pack(payload, ZS_TARGET, cfg) { + cfg.msaa = mali_sampling_mode(zs); + cfg.write_format = translate_zs_format(zs->format); + cfg.block_format = MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED; + cfg.base = base; + cfg.row_stride = row_stride; + cfg.surface_stride = surf_stride; } } @@ -331,30 +339,31 @@ GENX(pan_emit_afbc_zs_attachment)(const struct pan_fb_info *fb, { const struct pan_image_view *zs = fb->zs.view.zs; const struct pan_image_plane_ref pref = pan_image_view_get_zs_plane(zs); + uint64_t header, body_offset, hdr_row_stride; - pan_cast_and_pack(payload, ZS_CRC_EXTENSION, cfg) { - cfg.zs_msaa = mali_sampling_mode(zs); - cfg.zs_write_format = translate_zs_format(zs->format); - cfg.zs_block_format = get_afbc_block_format(pref.image->props.modifier); + get_afbc_att_mem_props(pref, zs->first_level, layer_or_z_slice, &header, + &body_offset, &hdr_row_stride); + + pan_cast_and_pack(payload, AFBC_ZS_TARGET, cfg) { + cfg.msaa = mali_sampling_mode(zs); + cfg.write_format = translate_zs_format(zs->format); + cfg.block_format = get_afbc_block_format(pref.image->props.modifier); #if PAN_ARCH >= 9 - get_afbc_att_mem_props(pref, zs->first_level, layer_or_z_slice, - &cfg.zs_writeback_base, &cfg.zs_afbc_body_offset, - &cfg.zs_writeback_row_stride); + cfg.header = header; + cfg.body_offset = body_offset; + cfg.header_row_stride = hdr_row_stride; #else - uint64_t body_offset, row_stride; - - get_afbc_att_mem_props(pref, zs->first_level, layer_or_z_slice, - &cfg.zs_afbc_header, &body_offset, &row_stride); - cfg.zs_afbc_body = cfg.zs_afbc_header + body_offset; + cfg.header = header; + cfg.body = header + body_offset; #if PAN_ARCH >= 6 - cfg.zs_afbc_row_stride = - pan_afbc_stride_blocks(pref.image->props.modifier, row_stride); + cfg.header_row_stride = + pan_afbc_stride_blocks(pref.image->props.modifier, hdr_row_stride); #else - cfg.zs_afbc_body_size = 0x1000; - cfg.zs_afbc_chunk_size = 9; - cfg.zs_afbc_sparse = true; + cfg.body_size = 0x1000; + cfg.chunk_size = 9; + cfg.sparse = true; #endif #endif } @@ -362,7 +371,7 @@ GENX(pan_emit_afbc_zs_attachment)(const struct pan_fb_info *fb, static void pan_prepare_crc(const struct pan_fb_info *fb, int rt_crc, - struct MALI_ZS_CRC_EXTENSION *ext) + struct MALI_CRC *crc) { if (rt_crc < 0) return; @@ -376,16 +385,16 @@ pan_prepare_crc(const struct pan_fb_info *fb, int rt_crc, const struct pan_image_slice_layout *slice = &plane->layout.slices[rt->first_level]; - ext->crc_base = plane->base + slice->crc.offset_B; - ext->crc_row_stride = slice->crc.stride_B; + crc->base = plane->base + slice->crc.offset_B; + crc->row_stride = slice->crc.stride_B; #if PAN_ARCH >= 7 - ext->crc_render_target = rt_crc; + crc->render_target = rt_crc; if (fb->rts[rt_crc].clear) { uint32_t clear_val = fb->rts[rt_crc].clear_value[0]; - ext->crc_clear_color = clear_val | 0xc000000000000000 | - (((uint64_t)clear_val & 0xffff) << 32); + crc->clear_color = clear_val | 0xc000000000000000 | + (((uint64_t)clear_val & 0xffff) << 32); } #endif } @@ -397,8 +406,8 @@ pan_emit_zs_crc_ext(const struct pan_fb_info *fb, unsigned layer_idx, struct mali_zs_crc_extension_packed desc; pan_pack(&desc, ZS_CRC_EXTENSION, cfg) { - pan_prepare_crc(fb, rt_crc, &cfg); - cfg.zs_clean_pixel_write_enable = fb->zs.clear.z || fb->zs.clear.s; + pan_prepare_crc(fb, rt_crc, &cfg.crc); + cfg.zs.clean_pixel_write_enable = fb->zs.clear.z || fb->zs.clear.s; } if (fb->zs.view.zs) { @@ -572,17 +581,14 @@ pan_mfbd_raw_format(unsigned bits) /* clang-format on */ } -static unsigned -pan_rt_init_format(const struct pan_image_view *rt, - struct MALI_RENDER_TARGET *cfg) +static void +get_rt_formats(enum pipe_format pfmt, uint32_t *writeback, uint32_t *internal, + uint32_t *pswizzle) { /* Explode details on the format */ - - const struct util_format_description *desc = - util_format_description(rt->format); + const struct util_format_description *desc = util_format_description(pfmt); /* The swizzle for rendering is inverted from texturing */ - unsigned char swizzle[4] = { PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, @@ -590,18 +596,12 @@ pan_rt_init_format(const struct pan_image_view *rt, PIPE_SWIZZLE_W, }; - /* Fill in accordingly, defaulting to 8-bit UNORM */ + const struct pan_blendable_format *bfmt = + GENX(pan_blendable_format_from_pipe_format)(pfmt); - if (desc->colorspace == UTIL_FORMAT_COLORSPACE_SRGB) - cfg->srgb = true; - - struct pan_blendable_format fmt = - *GENX(pan_blendable_format_from_pipe_format)(rt->format); - enum mali_color_format writeback_format; - - if (fmt.internal) { - cfg->internal_format = fmt.internal; - writeback_format = fmt.writeback; + if (bfmt->internal) { + *internal = bfmt->internal; + *writeback = bfmt->writeback; pan_invert_swizzle(desc->swizzle, swizzle); } else { /* Construct RAW internal/writeback, where internal is @@ -613,95 +613,111 @@ pan_rt_init_format(const struct pan_image_view *rt, unsigned offset = util_logbase2_ceil(bits) - 3; assert(offset <= 4); - cfg->internal_format = MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW8 + offset; - writeback_format = pan_mfbd_raw_format(bits); + *internal = MALI_COLOR_BUFFER_INTERNAL_FORMAT_RAW8 + offset; + *writeback = pan_mfbd_raw_format(bits); } - cfg->swizzle = pan_translate_swizzle_4(swizzle); - - return writeback_format; + *pswizzle = pan_translate_swizzle_4(swizzle); } /* forward declaration */ static bool pan_force_clean_write_on(const struct pan_image *img, unsigned tile_size); -static void -pan_prepare_rt_common(const struct pan_fb_info *fb, unsigned rt_idx, - unsigned cbuf_offset, struct MALI_RENDER_TARGET *cfg) +static struct MALI_RT_CLEAR +rt_clear(const struct pan_fb_color_attachment *rt) { - cfg->clean_pixel_write_enable = fb->rts[rt_idx].clear; - cfg->internal_buffer_offset = cbuf_offset; - if (fb->rts[rt_idx].clear) { - cfg->clear.color_0 = fb->rts[rt_idx].clear_value[0]; - cfg->clear.color_1 = fb->rts[rt_idx].clear_value[1]; - cfg->clear.color_2 = fb->rts[rt_idx].clear_value[2]; - cfg->clear.color_3 = fb->rts[rt_idx].clear_value[3]; - } - cfg->dithering_enable = true; + if (!rt->clear) + return (struct MALI_RT_CLEAR){0}; - if (fb->rts[rt_idx].view) { - cfg->writeback_msaa = mali_sampling_mode(fb->rts[rt_idx].view); + return (struct MALI_RT_CLEAR){ + .color_0 = rt->clear_value[0], + .color_1 = rt->clear_value[1], + .color_2 = rt->clear_value[2], + .color_3 = rt->clear_value[3], + }; +} + +static bool +rt_clean_pixel_write(const struct pan_fb_color_attachment *rt, + unsigned tile_size) +{ + if (rt->clear) + return true; #if PAN_ARCH >= 6 - const struct pan_image_plane_ref pref = - pan_image_view_get_color_plane(fb->rts[rt_idx].view); + const struct pan_image_plane_ref pref = + pan_image_view_get_color_plane(rt->view); - cfg->clean_pixel_write_enable |= - pan_force_clean_write_on(pref.image, fb->tile_size); + if (pan_force_clean_write_on(pref.image, tile_size)) + return true; #endif - } + + return false; } +#define rt_common_cfg(rt__, cbuf_offset__, tile_size__, cfg__) \ + do { \ + assert((rt__)->view != NULL); \ + (cfg__).clean_pixel_write_enable = \ + rt_clean_pixel_write(rt__, tile_size__); \ + (cfg__).internal_buffer_offset = cbuf_offset__; \ + (cfg__).clear = rt_clear(rt__); \ + (cfg__).dithering_enable = true; \ + (cfg__).writeback_msaa = mali_sampling_mode((rt__)->view); \ + } while (0) + void GENX(pan_emit_afbc_color_attachment)(const struct pan_fb_info *fb, unsigned rt_idx, unsigned layer_or_z_slice, unsigned cbuf_offset, void *payload) { - const struct pan_image_view *iview = fb->rts[rt_idx].view; - const unsigned mip_level = iview->first_level; + const struct pan_fb_color_attachment *rt = &fb->rts[rt_idx]; + const struct pan_image_view *iview = rt->view; const struct pan_image_plane_ref pref = pan_image_view_get_color_plane(iview); const struct pan_image *image = pref.image; + uint64_t header, body_offset, hdr_row_stride; - pan_cast_and_pack(payload, RENDER_TARGET, cfg) { - pan_prepare_rt_common(fb, rt_idx, cbuf_offset, &cfg); + get_afbc_att_mem_props(pref, iview->first_level, layer_or_z_slice, &header, + &body_offset, &hdr_row_stride); + + /* TODO: YUV RT. */ + assert(!pan_format_is_yuv(iview->format)); + pan_cast_and_pack(payload, AFBC_RGB_RENDER_TARGET, cfg) { + rt_common_cfg(rt, cbuf_offset, fb->tile_size, cfg); cfg.write_enable = true; - cfg.writeback_format = pan_rt_init_format(iview, &cfg); + get_rt_formats(iview->format, &cfg.writeback_format, &cfg.internal_format, + &cfg.swizzle); + cfg.srgb = util_format_is_srgb(iview->format); cfg.writeback_block_format = get_afbc_block_format(image->props.modifier); - cfg.afbc.yuv_transform = image->props.modifier & AFBC_FORMAT_MOD_YTR; - + cfg.yuv_transform = image->props.modifier & AFBC_FORMAT_MOD_YTR; #if PAN_ARCH >= 6 - cfg.afbc.wide_block = pan_afbc_is_wide(image->props.modifier); - cfg.afbc.split_block = (image->props.modifier & AFBC_FORMAT_MOD_SPLIT); + cfg.wide_block = pan_afbc_is_wide(image->props.modifier); + cfg.split_block = (image->props.modifier & AFBC_FORMAT_MOD_SPLIT); #endif #if PAN_ARCH >= 9 - get_afbc_att_mem_props(pref, mip_level, layer_or_z_slice, - &cfg.afbc.header, &cfg.afbc.body_offset, - &cfg.afbc.row_stride); - cfg.afbc.compression_mode = pan_afbc_compression_mode(iview->format, 0); + cfg.header = header; + cfg.body_offset = body_offset; + cfg.row_stride = hdr_row_stride; + cfg.compression_mode = pan_afbc_compression_mode(iview->format, 0); #else - uint64_t body_offset, row_stride; - - get_afbc_att_mem_props(pref, mip_level, layer_or_z_slice, - &cfg.afbc.header, &body_offset, - &row_stride); - cfg.afbc.body = cfg.afbc.header + body_offset; + cfg.header = header; + cfg.body = header + body_offset; #if PAN_ARCH >= 6 - cfg.afbc.row_stride = - pan_afbc_stride_blocks(image->props.modifier, row_stride); + cfg.row_stride = + pan_afbc_stride_blocks(image->props.modifier, hdr_row_stride); #else const struct pan_image_plane *plane = image->planes[pref.plane_idx]; const struct pan_image_slice_layout *slayout = - &plane->layout.slices[mip_level]; + &plane->layout.slices[iview->first_level]; - cfg.afbc.body_size = - slayout->afbc.surface_stride_B - - pan_afbc_body_offset(PAN_ARCH, image->props.modifier, - slayout->afbc.header.surface_size_B); - cfg.afbc.chunk_size = 9; - cfg.afbc.sparse = true; + cfg.body_size = slayout->afbc.surface_stride_B - + pan_afbc_body_offset(PAN_ARCH, image->props.modifier, + slayout->afbc.header.surface_size_B); + cfg.chunk_size = 9; + cfg.sparse = true; #endif #endif } @@ -713,17 +729,26 @@ GENX(pan_emit_u_tiled_color_attachment)(const struct pan_fb_info *fb, unsigned layer_or_z_slice, unsigned cbuf_offset, void *payload) { - const struct pan_image_view *iview = fb->rts[rt_idx].view; + 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; - pan_cast_and_pack(payload, RENDER_TARGET, cfg) { - pan_prepare_rt_common(fb, rt_idx, cbuf_offset, &cfg); + 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_TILED_U_INTERLEAVED; - cfg.writeback_format = pan_rt_init_format(iview, &cfg); - get_tiled_or_linear_att_mem_props(pan_image_view_get_color_plane(iview), - iview->first_level, layer_or_z_slice, - &cfg.rgb.base, &cfg.rgb.row_stride, - &cfg.rgb.surface_stride); + 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; } } @@ -733,17 +758,26 @@ GENX(pan_emit_linear_color_attachment)(const struct pan_fb_info *fb, unsigned layer_or_z_slice, unsigned cbuf_offset, void *payload) { - const struct pan_image_view *iview = fb->rts[rt_idx].view; + 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; - pan_cast_and_pack(payload, RENDER_TARGET, cfg) { - pan_prepare_rt_common(fb, rt_idx, cbuf_offset, &cfg); + 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_LINEAR; - cfg.writeback_format = pan_rt_init_format(iview, &cfg); - get_tiled_or_linear_att_mem_props(pan_image_view_get_color_plane(iview), - iview->first_level, layer_or_z_slice, - &cfg.rgb.base, &cfg.rgb.row_stride, - &cfg.rgb.surface_stride); + 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; } } @@ -753,21 +787,30 @@ 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) { - const struct pan_image_view *iview = fb->rts[rt_idx].view; + const struct pan_fb_color_attachment *rt = &fb->rts[rt_idx]; + const struct pan_image_view *iview = rt->view; const struct pan_image_plane_ref pref = pan_image_view_get_color_plane(iview); const struct pan_image *image = pref.image; struct pan_afrc_format_info finfo = pan_afrc_get_format_info(image->props.format); + uint64_t base, row_stride, surf_stride; - pan_cast_and_pack(payload, RENDER_TARGET, cfg) { - pan_prepare_rt_common(fb, rt_idx, cbuf_offset, &cfg); + get_tiled_or_linear_att_mem_props(pan_image_view_get_s_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, AFRC_RGB_RENDER_TARGET, cfg) { + rt_common_cfg(rt, cbuf_offset, fb->tile_size, cfg); cfg.writeback_mode = MALI_WRITEBACK_MODE_AFRC_RGB; - cfg.afrc.block_size = pan_afrc_block_size(image->props.modifier, 0); - cfg.afrc.format = pan_afrc_format(finfo, image->props.modifier, 0); - cfg.afrc.writeback_format = pan_rt_init_format(iview, &cfg); - get_tiled_or_linear_att_mem_props( - pref, iview->first_level, layer_or_z_slice, &cfg.rgb.base, - &cfg.rgb.row_stride, &cfg.rgb.surface_stride); + cfg.afrc_block_size = pan_afrc_block_size(image->props.modifier, 0); + cfg.afrc_format = pan_afrc_format(finfo, image->props.modifier, 0); + get_rt_formats(iview->format, &cfg.writeback_format, &cfg.internal_format, + &cfg.swizzle); + cfg.writeback_buffer.base = base; + cfg.writeback_buffer.row_stride = row_stride; + cfg.writeback_buffer.surface_stride = surf_stride; } } #endif @@ -856,8 +899,11 @@ pan_emit_rt(const struct pan_fb_info *fb, unsigned layer_idx, unsigned idx, const struct pan_image_view *rt = fb->rts[idx].view; if (!rt || fb->rts[idx].discard) { - pan_pack(out, RENDER_TARGET, cfg) { - pan_prepare_rt_common(fb, idx, cbuf_offset, &cfg); + pan_cast_and_pack(out, RGB_RENDER_TARGET, cfg) { + cfg.clean_pixel_write_enable = fb->rts[idx].clear; + cfg.internal_buffer_offset = cbuf_offset; + cfg.clear = rt_clear(&fb->rts[idx]); + cfg.dithering_enable = true; cfg.internal_format = MALI_COLOR_BUFFER_INTERNAL_FORMAT_R8G8B8A8; cfg.internal_buffer_offset = cbuf_offset; #if PAN_ARCH >= 7