From 11fcb23f74c0b01942fa3d2e4bdd0a524bea444f Mon Sep 17 00:00:00 2001 From: Boris Brezillon Date: Mon, 9 Sep 2024 12:15:35 +0200 Subject: [PATCH] pan/desc: Add a struct for valhall/bifrost to the union in pan_tiler_context Valhall has extra tiler parameters for multilayer rendering that we will need for the framebuffer descriptor emission. Let's add proper struct for Valhall and Bifrost instead of assuming a mali_ptr is all we'll ever need. Signed-off-by: Boris Brezillon Reviewed-by: Rebecca Mckeever Reviewed-by: Mary Guillemard Reviewed-by: Lars-Ivar Hesselberg Simonsen Reviewed-by: John Anthony Acked-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/panfrost/pan_csf.c | 12 ++++++------ src/gallium/drivers/panfrost/pan_jm.c | 14 ++++++++++---- src/panfrost/lib/pan_desc.c | 3 ++- src/panfrost/lib/pan_desc.h | 7 ++++++- src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c | 15 ++++++++++++--- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 6 ++++-- 6 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_csf.c b/src/gallium/drivers/panfrost/pan_csf.c index 1d64e57e705..7e4bff9e594 100644 --- a/src/gallium/drivers/panfrost/pan_csf.c +++ b/src/gallium/drivers/panfrost/pan_csf.c @@ -494,8 +494,8 @@ GENX(csf_emit_fragment_job)(struct panfrost_batch *batch, * chunks is in the tiler context descriptor * (completed_{top,bottom fields}). */ if (batch->draw_count > 0) { - assert(batch->tiler_ctx.bifrost); - cs_move64_to(b, cs_reg64(b, 90), batch->tiler_ctx.bifrost); + assert(batch->tiler_ctx.valhall.desc); + cs_move64_to(b, cs_reg64(b, 90), batch->tiler_ctx.valhall.desc); cs_load_to(b, cs_reg_tuple(b, 86, 4), cs_reg64(b, 90), BITFIELD_MASK(4), 40); cs_wait_slot(b, 0, false); @@ -683,8 +683,8 @@ csf_get_tiler_desc(struct panfrost_batch *batch) struct panfrost_context *ctx = batch->ctx; struct panfrost_device *dev = pan_device(ctx->base.screen); - if (batch->tiler_ctx.bifrost) - return batch->tiler_ctx.bifrost; + if (batch->tiler_ctx.valhall.desc) + return batch->tiler_ctx.valhall.desc; struct panfrost_ptr t = pan_pool_alloc_desc(&batch->pool.base, TILER_CONTEXT); @@ -714,8 +714,8 @@ csf_get_tiler_desc(struct panfrost_batch *batch) tiler.geometry_buffer_size = ctx->csf.tmp_geom_bo->kmod_bo->size; } - batch->tiler_ctx.bifrost = t.gpu; - return batch->tiler_ctx.bifrost; + batch->tiler_ctx.valhall.desc = t.gpu; + return batch->tiler_ctx.valhall.desc; } static uint32_t diff --git a/src/gallium/drivers/panfrost/pan_jm.c b/src/gallium/drivers/panfrost/pan_jm.c index 637213012a1..2b6fad71932 100644 --- a/src/gallium/drivers/panfrost/pan_jm.c +++ b/src/gallium/drivers/panfrost/pan_jm.c @@ -387,9 +387,11 @@ static mali_ptr jm_emit_tiler_desc(struct panfrost_batch *batch) { struct panfrost_device *dev = pan_device(batch->ctx->base.screen); + mali_ptr tiler_desc = PAN_ARCH >= 9 ? batch->tiler_ctx.bifrost.desc + : batch->tiler_ctx.valhall.desc; - if (batch->tiler_ctx.bifrost) - return batch->tiler_ctx.bifrost; + if (tiler_desc) + return tiler_desc; struct panfrost_ptr t = pan_pool_alloc_desc(&batch->pool.base, TILER_HEAP); @@ -428,8 +430,12 @@ jm_emit_tiler_desc(struct panfrost_batch *batch) #endif } - batch->tiler_ctx.bifrost = t.gpu; - return batch->tiler_ctx.bifrost; + if (PAN_ARCH >= 9) + batch->tiler_ctx.valhall.desc = t.gpu; + else + batch->tiler_ctx.bifrost.desc = t.gpu; + + return t.gpu; } #endif diff --git a/src/panfrost/lib/pan_desc.c b/src/panfrost/lib/pan_desc.c index d426c5817bc..a02abebaa0f 100644 --- a/src/panfrost/lib/pan_desc.c +++ b/src/panfrost/lib/pan_desc.c @@ -751,7 +751,8 @@ GENX(pan_emit_fbd)(const struct pan_fb_info *fb, unsigned layer_idx, cfg.post_frame = pan_fix_frame_shader_mode(fb->bifrost.pre_post.modes[2], force_clean_write); cfg.frame_shader_dcds = fb->bifrost.pre_post.dcds.gpu; - cfg.tiler = tiler_ctx->bifrost; + cfg.tiler = + PAN_ARCH >= 9 ? tiler_ctx->valhall.desc : tiler_ctx->bifrost.desc; #endif cfg.width = fb->width; cfg.height = fb->height; diff --git a/src/panfrost/lib/pan_desc.h b/src/panfrost/lib/pan_desc.h index f6908e9b073..275c52a203f 100644 --- a/src/panfrost/lib/pan_desc.h +++ b/src/panfrost/lib/pan_desc.h @@ -76,7 +76,12 @@ struct pan_tiler_context { uint32_t vertex_count; union { - mali_ptr bifrost; + struct { + mali_ptr desc; + } valhall; + struct { + mali_ptr desc; + } bifrost; struct { bool disable; bool no_hierarchical_tiling; diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c index caf37d6d52c..3b447bf1ab7 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_buffer.c @@ -213,9 +213,13 @@ panvk_per_arch(cmd_prepare_tiler_context)(struct panvk_cmd_buffer *cmdbuf, { struct panvk_device *dev = to_panvk_device(cmdbuf->vk.base.device); struct panvk_batch *batch = cmdbuf->cur_batch; + mali_ptr tiler_desc; - if (batch->tiler.ctx_descs.cpu) + if (batch->tiler.ctx_descs.gpu) { + tiler_desc = + batch->tiler.ctx_descs.gpu + (pan_size(TILER_CONTEXT) * layer_idx); goto out_set_layer_ctx; + } const struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; uint32_t layer_count = cmdbuf->state.gfx.render.layer_count; @@ -225,6 +229,9 @@ panvk_per_arch(cmd_prepare_tiler_context)(struct panvk_cmd_buffer *cmdbuf, batch->tiler.ctx_descs = pan_pool_alloc_desc_array( &cmdbuf->desc_pool.base, layer_count, TILER_CONTEXT); + tiler_desc = + batch->tiler.ctx_descs.gpu + (pan_size(TILER_CONTEXT) * layer_idx); + pan_pack(&batch->tiler.heap_templ, TILER_HEAP, cfg) { cfg.size = pan_kmod_bo_size(dev->tiler_heap->bo); cfg.base = dev->tiler_heap->addr.dev; @@ -254,8 +261,10 @@ panvk_per_arch(cmd_prepare_tiler_context)(struct panvk_cmd_buffer *cmdbuf, } out_set_layer_ctx: - batch->tiler.ctx.bifrost = - batch->tiler.ctx_descs.gpu + (pan_size(TILER_CONTEXT) * layer_idx); + if (PAN_ARCH >= 9) + batch->tiler.ctx.valhall.desc = tiler_desc; + else + batch->tiler.ctx.bifrost.desc = tiler_desc; } struct panvk_batch * diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index de271faf3f9..daf1bb181a4 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -1038,7 +1038,8 @@ panvk_draw_prepare_tiler_job(struct panvk_cmd_buffer *cmdbuf, pan_section_ptr(ptr.cpu, TILER_JOB, DRAW)); pan_section_pack(ptr.cpu, TILER_JOB, TILER, cfg) { - cfg.address = draw->tiler_ctx->bifrost; + cfg.address = PAN_ARCH >= 9 ? draw->tiler_ctx->valhall.desc + : draw->tiler_ctx->bifrost.desc; } pan_section_pack(ptr.cpu, TILER_JOB, PADDING, padding) @@ -1067,7 +1068,8 @@ panvk_draw_prepare_idvs_job(struct panvk_cmd_buffer *cmdbuf, pan_section_ptr(ptr.cpu, INDEXED_VERTEX_JOB, PRIMITIVE_SIZE)); pan_section_pack(ptr.cpu, INDEXED_VERTEX_JOB, TILER, cfg) { - cfg.address = draw->tiler_ctx->bifrost; + cfg.address = PAN_ARCH >= 9 ? draw->tiler_ctx->valhall.desc + : draw->tiler_ctx->bifrost.desc; } pan_section_pack(ptr.cpu, INDEXED_VERTEX_JOB, PADDING, _) {