ac/nir: Add merged GS function.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Thu, 19 Oct 2017 23:06:50 +0000 (01:06 +0200)
committerDave Airlie <airlied@redhat.com>
Fri, 20 Oct 2017 05:23:14 +0000 (06:23 +0100)
[airlied: merged fixup + and fixed up a couple more bits].

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/amd/common/ac_nir_to_llvm.c

index 0e1c65a..de9510c 100644 (file)
@@ -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) {