diff options
author | Samuel Pitoiset <[email protected]> | 2020-04-22 22:21:55 +0200 |
---|---|---|
committer | Dylan Baker <[email protected]> | 2020-04-23 09:27:42 -0700 |
commit | a2f0ee966445ef902280be682526791972420c57 (patch) | |
tree | f2184773273b0d3eff8bddd2307c5a14d1d42855 | |
parent | 3a8c5e2bc1bf9eecbd979bd1eb9518973c8ea533 (diff) |
radv: make sure to export the viewport index if FS needs it
If FS reads gl_ViewportIndex but VS doesn't export it, it should
be zero to avoid reading garbage.
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2818
Fixes: b424d49ac05 ("radv/llvm: fix exporting the viewport index if the fragment shader needs it")
Signed-off-by: Samuel Pitoiset <[email protected]>
Reviewed-by: Bas Nieuwenhuizen <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4687>
(cherry picked from commit 7086b38c81ebe2f0520461c1bc1a7b92863cf871)
-rw-r--r-- | .pick_status.json | 2 | ||||
-rw-r--r-- | src/amd/vulkan/radv_pipeline.c | 13 | ||||
-rw-r--r-- | src/amd/vulkan/radv_shader.h | 2 | ||||
-rw-r--r-- | src/amd/vulkan/radv_shader_info.c | 20 |
4 files changed, 36 insertions, 1 deletions
diff --git a/.pick_status.json b/.pick_status.json index 2050657e3ba..132f6a8d1e2 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -148,7 +148,7 @@ "description": "radv: make sure to export the viewport index if FS needs it", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": "b424d49ac05563fd7d9f217fae9c25fc602f4330" }, diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c index bcf39f910c6..7aa5f27b253 100644 --- a/src/amd/vulkan/radv_pipeline.c +++ b/src/amd/vulkan/radv_pipeline.c @@ -2543,12 +2543,16 @@ radv_fill_shader_info(struct radv_pipeline *pipeline, infos[MESA_SHADER_FRAGMENT].ps.layer_input; keys[MESA_SHADER_VERTEX].vs_common_out.export_clip_dists = !!infos[MESA_SHADER_FRAGMENT].ps.num_input_clips_culls; + keys[MESA_SHADER_VERTEX].vs_common_out.export_viewport_index = + infos[MESA_SHADER_FRAGMENT].ps.viewport_index_input; keys[MESA_SHADER_TESS_EVAL].vs_common_out.export_prim_id = infos[MESA_SHADER_FRAGMENT].ps.prim_id_input; keys[MESA_SHADER_TESS_EVAL].vs_common_out.export_layer_id = infos[MESA_SHADER_FRAGMENT].ps.layer_input; keys[MESA_SHADER_TESS_EVAL].vs_common_out.export_clip_dists = !!infos[MESA_SHADER_FRAGMENT].ps.num_input_clips_culls; + keys[MESA_SHADER_TESS_EVAL].vs_common_out.export_viewport_index = + infos[MESA_SHADER_FRAGMENT].ps.viewport_index_input; /* NGG passthrough mode can't be enabled for vertex shaders * that export the primitive ID. @@ -4325,6 +4329,15 @@ radv_pipeline_generate_ps_inputs(struct radeon_cmdbuf *ctx_cs, ++ps_offset; } + if (ps->info.ps.viewport_index_input) { + unsigned vs_offset = outinfo->vs_output_param_offset[VARYING_SLOT_VIEWPORT]; + if (vs_offset != AC_EXP_PARAM_UNDEFINED) + ps_input_cntl[ps_offset] = offset_to_ps_input(vs_offset, true, false, false); + else + ps_input_cntl[ps_offset] = offset_to_ps_input(AC_EXP_PARAM_DEFAULT_VAL_0000, true, false, false); + ++ps_offset; + } + if (ps->info.ps.has_pcoord) { unsigned val; val = S_028644_PT_SPRITE_TEX(1) | S_028644_OFFSET(0x20); diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index 4602bbfe4e8..389a1cd9252 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -59,6 +59,7 @@ struct radv_vs_out_key { uint32_t export_prim_id:1; uint32_t export_layer_id:1; uint32_t export_clip_dists:1; + uint32_t export_viewport_index:1; }; struct radv_vs_variant_key { @@ -293,6 +294,7 @@ struct radv_shader_info { bool has_pcoord; bool prim_id_input; bool layer_input; + bool viewport_index_input; uint8_t num_input_clips_culls; uint32_t input_mask; uint32_t flat_shaded_mask; diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c index 80f93b1c0a7..dfccba5600c 100644 --- a/src/amd/vulkan/radv_shader_info.c +++ b/src/amd/vulkan/radv_shader_info.c @@ -458,6 +458,9 @@ gather_info_input_decl_ps(const nir_shader *nir, const nir_variable *var, case VARYING_SLOT_CLIP_DIST1: info->ps.num_input_clips_culls += attrib_count; break; + case VARYING_SLOT_VIEWPORT: + info->ps.viewport_index_input = true; + break; default: break; } @@ -730,6 +733,23 @@ radv_nir_shader_info_pass(const struct nir_shader *nir, } } + /* Make sure to export the ViewportIndex if the fragment shader needs it. */ + if (key->vs_common_out.export_viewport_index) { + switch (nir->info.stage) { + case MESA_SHADER_VERTEX: + info->vs.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1; + break; + case MESA_SHADER_TESS_EVAL: + info->tes.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1; + break; + case MESA_SHADER_GEOMETRY: + info->gs.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1; + break; + default: + break; + } + } + if (nir->info.stage == MESA_SHADER_FRAGMENT) info->ps.num_interp = nir->num_inputs; |