From 78df8e5e38e25ccfdf74bed4635d3ace3bdf8d13 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Thu, 17 Sep 2020 14:41:27 +0100 Subject: [PATCH] radv,aco: fix reading primitive ID in FS after TES Signed-off-by: Rhys Perry Reviewed-by: Samuel Pitoiset Cc: mesa-stable Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/3530 Part-of: (cherry picked from commit 2228835fb55225c68f059f86bdd64f81bcb92c74) --- .pick_status.json | 2 +- src/amd/compiler/aco_instruction_selection.cpp | 5 ++++- src/amd/vulkan/radv_nir_to_llvm.c | 8 ++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index c58461b6578..ef59731ed79 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -868,7 +868,7 @@ "description": "radv,aco: fix reading primitive ID in FS after TES", "nominated": true, "nomination_type": 0, - "resolution": 0, + "resolution": 1, "master_sha": null, "because_sha": null }, diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 717abd67918..72fb92f1f06 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -9753,7 +9753,10 @@ static void create_vs_exports(isel_context *ctx) if (outinfo->export_prim_id && !(ctx->stage & hw_ngg_gs)) { ctx->outputs.mask[VARYING_SLOT_PRIMITIVE_ID] |= 0x1; - ctx->outputs.temps[VARYING_SLOT_PRIMITIVE_ID * 4u] = get_arg(ctx, ctx->args->vs_prim_id); + if (ctx->stage & sw_tes) + ctx->outputs.temps[VARYING_SLOT_PRIMITIVE_ID * 4u] = get_arg(ctx, ctx->args->ac.tes_patch_id); + else + ctx->outputs.temps[VARYING_SLOT_PRIMITIVE_ID * 4u] = get_arg(ctx, ctx->args->vs_prim_id); } if (ctx->options->key.has_multiview_view_index) { diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c index 51416262df1..52d2b36fb0e 100644 --- a/src/amd/vulkan/radv_nir_to_llvm.c +++ b/src/amd/vulkan/radv_nir_to_llvm.c @@ -1987,8 +1987,12 @@ handle_vs_outputs_post(struct radv_shader_context *ctx, outputs[noutput].slot_name = VARYING_SLOT_PRIMITIVE_ID; outputs[noutput].slot_index = 0; outputs[noutput].usage_mask = 0x1; - outputs[noutput].values[0] = - ac_get_arg(&ctx->ac, ctx->args->vs_prim_id); + if (ctx->stage == MESA_SHADER_TESS_EVAL) + outputs[noutput].values[0] = + ac_get_arg(&ctx->ac, ctx->args->ac.tes_patch_id); + else + outputs[noutput].values[0] = + ac_get_arg(&ctx->ac, ctx->args->vs_prim_id); for (unsigned j = 1; j < 4; j++) outputs[noutput].values[j] = ctx->ac.f32_0; noutput++;