static void
nvk_populate_fs_key(struct nvk_fs_key *key,
- const struct vk_multisample_state *ms)
+ const struct vk_multisample_state *ms,
+ const struct vk_render_pass_state *rp)
{
memset(key, 0, sizeof(*key));
+
+ if (rp->pipeline_flags &
+ VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT)
+ key->zs_self_dep = true;
+
if (ms == NULL || ms->rasterization_samples <= 1)
return;
struct nvk_fs_key fs_key_tmp, *fs_key = NULL;
if (stage == MESA_SHADER_FRAGMENT) {
- nvk_populate_fs_key(&fs_key_tmp, state.ms);
+ nvk_populate_fs_key(&fs_key_tmp, state.ms, state.rp);
fs_key = &fs_key_tmp;
}
static int
-nvk_fs_gen_header(struct nvk_shader *fs, struct nv50_ir_prog_info_out *info)
+nvk_fs_gen_header(struct nvk_shader *fs, const struct nvk_fs_key *key,
+ struct nv50_ir_prog_info_out *info)
{
unsigned i, c, a, m;
fs->hdr[0] = 0x20062 | (5 << 10);
fs->hdr[5] = 0x80000000; /* getting a trap if FRAG_COORD_UMASK.w = 0 */
- if (info->prop.fp.usesDiscard)
+ if (info->prop.fp.usesDiscard || key->zs_self_dep)
fs->hdr[0] |= 0x8000;
if (!info->prop.fp.separateFragData)
fs->hdr[0] |= 0x4000;
ret = nvk_vs_gen_header(shader, &info_out);
break;
case PIPE_SHADER_FRAGMENT:
- ret = nvk_fs_gen_header(shader, &info_out);
+ ret = nvk_fs_gen_header(shader, fs_key, &info_out);
shader->fs.uses_sample_shading = nir->info.fs.uses_sample_shading;
break;
case PIPE_SHADER_GEOMETRY: