[Mesa-dev] [PATCH] radv: handle exporting view index to fragment shader.
Samuel Pitoiset
samuel.pitoiset at gmail.com
Fri Mar 16 07:44:18 UTC 2018
On 03/16/2018 06:58 AM, Dave Airlie wrote:
> From: Dave Airlie <airlied at redhat.com>
>
> The fragment shader was trying to read this, but nothing
> was exporting it from the vertex shader. This handles
> it like the prim id export.
>
> Fixes:
> dEQP-VK.multiview.secondary_cmd_buffer.*
> dEQP-VK.multiview.index.fragment_shader.*
>
> Signed-off-by: Dave Airlie <airlied at redhat.com>
> ---
> src/amd/vulkan/radv_nir_to_llvm.c | 18 ++++++++++++++++--
> src/amd/vulkan/radv_pipeline.c | 4 ++++
> src/amd/vulkan/radv_shader.h | 2 ++
> src/amd/vulkan/radv_shader_info.c | 2 ++
> 4 files changed, 24 insertions(+), 2 deletions(-)
>
> diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c
> index cedcd38b3a2..e2e64463fae 100644
> --- a/src/amd/vulkan/radv_nir_to_llvm.c
> +++ b/src/amd/vulkan/radv_nir_to_llvm.c
> @@ -2183,7 +2183,7 @@ radv_load_output(struct radv_shader_context *ctx, unsigned index, unsigned chan)
>
> static void
> handle_vs_outputs_post(struct radv_shader_context *ctx,
> - bool export_prim_id,
> + bool export_prim_id, bool export_layer_id,
> struct radv_vs_output_info *outinfo)
> {
> uint32_t param_count = 0;
> @@ -2363,6 +2363,18 @@ handle_vs_outputs_post(struct radv_shader_context *ctx,
> outinfo->export_prim_id = true;
> }
>
> + if (export_layer_id) {
> + LLVMValueRef values[4];
> +
> + values[0] = layer_value;
> + for (unsigned j = 1; j < 4; j++)
> + values[j] = ctx->ac.f32_0;
> +
> + radv_export_param(ctx, param_count, values, 0xf);
I think it should work if you only enable the first channel (ie. 0x1),
can you try?
Otherwise than that, patch is:
Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
> +
> + outinfo->vs_output_param_offset[VARYING_SLOT_LAYER] = param_count++;
> + }
> +
> outinfo->pos_exports = num_pos_exports;
> outinfo->param_exports = param_count;
> }
> @@ -2825,6 +2837,7 @@ handle_shader_outputs_post(struct ac_shader_abi *abi, unsigned max_outputs,
> handle_es_outputs_post(ctx, &ctx->shader_info->vs.es_info);
> else
> handle_vs_outputs_post(ctx, ctx->options->key.vs.export_prim_id,
> + ctx->options->key.vs.export_layer_id,
> &ctx->shader_info->vs.outinfo);
> break;
> case MESA_SHADER_FRAGMENT:
> @@ -2841,6 +2854,7 @@ handle_shader_outputs_post(struct ac_shader_abi *abi, unsigned max_outputs,
> handle_es_outputs_post(ctx, &ctx->shader_info->tes.es_info);
> else
> handle_vs_outputs_post(ctx, ctx->options->key.tes.export_prim_id,
> + ctx->options->key.tes.export_layer_id,
> &ctx->shader_info->tes.outinfo);
> break;
> default:
> @@ -3439,7 +3453,7 @@ ac_gs_copy_shader_emit(struct radv_shader_context *ctx)
> }
> idx += slot_inc;
> }
> - handle_vs_outputs_post(ctx, false, &ctx->shader_info->vs.outinfo);
> + handle_vs_outputs_post(ctx, false, false, &ctx->shader_info->vs.outinfo);
> }
>
> void
> diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
> index 52a6d23718e..89c5e699414 100644
> --- a/src/amd/vulkan/radv_pipeline.c
> +++ b/src/amd/vulkan/radv_pipeline.c
> @@ -1718,8 +1718,12 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
> /* TODO: These are no longer used as keys we should refactor this */
> keys[MESA_SHADER_VERTEX].vs.export_prim_id =
> pipeline->shaders[MESA_SHADER_FRAGMENT]->info.info.ps.prim_id_input;
> + keys[MESA_SHADER_VERTEX].vs.export_layer_id =
> + pipeline->shaders[MESA_SHADER_FRAGMENT]->info.info.ps.layer_input;
> keys[MESA_SHADER_TESS_EVAL].tes.export_prim_id =
> pipeline->shaders[MESA_SHADER_FRAGMENT]->info.info.ps.prim_id_input;
> + keys[MESA_SHADER_TESS_EVAL].tes.export_layer_id =
> + pipeline->shaders[MESA_SHADER_FRAGMENT]->info.info.ps.layer_input;
> }
>
> if (device->physical_device->rad_info.chip_class >= GFX9 && modules[MESA_SHADER_TESS_CTRL]) {
> diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h
> index 40e92b52f38..ae30d6125b1 100644
> --- a/src/amd/vulkan/radv_shader.h
> +++ b/src/amd/vulkan/radv_shader.h
> @@ -58,11 +58,13 @@ struct radv_vs_variant_key {
> uint32_t as_es:1;
> uint32_t as_ls:1;
> uint32_t export_prim_id:1;
> + uint32_t export_layer_id:1;
> };
>
> struct radv_tes_variant_key {
> uint32_t as_es:1;
> uint32_t export_prim_id:1;
> + uint32_t export_layer_id:1;
> uint8_t num_patches;
> uint8_t tcs_num_outputs;
> };
> diff --git a/src/amd/vulkan/radv_shader_info.c b/src/amd/vulkan/radv_shader_info.c
> index ded3281516d..7208bd2f587 100644
> --- a/src/amd/vulkan/radv_shader_info.c
> +++ b/src/amd/vulkan/radv_shader_info.c
> @@ -90,6 +90,8 @@ gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
> break;
> case nir_intrinsic_load_view_index:
> info->needs_multiview_view_index = true;
> + if (nir->info.stage == MESA_SHADER_FRAGMENT)
> + info->ps.layer_input = true;
> break;
> case nir_intrinsic_load_invocation_id:
> info->uses_invocation_id = true;
>
More information about the mesa-dev
mailing list