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

v2: update for LLVMValueRefs in ac_shader_abi
---
 src/amd/common/ac_nir_to_llvm.c          | 30 +++++++++++++++++-------------
 src/amd/common/ac_shader_abi.h           |  1 +
 src/gallium/drivers/radeonsi/si_shader.c | 12 ++++++++----
 3 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 0cd3590..f8eb0c9 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -121,21 +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 frag_pos[4];
 
        LLVMTypeRef i1;
        LLVMTypeRef i8;
        LLVMTypeRef i16;
        LLVMTypeRef i32;
        LLVMTypeRef i64;
        LLVMTypeRef v2i32;
        LLVMTypeRef v3i32;
        LLVMTypeRef v4i32;
        LLVMTypeRef v8i32;
@@ -816,24 +815,24 @@ static void create_function(struct nir_to_llvm_context 
*ctx)
                        add_user_sgpr_argument(&args, ctx->i32, 
&ctx->sample_pos_offset); /* sample position offset */
                add_sgpr_argument(&args, ctx->i32, &ctx->prim_mask); /* prim 
mask */
                add_vgpr_argument(&args, ctx->v2i32, &ctx->persp_sample); /* 
persp sample */
                add_vgpr_argument(&args, ctx->v2i32, &ctx->persp_center); /* 
persp center */
                add_vgpr_argument(&args, ctx->v2i32, &ctx->persp_centroid); /* 
persp centroid */
                add_vgpr_argument(&args, ctx->v3i32, NULL); /* persp pull model 
*/
                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 */
+               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[0]);  /* 
pos x float */
+               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[1]);  /* 
pos y float */
+               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[2]);  /* 
pos z float */
+               add_vgpr_argument(&args, ctx->f32, &ctx->abi.frag_pos[3]);  /* 
pos w float */
                add_vgpr_argument(&args, ctx->i32, &ctx->abi.front_face);  /* 
front face */
                add_vgpr_argument(&args, ctx->i32, &ctx->abi.ancillary);  /* 
ancillary */
                add_vgpr_argument(&args, ctx->i32, &ctx->abi.sample_coverage);  
