From: Nicolai Hähnle <nicolai.haeh...@amd.com>

---
 src/amd/common/ac_nir_to_llvm.c          | 14 ++++++++------
 src/amd/common/ac_shader_abi.h           |  2 ++
 src/gallium/drivers/radeonsi/si_shader.c |  2 ++
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 04b04e4..1cb920c 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -121,22 +121,20 @@ struct nir_to_llvm_context {
 
        LLVMValueRef esgs_ring;
        LLVMValueRef gsvs_ring;
        LLVMValueRef hs_ring_tess_offchip;
        LLVMValueRef hs_ring_tess_factor;
 
        LLVMValueRef prim_mask;
        LLVMValueRef sample_pos_offset;
        LLVMValueRef persp_sample, persp_center, persp_centroid;
        LLVMValueRef linear_sample, linear_center, linear_centroid;
-       LLVMValueRef ancillary;
-       LLVMValueRef sample_coverage;
        LLVMValueRef frag_pos[4];
 
        LLVMTypeRef i1;
        LLVMTypeRef i8;
        LLVMTypeRef i16;
        LLVMTypeRef i32;
        LLVMTypeRef i64;
        LLVMTypeRef v2i32;
        LLVMTypeRef v3i32;
        LLVMTypeRef v4i32;
@@ -830,22 +828,24 @@ static void create_function(struct nir_to_llvm_context 
*ctx)
                add_vgpr_argument(&args, ctx->v2i32, &ctx->linear_sample); /* 
linear sample */
                add_vgpr_argument(&args, ctx->v2i32, &ctx->linear_center); /* 
linear center */
                add_vgpr_argument(&args, ctx->v2i32, &ctx->linear_centroid); /* 
linear centroid */
                add_vgpr_argument(&args, ctx->f32, NULL);  /* line stipple tex 
*/
                add_vgpr_argument(&args, ctx->f32, &ctx->frag_pos[0]);  /* pos 
x float */
                add_vgpr_argument(&args, ctx->f32, &ctx->frag_pos[1]);  /* pos 
y float */
                add_vgpr_argument(&args, ctx->f32, &ctx->frag_pos[2]);  /* pos 
z float */
                add_vgpr_argument(&args, ctx->f32, &ctx->frag_pos[3]);  /* pos 
w float */
                ctx->abi.param_front_face =
                        add_vgpr_argument(&args, ctx->i32, NULL);  /* front 
face */
-               add_vgpr_argument(&args, ctx->i32, &ctx->ancillary);  /* 
ancillary */
-               add_vgpr_argument(&args, ctx->i32, &ctx->sample_coverage);  /* 
sample coverage */
+               ctx->abi.param_ancillary =
+                       add_vgpr_argument(&args, ctx->i32, NULL);  /* ancillary 
*/
+               ctx->abi.param_sample_coverage =
+                       add_vgpr_argument(&args, ctx->i32, NULL);  /* sample 
coverage */
                add_vgpr_argument(&args, ctx->i32, NULL);  /* fixed pt */
                break;
        default:
                unreachable("Shader stage not implemented");
        }
 
        ctx->main_function = create_llvm_function(
            ctx->context, ctx->module, ctx->builder, NULL, 0, &args,
            ctx->max_workgroup_size,
            ctx->options->unsafe_math);
@@ -3925,27 +3925,29 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                if (ctx->stage == MESA_SHADER_GEOMETRY)
                        result = ctx->nctx->gs_prim_id;
                else if (ctx->stage == MESA_SHADER_TESS_CTRL)
                        result = ctx->nctx->tcs_patch_id;
                else if (ctx->stage == MESA_SHADER_TESS_EVAL)
                        result = ctx->nctx->tes_patch_id;
                else
                        fprintf(stderr, "Unknown primitive id intrinsic: %d", 
ctx->stage);
                break;
        case nir_intrinsic_load_sample_id:
-               result = unpack_param(ctx->nctx, ctx->nctx->ancillary, 8, 4);
+               result = unpack_param(ctx->nctx,
+                                     LLVMGetParam(ctx->main_function, 
ctx->abi->param_ancillary),
+                                     8, 4);
                break;
        case nir_intrinsic_load_sample_pos:
                result = load_sample_pos(ctx->nctx);
                break;
        case nir_intrinsic_load_sample_mask_in:
-               result = ctx->nctx->sample_coverage;
+               result = LLVMGetParam(ctx->main_function, 
ctx->abi->param_sample_coverage);
                break;
        case nir_intrinsic_load_front_face:
                result = LLVMGetParam(ctx->main_function, 
ctx->abi->param_front_face);
                break;
        case nir_intrinsic_load_instance_id:
                result = LLVMGetParam(ctx->main_function, 
ctx->abi->param_instance_id);
                break;
        case nir_intrinsic_load_num_work_groups:
                result = ctx->nctx->num_work_groups;
                break;
diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h
index 4fc9f0a..5caee91 100644
--- a/src/amd/common/ac_shader_abi.h
+++ b/src/amd/common/ac_shader_abi.h
@@ -36,20 +36,22 @@ enum ac_descriptor_type {
  */
 struct ac_shader_abi {
        enum chip_class chip_class;
 
        int param_base_vertex;
        int param_start_instance;
        int param_draw_id;
        int param_vertex_id;
        int param_instance_id;
        int param_front_face;
+       int param_ancillary;
+       int param_sample_coverage;
 
        /* For VS and PS: pre-loaded shader inputs.
         *
         * Currently only used for NIR shaders; indexed by variables'
         * driver_location.
         */
        LLVMValueRef *inputs;
 
        void (*emit_outputs)(struct ac_shader_abi *abi,
                             unsigned max_outputs,
diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 0e8a601..5e53797 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -4460,21 +4460,23 @@ static void create_function(struct si_shader_context 
*ctx)
                params[SI_PARAM_LINEAR_CENTROID] = ctx->v2i32;
                params[SI_PARAM_LINE_STIPPLE_TEX] = ctx->f32;
                params[SI_PARAM_POS_X_FLOAT] = ctx->f32;
                params[SI_PARAM_POS_Y_FLOAT] = ctx->f32;
                params[SI_PARAM_POS_Z_FLOAT] = ctx->f32;
                params[SI_PARAM_POS_W_FLOAT] = ctx->f32;
                params[SI_PARAM_FRONT_FACE] = ctx->i32;
                ctx->abi.param_front_face = SI_PARAM_FRONT_FACE;
                shader->info.face_vgpr_index = 20;
                params[SI_PARAM_ANCILLARY] = ctx->i32;
+               ctx->abi.param_ancillary = SI_PARAM_ANCILLARY;
                params[SI_PARAM_SAMPLE_COVERAGE] = ctx->f32;
+               ctx->abi.param_sample_coverage = SI_PARAM_SAMPLE_COVERAGE;
                params[SI_PARAM_POS_FIXED_PT] = ctx->i32;
                num_params = SI_PARAM_POS_FIXED_PT+1;
 
                /* Color inputs from the prolog. */
                if (shader->selector->info.colors_read) {
                        unsigned num_color_elements =
                                
util_bitcount(shader->selector->info.colors_read);
 
                        assert(num_params + num_color_elements <= 
ARRAY_SIZE(params));
                        for (i = 0; i < num_color_elements; i++)
-- 
2.9.3

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to