ac: add gs_{prim,invocation}_id to the abi
authorTimothy Arceri <tarceri@itsqueeze.com>
Thu, 9 Nov 2017 04:23:23 +0000 (15:23 +1100)
committerTimothy Arceri <tarceri@itsqueeze.com>
Wed, 15 Nov 2017 23:54:03 +0000 (10:54 +1100)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_shader_abi.h
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader_internal.h

index 3d9f613d93b9e8b2e75ecf535a58c7d9888e1fe4..1ecdeca063c3fb9883c7bf3cf11c9a430062079d 100644 (file)
@@ -122,7 +122,6 @@ struct nir_to_llvm_context {
        LLVMValueRef gs2vs_offset;
        LLVMValueRef gs_wave_id;
        LLVMValueRef gs_vtx_offset[6];
-       LLVMValueRef gs_prim_id, gs_invocation_id;
 
        LLVMValueRef esgs_ring;
        LLVMValueRef gsvs_ring;
@@ -826,8 +825,8 @@ static void create_function(struct nir_to_llvm_context *ctx,
 
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[0]); // vtx01
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[2]); // vtx23
-                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_prim_id); // prim id
-                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_invocation_id);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_prim_id); // prim id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_invocation_id);
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[4]);
 
                        if (previous_stage == MESA_SHADER_VERTEX) {
@@ -852,12 +851,12 @@ static void create_function(struct nir_to_llvm_context *ctx,
                        add_sgpr_argument(&args, ctx->ac.i32, &ctx->gs_wave_id); // wave id
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[0]); // vtx0
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[1]); // vtx1
-                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_prim_id); // prim id
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_prim_id); // prim id
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[2]);
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[3]);
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[4]);
                        add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_vtx_offset[5]);
-                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->gs_invocation_id);
+                       add_vgpr_argument(&args, ctx->ac.i32, &ctx->abi.gs_invocation_id);
                }
                break;
        case MESA_SHADER_FRAGMENT:
@@ -4058,12 +4057,13 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                if (ctx->stage == MESA_SHADER_TESS_CTRL)
                        result = unpack_param(&ctx->ac, ctx->nctx->tcs_rel_ids, 8, 5);
                else
-                       result = ctx->nctx->gs_invocation_id;
+                       result = ctx->abi->gs_invocation_id;
                break;
        case nir_intrinsic_load_primitive_id:
                if (ctx->stage == MESA_SHADER_GEOMETRY) {
-                       ctx->nctx->shader_info->gs.uses_prim_id = true;
-                       result = ctx->nctx->gs_prim_id;
+                       if (ctx->nctx)
+                               ctx->nctx->shader_info->gs.uses_prim_id = true;
+                       result = ctx->abi->gs_prim_id;
                } else if (ctx->stage == MESA_SHADER_TESS_CTRL) {
                        ctx->nctx->shader_info->tcs.uses_prim_id = true;
                        result = ctx->nctx->tcs_patch_id;
index 27586d0212f2c1377a44fc646c342e7d5932afc4..56209bd917542ba22dcf69d36ae91bda9ae03793 100644 (file)
@@ -42,6 +42,8 @@ struct ac_shader_abi {
        LLVMValueRef draw_id;
        LLVMValueRef vertex_id;
        LLVMValueRef instance_id;
+       LLVMValueRef gs_prim_id;
+       LLVMValueRef gs_invocation_id;
        LLVMValueRef frag_pos[4];
        LLVMValueRef front_face;
        LLVMValueRef ancillary;
index 3293dd44c632ff4d3afb7e1266c308e7d0d207ba..c1a310275c180dd8ce316a849c3070bab77f7b19 100644 (file)
@@ -759,8 +759,7 @@ static LLVMValueRef get_primitive_id(struct si_shader_context *ctx,
                return LLVMGetParam(ctx->main_fn,
                                    ctx->param_tes_patch_id);
        case PIPE_SHADER_GEOMETRY:
-               return LLVMGetParam(ctx->main_fn,
-                                   ctx->param_gs_prim_id);
+               return ctx->abi.gs_prim_id;
        default:
                assert(0);
                return ctx->i32_0;
@@ -1674,8 +1673,7 @@ void si_load_system_value(struct si_shader_context *ctx,
                if (ctx->type == PIPE_SHADER_TESS_CTRL)
                        value = unpack_param(ctx, ctx->param_tcs_rel_ids, 8, 5);
                else if (ctx->type == PIPE_SHADER_GEOMETRY)
-                       value = LLVMGetParam(ctx->main_fn,
-                                            ctx->param_gs_instance_id);
+                       value = ctx->abi.gs_invocation_id;
                else
                        assert(!"INVOCATIONID not implemented");
                break;
@@ -4562,8 +4560,8 @@ static void create_function(struct si_shader_context *ctx)
                /* VGPRs (first GS, then VS/TES) */
                ctx->param_gs_vtx01_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
                ctx->param_gs_vtx23_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_prim_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
-               ctx->param_gs_instance_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_prim_id);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_invocation_id);
                ctx->param_gs_vtx45_offset = add_arg(&fninfo, ARG_VGPR, ctx->i32);
 
                if (ctx->type == PIPE_SHADER_VERTEX) {
@@ -4613,12 +4611,12 @@ static void create_function(struct si_shader_context *ctx)
                /* VGPRs */
                add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[0]);
                add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[1]);
-               ctx->param_gs_prim_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_prim_id);
                add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[2]);
                add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[3]);
                add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[4]);
                add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->gs_vtx_offset[5]);
-               ctx->param_gs_instance_id = add_arg(&fninfo, ARG_VGPR, ctx->i32);
+               add_arg_assign(&fninfo, ARG_VGPR, ctx->i32, &ctx->abi.gs_invocation_id);
                break;
 
        case PIPE_SHADER_FRAGMENT:
index 7ff8815b92feb659597f108d2a2c8cc09a698ebb..ebe11fad56d51c14cac361a38b7eeed2da350c40 100644 (file)
@@ -183,8 +183,6 @@ struct si_shader_context {
        int param_gs2vs_offset;
        int param_gs_wave_id; /* GFX6 */
        LLVMValueRef gs_vtx_offset[6]; /* in dwords (GFX6) */
-       int param_gs_prim_id;
-       int param_gs_instance_id;
        int param_gs_vtx01_offset; /* in dwords (GFX9) */
        int param_gs_vtx23_offset; /* in dwords (GFX9) */
        int param_gs_vtx45_offset; /* in dwords (GFX9) */