diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index e52eb131b09..1db4b5ddff0 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1359,7 +1359,11 @@ prepare_ds(struct panvk_cmd_buffer *cmdbuf, struct pan_earlyzs_state earlyzs) cfg.depth_clamp_mode = MALI_DEPTH_CLAMP_MODE_BOUNDS; if (fs) { +#if PAN_ARCH == 10 cfg.shader_read_only_z_s = earlyzs.shader_readonly_zs; +#elif PAN_ARCH == 11 + cfg.separated_dependency_tracking = true; +#endif cfg.depth_source = pan_depth_source(&fs->info); } @@ -1539,7 +1543,8 @@ prepare_dcd(struct panvk_cmd_buffer *cmdbuf, enum pan_earlyzs_zs_tilebuf_read zs_read = PAN_EARLYZS_ZS_TILEBUF_NOT_READ; - if (zs_attachment_read(fs, &dyns->ial)) { + if (z_attachment_read(fs, &dyns->ial) || + s_attachment_read(fs, &dyns->ial)) { if (writes_z || writes_s || PAN_ARCH != 10) zs_read = PAN_EARLYZS_ZS_TILEBUF_READ_NO_OPT; else @@ -1614,6 +1619,12 @@ prepare_dcd(struct panvk_cmd_buffer *cmdbuf, pan_pack(&dcd2, DCD_FLAGS_2, cfg) { cfg.read_mask = rt_read; cfg.write_mask = rt_written; +#if PAN_ARCH >= 11 + if (fs) { + cfg.no_shader_depth_read = z_attachment_read(fs, &dyns->ial); + cfg.no_shader_stencil_read = s_attachment_read(fs, &dyns->ial); + } +#endif } cs_update_vt_ctx(b) diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index 7bf35fa1895..63a6e28dc96 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -288,7 +288,8 @@ panvk_draw_prepare_fs_rsd(struct panvk_cmd_buffer *cmdbuf, fs, &cmdbuf->vk.dynamic_graphics_state.cal); uint8_t rt_read = color_attachment_read_mask(fs, &dyns->ial, rt_mask); enum pan_earlyzs_zs_tilebuf_read zs_read = - zs_attachment_read(fs, &dyns->ial) + (z_attachment_read(fs, &dyns->ial) || + s_attachment_read(fs, &dyns->ial)) ? PAN_EARLYZS_ZS_TILEBUF_READ_NO_OPT : PAN_EARLYZS_ZS_TILEBUF_NOT_READ; diff --git a/src/panfrost/vulkan/panvk_cmd_draw.h b/src/panfrost/vulkan/panvk_cmd_draw.h index 428f2a0630c..c8d30a206b2 100644 --- a/src/panfrost/vulkan/panvk_cmd_draw.h +++ b/src/panfrost/vulkan/panvk_cmd_draw.h @@ -407,21 +407,28 @@ color_attachment_read_mask(const struct panvk_shader *fs, } static inline bool -zs_attachment_read(const struct panvk_shader *fs, - const struct vk_input_attachment_location_state *ial) +z_attachment_read(const struct panvk_shader *fs, + const struct vk_input_attachment_location_state *ial) { uint32_t depth_mask = ial->depth_att == MESA_VK_ATTACHMENT_NO_INDEX ? BITFIELD_BIT(0) : ial->depth_att != MESA_VK_ATTACHMENT_UNUSED ? BITFIELD_BIT(ial->depth_att + 1) : 0; + return depth_mask & fs->fs.input_attachment_read; +} + +static inline bool +s_attachment_read(const struct panvk_shader *fs, + const struct vk_input_attachment_location_state *ial) +{ uint32_t stencil_mask = ial->stencil_att == MESA_VK_ATTACHMENT_NO_INDEX ? BITFIELD_BIT(0) : ial->stencil_att != MESA_VK_ATTACHMENT_UNUSED ? BITFIELD_BIT(ial->stencil_att + 1) : 0; - return (depth_mask | stencil_mask) & fs->fs.input_attachment_read; + return stencil_mask & fs->fs.input_attachment_read; } #endif