Mesa (master): ac/nir: Add merged GS function.

Dave Airlie airlied at kemper.freedesktop.org
Fri Oct 20 05:25:19 UTC 2017


Module: Mesa
Branch: master
Commit: 3e7733303041b6ea18fcb3493796fd5703b38411
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3e7733303041b6ea18fcb3493796fd5703b38411

Author: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Date:   Fri Oct 20 01:06:50 2017 +0200

ac/nir: Add merged GS function.

[airlied: merged fixup + and fixed up a couple more bits].

Reviewed-by: Dave Airlie <airlied at redhat.com>

---

 src/amd/common/ac_nir_to_llvm.c | 80 ++++++++++++++++++++++++++++++++---------
 1 file changed, 63 insertions(+), 17 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 0e1c65ae81..de9510c9a4 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -838,22 +838,61 @@ static void create_function(struct nir_to_llvm_context *ctx,
 		add_vgpr_argument(&args, ctx->i32, &ctx->tes_patch_id); // tes patch id
 		break;
 	case MESA_SHADER_GEOMETRY:
-		radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
-		radv_define_vs_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &args);
-		add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_ring_stride); // gsvs stride
-		add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_num_entries); // gsvs num entires
-		if (ctx->shader_info->info.needs_multiview_view_index)
-			add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
-		add_sgpr_argument(&args, ctx->i32, &ctx->gs2vs_offset); // gs2vs offset
-	        add_sgpr_argument(&args, ctx->i32, &ctx->gs_wave_id); // wave id
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[0]); // vtx0
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[1]); // vtx1
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_prim_id); // prim id
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[2]);
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[3]);
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[4]);
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[5]);
-		add_vgpr_argument(&args, ctx->i32, &ctx->gs_invocation_id);
+		if (has_previous_stage) {
+			// First 6 system regs
+			add_sgpr_argument(&args, ctx->i32, &ctx->gs2vs_offset); // tess factor offset
+			add_sgpr_argument(&args, ctx->i32, &ctx->merged_wave_info); // merged wave info
+			add_sgpr_argument(&args, ctx->i32, &ctx->oc_lds); // param oc lds
+
+			add_sgpr_argument(&args, ctx->i32, NULL); // scratch offset
+			add_sgpr_argument(&args, ctx->i32, NULL); // unknown
+			add_sgpr_argument(&args, ctx->i32, NULL); // unknown
+
+			radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
+			if (previous_stage == MESA_SHADER_TESS_EVAL)
+				add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_offchip_layout); // tcs offchip layout
+			else
+				radv_define_vs_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &args);
+			add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_ring_stride); // gsvs stride
+			add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_num_entries); // gsvs num entires
+			if (ctx->shader_info->info.needs_multiview_view_index)
+				add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
+
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[0]); // vtx01
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[2]); // vtx23
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_prim_id); // prim id
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_invocation_id);
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[4]);
+
+			if (previous_stage == MESA_SHADER_VERTEX) {
+				add_vgpr_argument(&args, ctx->i32, &ctx->abi.vertex_id); // vertex id
+				add_vgpr_argument(&args, ctx->i32, &ctx->rel_auto_id); // rel auto id
+				add_vgpr_argument(&args, ctx->i32, &ctx->vs_prim_id); // vs prim id
+				add_vgpr_argument(&args, ctx->i32, &ctx->abi.instance_id); // instance id
+			} else {
+				add_vgpr_argument(&args, ctx->f32, &ctx->tes_u); // tes_u
+				add_vgpr_argument(&args, ctx->f32, &ctx->tes_v); // tes_v
+				add_vgpr_argument(&args, ctx->i32, &ctx->tes_rel_patch_id); // tes rel patch id
+				add_vgpr_argument(&args, ctx->i32, &ctx->tes_patch_id); // tes patch id
+			}
+		} else {
+			radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
+			radv_define_vs_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &args);
+			add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_ring_stride); // gsvs stride
+			add_user_sgpr_argument(&args, ctx->i32, &ctx->gsvs_num_entries); // gsvs num entires
+			if (ctx->shader_info->info.needs_multiview_view_index)
+				add_user_sgpr_argument(&args, ctx->i32, &ctx->view_index);
+			add_sgpr_argument(&args, ctx->i32, &ctx->gs2vs_offset); // gs2vs offset
+			add_sgpr_argument(&args, ctx->i32, &ctx->gs_wave_id); // wave id
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[0]); // vtx0
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[1]); // vtx1
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_prim_id); // prim id
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[2]);
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[3]);
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[4]);
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_vtx_offset[5]);
+			add_vgpr_argument(&args, ctx->i32, &ctx->gs_invocation_id);
+		}
 		break;
 	case MESA_SHADER_FRAGMENT:
 		radv_define_common_user_sgprs_phase1(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_info, &args, &desc_sets);
@@ -949,10 +988,17 @@ static void create_function(struct nir_to_llvm_context *ctx,
 			set_userdata_location_shader(ctx, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
 		break;
 	case MESA_SHADER_GEOMETRY:
-		radv_define_vs_user_sgprs_phase2(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_idx);
+		if (has_previous_stage) {
+			if (previous_stage == MESA_SHADER_VERTEX)
+				radv_define_vs_user_sgprs_phase2(ctx, stage, has_previous_stage, previous_stage, &user_sgpr_idx);
+			else
+				set_userdata_location_shader(ctx, AC_UD_TES_OFFCHIP_LAYOUT, &user_sgpr_idx, 1);
+		}
 		set_userdata_location_shader(ctx, AC_UD_GS_VS_RING_STRIDE_ENTRIES, &user_sgpr_idx, 2);
 		if (ctx->view_index)
 			set_userdata_location_shader(ctx, AC_UD_VIEW_INDEX, &user_sgpr_idx, 1);
+		if (has_previous_stage)
+			declare_tess_lds(ctx);
 		break;
 	case MESA_SHADER_FRAGMENT:
 		if (ctx->shader_info->info.ps.needs_sample_positions) {




More information about the mesa-commit mailing list