summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolai Hähnle <nicolai.haehnle@amd.com>2017-06-25 19:48:09 +0200
committerNicolai Hähnle <nicolai.haehnle@amd.com>2017-06-26 15:37:11 +0200
commitee5d0937a7022027816d4ed7fc7bb3f4fd628996 (patch)
tree04d3a28c6d12503dafcfc3932cfa3f0df3a18afa
parenta6d648b052196a7e02e7a4ea6babbff40ce3ecf4 (diff)
ac/nir,radeonsi: add and use ac_shader_abi::param_frag_pos
-rw-r--r--src/amd/common/ac_nir_to_llvm.c30
-rw-r--r--src/amd/common/ac_shader_abi.h1
-rw-r--r--src/gallium/drivers/radeonsi/si_shader.c1
3 files changed, 21 insertions, 11 deletions
diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 1cb920c762..0457d4335b 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -67,6 +67,7 @@ struct ac_nir_context {
int num_locals;
LLVMValueRef *locals;
+ LLVMValueRef frag_pos[4];
LLVMValueRef ddxy_lds;
struct nir_to_llvm_context *nctx; /* TODO get rid of this */
@@ -128,7 +129,6 @@ struct nir_to_llvm_context {
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;
@@ -829,10 +829,11 @@ static void create_function(struct nir_to_llvm_context *ctx)
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_frag_pos =
+ add_vgpr_argument(&args, ctx->f32, NULL); /* pos x float */
+ add_vgpr_argument(&args, ctx->f32, NULL); /* pos y float */
+ add_vgpr_argument(&args, ctx->f32, NULL); /* pos z float */
+ add_vgpr_argument(&args, ctx->f32, NULL); /* pos w float */
ctx->abi.param_front_face =
add_vgpr_argument(&args, ctx->i32, NULL); /* front face */
ctx->abi.param_ancillary =
@@ -3251,7 +3252,7 @@ static LLVMValueRef get_image_coords(struct ac_nir_context *ctx,
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->frag_pos[chan], ctx->ac.i32, ""), "");
}
sample_index = adjust_sample_index_using_fmask(&ctx->ac,
fmask_load_address[0],
@@ -3275,7 +3276,7 @@ static LLVMValueRef get_image_coords(struct ac_nir_context *ctx,
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->frag_pos[chan], ctx->ac.i32, ""), "");
}
if (is_ms) {
coords[count] = sample_index;
@@ -3679,7 +3680,7 @@ static LLVMValueRef load_sample_position(struct nir_to_llvm_context *ctx,
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];
@@ -3937,7 +3938,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
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 = LLVMGetParam(ctx->main_function, ctx->abi->param_sample_coverage);
@@ -4947,9 +4948,11 @@ handle_fs_inputs_pre(struct nir_to_llvm_context *ctx,
++index;
} else if (i == VARYING_SLOT_POS) {
for(int i = 0; i < 3; ++i)
- inputs[i] = ctx->frag_pos[i];
+ inputs[i] = LLVMGetParam(ctx->main_function, ctx->abi.param_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,
+ LLVMGetParam(ctx->main_function,
+ ctx->abi.param_frag_pos + 3));
}
}
ctx->shader_info->fs.num_interp = index;
@@ -6023,6 +6026,11 @@ void ac_nir_translate(struct ac_llvm_context *ac, struct ac_shader_abi *abi,
setup_locals(&ctx, func);
+ if (nir->stage == MESA_SHADER_FRAGMENT) {
+ for (unsigned i = 0; i < 4; ++i)
+ ctx.frag_pos[i] = LLVMGetParam(ctx.main_function, ctx.abi->param_frag_pos + i);
+ }
+
visit_cf_list(&ctx, &func->impl->body);
phi_post_pass(&ctx);
diff --git a/src/amd/common/ac_shader_abi.h b/src/amd/common/ac_shader_abi.h
index 5caee911d8..9fc4390880 100644
--- a/src/amd/common/ac_shader_abi.h
+++ b/src/amd/common/ac_shader_abi.h
@@ -42,6 +42,7 @@ struct ac_shader_abi {
int param_draw_id;
int param_vertex_id;
int param_instance_id;
+ int param_frag_pos;
int param_front_face;
int param_ancillary;
int param_sample_coverage;
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index 5e5379770d..91bc0675b2 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -4460,6 +4460,7 @@ 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;
+ ctx->abi.param_frag_pos = SI_PARAM_POS_X_FLOAT;
params[SI_PARAM_POS_Y_FLOAT] = ctx->f32;
params[SI_PARAM_POS_Z_FLOAT] = ctx->f32;
params[SI_PARAM_POS_W_FLOAT] = ctx->f32;