diff --git a/src/gallium/drivers/panfrost/pan_csf.c b/src/gallium/drivers/panfrost/pan_csf.c index 6846d3aba2a..380619ee5d9 100644 --- a/src/gallium/drivers/panfrost/pan_csf.c +++ b/src/gallium/drivers/panfrost/pan_csf.c @@ -690,9 +690,13 @@ csf_emit_tiler_desc(struct panfrost_batch *batch, const struct pan_fb_info *fb) batch->key.height, dev->tiler_features.max_levels); - /* For effective tile size larger than 16x16, disable first level */ - if (fb->tile_size > 16 * 16) - tiler.hierarchy_mask &= ~1; + /* Disable hierarchies falling under the effective tile size. */ + uint32_t disable_hierarchies; + for (disable_hierarchies = 0; + fb->tile_size > (16 * 16) << (disable_hierarchies * 2); + disable_hierarchies++) + ; + tiler.hierarchy_mask &= ~BITFIELD_MASK(disable_hierarchies); tiler.fb_width = batch->key.width; tiler.fb_height = batch->key.height; diff --git a/src/panfrost/vulkan/panvk_cmd_draw.h b/src/panfrost/vulkan/panvk_cmd_draw.h index 4f2ec63279d..428f2a0630c 100644 --- a/src/panfrost/vulkan/panvk_cmd_draw.h +++ b/src/panfrost/vulkan/panvk_cmd_draw.h @@ -210,9 +210,13 @@ panvk_select_tiler_hierarchy_mask(const struct panvk_physical_device *phys_dev, state->render.fb.info.height, tiler_features.max_levels); - /* For effective tile size larger than 16x16, disable first level */ - if (state->render.fb.info.tile_size > 16 * 16) - hierarchy_mask &= ~1; + /* Disable hierarchies falling under the effective tile size. */ + uint32_t disable_hierarchies; + for (disable_hierarchies = 0; state->render.fb.info.tile_size > + (16 * 16) << (disable_hierarchies * 2); + disable_hierarchies++) + ; + hierarchy_mask &= ~BITFIELD_MASK(disable_hierarchies); return hierarchy_mask; }