/* sample coverage */
                add_vgpr_argument(&args, ctx->i32, NULL);  /* fixed pt */
                break;
        default:
                unreachable("Shader stage not implemented");
        }
 
        ctx->main_function = create_llvm_function(
@@ -3278,21 +3277,24 @@ static LLVMValueRef get_image_coords(struct 
ac_nir_context *ctx,
                int chan;
 
                fmask_load_address[0] = 
LLVMBuildExtractElement(ctx->ac.builder, src0, masks[0], "");
                fmask_load_address[1] = 
LLVMBuildExtractElement(ctx->ac.builder, src0, masks[1], "");
                if (glsl_sampler_type_is_array(type))
                        fmask_load_address[2] = 
LLVMBuildExtractElement(ctx->ac.builder, src0, masks[2], "");
                else
                        fmask_load_address[2] = NULL;
                if (add_frag_pos) {
                        for (chan = 0; chan < 2; ++chan)
-                               fmask_load_address[chan] = 
LLVMBuildAdd(ctx->ac.builder, fmask_load_address[chan], 
LLVMBuildFPToUI(ctx->ac.builder, ctx->nctx->frag_pos[chan], ctx->ac.i32, ""), 
"");
+                               fmask_load_address[chan] =
+                                       LLVMBuildAdd(ctx->ac.builder, 
fmask_load_address[chan],
+                                               
LLVMBuildFPToUI(ctx->ac.builder, ctx->abi->frag_pos[chan],
+                                                               ctx->ac.i32, 
""), "");
                }
                sample_index = adjust_sample_index_using_fmask(&ctx->ac,
                                                               
fmask_load_address[0],
                                                               
fmask_load_address[1],
                                                               
fmask_load_address[2],
                                                               sample_index,
                                                               
get_sampler_desc(ctx, instr->variables[0], AC_DESC_FMASK, true, false));
        }
        if (count == 1) {
                if (instr->src[0].ssa->num_components)
@@ -3302,21 +3304,22 @@ static LLVMValueRef get_image_coords(struct 
ac_nir_context *ctx,
        } else {
                int chan;
                if (is_ms)
                        count--;
                for (chan = 0; chan < count; ++chan) {
                        coords[chan] = LLVMBuildExtractElement(ctx->ac.builder, 
src0, masks[chan], "");
                }
 
                if (add_frag_pos) {
                        for (chan = 0; chan < count; ++chan)
-                               coords[chan] = LLVMBuildAdd(ctx->ac.builder, 
coords[chan], LLVMBuildFPToUI(ctx->ac.builder, ctx->nctx->frag_pos[chan], 
ctx->ac.i32, ""), "");
+                               coords[chan] = LLVMBuildAdd(ctx->ac.builder, 
coords[chan], LLVMBuildFPToUI(ctx->ac.builder, ctx->abi->frag_pos[chan],
+                                               ctx->ac.i32, ""), "");
                }
                if (is_ms) {
                        coords[count] = sample_index;
                        count++;
                }
 
                if (count == 3) {
                        coords[3] = LLVMGetUndef(ctx->ac.i32);
                        count = 4;
                }
@@ -3712,26 +3715,26 @@ static LLVMValueRef load_sample_position(struct 
nir_to_llvm_context *ctx,
 
        ptr = LLVMBuildBitCast(ctx->builder, ptr,
                               const_array(ctx->v2f32, 64), "");
 
        sample_id = LLVMBuildAdd(ctx->builder, sample_id, 
ctx->sample_pos_offset, "");
        result = ac_build_indexed_load(&ctx->ac, ptr, sample_id, false);
 
        return result;
 }
 
-static LLVMValueRef load_sample_pos(struct nir_to_llvm_context *ctx)
+static LLVMValueRef load_sample_pos(struct ac_nir_context *ctx)
 {
        LLVMValueRef values[2];
 
-       values[0] = emit_ffract(&ctx->ac, ctx->frag_pos[0]);
-       values[1] = emit_ffract(&ctx->ac, ctx->frag_pos[1]);
+       values[0] = emit_ffract(&ctx->ac, ctx->abi->frag_pos[0]);
+       values[1] = emit_ffract(&ctx->ac, ctx->abi->frag_pos[1]);
        return ac_build_gather_values(&ctx->ac, values, 2);
 }
 
 static LLVMValueRef visit_interp(struct nir_to_llvm_context *ctx,
                                 const nir_intrinsic_instr *instr)
 {
        LLVMValueRef result[2];
        LLVMValueRef interp_param, attr_number;
        unsigned location;
        unsigned chan;
@@ -3971,21 +3974,21 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                } else if (ctx->stage == MESA_SHADER_TESS_EVAL) {
                        ctx->nctx->shader_info->tcs.uses_prim_id = true;
                        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->abi->ancillary, 8, 4);
                break;
        case nir_intrinsic_load_sample_pos:
-               result = load_sample_pos(ctx->nctx);
+               result = load_sample_pos(ctx);
                break;
        case nir_intrinsic_load_sample_mask_in:
                result = ctx->abi->sample_coverage;
                break;
        case nir_intrinsic_load_front_face:
                result = ctx->abi->front_face;
                break;
        case nir_intrinsic_load_instance_id:
                result = ctx->abi->instance_id;
                break;
@@ -4978,23 +4981,24 @@ handle_fs_inputs_pre(struct nir_to_llvm_context *ctx,
                    i == VARYING_SLOT_PRIMITIVE_ID || i == VARYING_SLOT_LAYER) {
                        interp_param = *inputs;
                        interp_fs_input(ctx, index, interp_param, 
ctx->prim_mask,
                                        inputs);
 
                        if (!interp_param)
                                ctx->shader_info->fs.flat_shaded_mask |= 1u << 
index;
                        ++index;
                } else if (i == VARYING_SLOT_POS) {
                        for(int i = 0; i < 3; ++i)
-                               inputs[i] = ctx->frag_pos[i];
+                               inputs[i] = ctx->abi.frag_pos[i];
 
-                       inputs[3] = ac_build_fdiv(&ctx->ac, ctx->f32one, 
ctx->frag_pos[3]);
+                       inputs[3] = ac_build_fdiv(&ctx->ac, ctx->f32one,
+                                                 ctx->abi.frag_pos[3]);
                }
        }
        ctx->shader_info->fs.num_interp = index;
        if (ctx->input_mask & (1 << VARYING_SLOT_PNTC))
                ctx->shader_info->fs.has_pcoord = true;
        if (ctx->input_mask & (1 << VARYING_SLOT_PRIMITIVE_ID))
                ctx->shader_info->fs.prim_id_input = true;
        if (ctx->input_mask & (1 << VARYING_SLOT_LAYER))
                ctx->shader_info->fs.layer_input = true;
        ctx->shader_info->fs.input_mask = ctx->input_mask >> VARYING_SLOT_VAR0;
diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h
index fd62f22..c2dd1c3 100644
--- a/src/amd/common/ac_shader_abi.h
+++ b/src/amd/common/ac_shader_abi.h
@@ -37,20 +37,21 @@ enum ac_descriptor_type {
  * radv to share a compiler backend.
  */
 struct ac_shader_abi {
        enum chip_class chip_class;
 
        LLVMValueRef base_vertex;
        LLVMValueRef start_instance;
        LLVMValueRef draw_id;
        LLVMValueRef vertex_id;
        LLVMValueRef instance_id;
+       LLVMValueRef frag_pos[4];
        LLVMValueRef front_face;
        LLVMValueRef ancillary;
        LLVMValueRef sample_coverage;
 
        /* For VS and PS: pre-loaded shader inputs.
         *
         * Currently only used for NIR shaders; indexed by variables'
         * driver_location.
         */
        LLVMValueRef *inputs;
diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 7eba137..7fa76cd 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -4505,24 +4505,28 @@ static void create_function(struct si_shader_context 
*ctx)
                add_arg_checked(&fninfo, ARG_SGPR, ctx->i32, 
SI_PARAM_PRIM_MASK);
 
                add_arg_checked(&fninfo, ARG_VGPR, ctx->v2i32, 
SI_PARAM_PERSP_SAMPLE);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->v2i32, 
SI_PARAM_PERSP_CENTER);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->v2i32, 
SI_PARAM_PERSP_CENTROID);
                add_arg_checked(&fninfo, ARG_VGPR, v3i32, 
SI_PARAM_PERSP_PULL_MODEL);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->v2i32, 
SI_PARAM_LINEAR_SAMPLE);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->v2i32, 
SI_PARAM_LINEAR_CENTER);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->v2i32, 
SI_PARAM_LINEAR_CENTROID);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->f32, 
SI_PARAM_LINE_STIPPLE_TEX);
-               add_arg_checked(&fninfo, ARG_VGPR, ctx->f32, 
SI_PARAM_POS_X_FLOAT);
-               add_arg_checked(&fninfo, ARG_VGPR, ctx->f32, 
SI_PARAM_POS_Y_FLOAT);
-               add_arg_checked(&fninfo, ARG_VGPR, ctx->f32, 
SI_PARAM_POS_Z_FLOAT);
-               add_arg_checked(&fninfo, ARG_VGPR, ctx->f32, 
SI_PARAM_POS_W_FLOAT);
+               add_arg_assign_checked(&fninfo, ARG_VGPR, ctx->f32,
+                                      &ctx->abi.frag_pos[0], 
SI_PARAM_POS_X_FLOAT);
+               add_arg_assign_checked(&fninfo, ARG_VGPR, ctx->f32,
+                                      &ctx->abi.frag_pos[1], 
SI_PARAM_POS_Y_FLOAT);
+               add_arg_assign_checked(&fninfo, ARG_VGPR, ctx->f32,
+                                      &ctx->abi.frag_pos[2], 
SI_PARAM_POS_Z_FLOAT);
+               add_arg_assign_checked(&fninfo, ARG_VGPR, ctx->f32,
+                                      &ctx->abi.frag_pos[3], 
SI_PARAM_POS_W_FLOAT);
                add_arg_assign_checked(&fninfo, ARG_VGPR, ctx->i32,
                                       &ctx->abi.front_face, 
SI_PARAM_FRONT_FACE);
                shader->info.face_vgpr_index = 20;
                add_arg_assign_checked(&fninfo, ARG_VGPR, ctx->i32,
                                       &ctx->abi.ancillary, SI_PARAM_ANCILLARY);
                add_arg_assign_checked(&fninfo, ARG_VGPR, ctx->f32,
                                       &ctx->abi.sample_coverage, 
SI_PARAM_SAMPLE_COVERAGE);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->i32, 
SI_PARAM_POS_FIXED_PT);
 
                /* Color inputs from the prolog. */
-- 
2.9.3

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

Reply via email to