diff --git a/src/freedreno/vulkan/tu_cmd_buffer.cc b/src/freedreno/vulkan/tu_cmd_buffer.cc index d324799d72c..9f274d58a29 100644 --- a/src/freedreno/vulkan/tu_cmd_buffer.cc +++ b/src/freedreno/vulkan/tu_cmd_buffer.cc @@ -6209,6 +6209,10 @@ tu6_build_depth_plane_z_mode(struct tu_cmd_buffer *cmd, struct tu_cs *cs) (cmd->state.pipeline_feedback_loops & VK_IMAGE_ASPECT_DEPTH_BIT) || (cmd->vk.dynamic_graphics_state.feedback_loops & VK_IMAGE_ASPECT_DEPTH_BIT) || + /* EARLY_Z causes D/S to be written before FS but gl_SampleMask can + * kill fragments, we cannot have EARLY_Z + gl_SampleMask + D/S writes. + */ + fs->variant->writes_smask || tu_fs_reads_dynamic_ds_input_attachment(cmd, fs)) && (depth_write || stencil_write)) { zmode = (cmd->state.lrz.valid && cmd->state.lrz.enabled) diff --git a/src/freedreno/vulkan/tu_shader.cc b/src/freedreno/vulkan/tu_shader.cc index 25a9db3e46c..0d521f6876e 100644 --- a/src/freedreno/vulkan/tu_shader.cc +++ b/src/freedreno/vulkan/tu_shader.cc @@ -2747,7 +2747,7 @@ tu_shader_create(struct tu_device *dev, if (key->fragment_density_map) shader->fs.lrz.status = TU_LRZ_FORCE_DISABLE_LRZ; if (!fs->fs.early_fragment_tests && - (fs->no_earlyz || fs->writes_stencilref || fs->writes_smask)) { + (fs->no_earlyz || fs->writes_stencilref)) { shader->fs.lrz.force_late_z = true; } break;