From 94a7d50433d9a414b3fd1b43ef7493d48ce43fbe Mon Sep 17 00:00:00 2001 From: Marc Alcala Prieto Date: Wed, 6 May 2026 13:53:32 +0200 Subject: [PATCH] pan: Layer offset is not longer available starting on v14 Setting layer_offset would not cause any issues, but it's ignored by the GPU. Therefore, removing it for correctness. Reviewed-by: Boris Brezillon Part-of: --- src/gallium/drivers/panfrost/pan_csf.c | 6 ++++-- src/panfrost/genxml/v14.xml | 1 - src/panfrost/lib/pan_desc.h | 3 +++ src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 10 +++++++--- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_csf.c b/src/gallium/drivers/panfrost/pan_csf.c index 6351ca6a328..a57520812fc 100644 --- a/src/gallium/drivers/panfrost/pan_csf.c +++ b/src/gallium/drivers/panfrost/pan_csf.c @@ -132,9 +132,11 @@ init_fragment_state(const struct pan_fb_info *fb, unsigned layer_idx, * use the extra 56-bits we have in frame_argument to pass other * information to the fragment shader at some point. */ - assert(layer_idx >= tiler_ctx->valhall.layer_offset); fbd_data.frame_argument = layer_idx; + /* Layer offset is unused on v14+. */ + assert(tiler_ctx->valhall.layer_offset == 0); + pan_pack(&fbd_data.flags0, FRAGMENT_FLAGS_0, cfg) { cfg.pre_frame_0 = pan_fix_frame_shader_mode(fb->bifrost.pre_post.modes[0], @@ -159,7 +161,7 @@ init_fragment_state(const struct pan_fb_info *fb, unsigned layer_idx, cfg.hsr_prepass_filter_enable = true; cfg.hsr_hierarchical_optimizations_enable = true; - cfg.internal_layer_index = layer_idx - tiler_ctx->valhall.layer_offset; + cfg.internal_layer_index = layer_idx; } fbd_data.dcd_pointer = fb->bifrost.pre_post.dcds.gpu; diff --git a/src/panfrost/genxml/v14.xml b/src/panfrost/genxml/v14.xml index e41657089ae..df26afba057 100644 --- a/src/panfrost/genxml/v14.xml +++ b/src/panfrost/genxml/v14.xml @@ -2618,7 +2618,6 @@ - diff --git a/src/panfrost/lib/pan_desc.h b/src/panfrost/lib/pan_desc.h index a9a837502f2..053508639ec 100644 --- a/src/panfrost/lib/pan_desc.h +++ b/src/panfrost/lib/pan_desc.h @@ -65,6 +65,9 @@ struct pan_tiler_context { /* A tiler descriptor can only handle a limited amount of layers. * If the number of layers is bigger than this, several tiler * descriptors will be issued, each with a different layer_offset. + * + * Note: on v14+, only up to one tiler descriptor is supported and + * layer_offset is deprecated. */ uint8_t layer_offset; } valhall; diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index f6e3f782d6f..a6948b4d880 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1063,7 +1063,10 @@ get_tiler_desc(struct panvk_cmd_buffer *cmdbuf) /* This will be overloaded. */ cfg.layer_count = 1; + +#if PAN_ARCH < 14 cfg.layer_offset = 0; +#endif } /* When simul_use=true, the tiler descriptors are allocated from the @@ -1257,9 +1260,11 @@ init_layer_fragment_state(const struct pan_fb_desc_info *info, * have in frame_argument to pass other information to the fragment * shader at some point. */ - assert(info->layer >= info->tiler_ctx->valhall.layer_offset); fbd_data.frame_argument = info->layer; + /* Layer offset is unused on v14+. */ + assert(info->tiler_ctx->valhall.layer_offset == 0); + pan_pack(&fbd_data.flags0, FRAGMENT_FLAGS_0, cfg) { cfg.pre_frame_0 = pan_fix_frame_shader_mode(info->frame_shaders.modes[0], ct.rts || ct.zs || ct.s); @@ -1276,8 +1281,7 @@ init_layer_fragment_state(const struct pan_fb_desc_info *info, cfg.hsr_prepass_filter_enable = true; cfg.hsr_hierarchical_optimizations_enable = true; - cfg.internal_layer_index = - info->layer - info->tiler_ctx->valhall.layer_offset; + cfg.internal_layer_index = info->layer; } pan_pack(&fbd_data.flags2, FRAGMENT_FLAGS_2, cfg) {