ac/nir,radeonsi: add ac_shader_abi::front_face
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Sun, 25 Jun 2017 10:56:49 +0000 (12:56 +0200)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Jul 2017 12:55:42 +0000 (14:55 +0200)
v2: update for LLVMValueRefs in ac_shader_abi

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/amd/common/ac_nir_to_llvm.c
src/amd/common/ac_shader_abi.h
src/gallium/drivers/radeonsi/si_shader.c

index 9a88bbc3461c5f98487da980893ea9e7a27fc8e0..a089d69a8437b42e270ae65daae617889c71613f 100644 (file)
@@ -132,7 +132,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 front_face;
        LLVMValueRef ancillary;
        LLVMValueRef sample_coverage;
        LLVMValueRef frag_pos[4];
@@ -816,7 +815,7 @@ static void create_function(struct nir_to_llvm_context *ctx)
                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->i32, &ctx->front_face);  /* front face */
+               add_vgpr_argument(&args, ctx->i32, &ctx->abi.front_face);  /* front face */
                add_vgpr_argument(&args, ctx->i32, &ctx->ancillary);  /* ancillary */
                add_vgpr_argument(&args, ctx->i32, &ctx->sample_coverage);  /* sample coverage */
                add_vgpr_argument(&args, ctx->i32, NULL);  /* fixed pt */
@@ -4023,7 +4022,7 @@ static void visit_intrinsic(struct ac_nir_context *ctx,
                result = ctx->nctx->sample_coverage;
                break;
        case nir_intrinsic_load_front_face:
-               result = ctx->nctx->front_face;
+               result = ctx->abi->front_face;
                break;
        case nir_intrinsic_load_instance_id:
                result = ctx->abi->instance_id;
index efbd7de4608bfcdb5c92aa150b07923d246cd88d..1c8d0e8b3abfc5dd59efa28b34503d4d328872d3 100644 (file)
@@ -44,6 +44,7 @@ struct ac_shader_abi {
        LLVMValueRef draw_id;
        LLVMValueRef vertex_id;
        LLVMValueRef instance_id;
+       LLVMValueRef front_face;
 
        /* For VS and PS: pre-loaded shader inputs.
         *
index 6b55e7f4f6c5bd352c68199b2c88cb52b6e92b3a..2827b9d06a24399198c873d880fcee6291d3707f 100644 (file)
@@ -150,12 +150,19 @@ static unsigned add_arg(struct si_function_info *fninfo,
        return add_arg_assign(fninfo, regfile, type, NULL);
 }
 
+static void add_arg_assign_checked(struct si_function_info *fninfo,
+                                  enum si_arg_regfile regfile, LLVMTypeRef type,
+                                  LLVMValueRef *assign, unsigned idx)
+{
+       MAYBE_UNUSED unsigned actual = add_arg_assign(fninfo, regfile, type, assign);
+       assert(actual == idx);
+}
+
 static void add_arg_checked(struct si_function_info *fninfo,
                            enum si_arg_regfile regfile, LLVMTypeRef type,
                            unsigned idx)
 {
-       MAYBE_UNUSED unsigned actual = add_arg(fninfo, regfile, type);
-       assert(actual == idx);
+       add_arg_assign_checked(fninfo, regfile, type, NULL, idx);
 }
 
 /**
@@ -1563,7 +1570,7 @@ static void declare_system_value(struct si_shader_context *ctx,
        }
 
        case TGSI_SEMANTIC_FACE:
-               value = LLVMGetParam(ctx->main_fn, SI_PARAM_FRONT_FACE);
+               value = ctx->abi.front_face;
                break;
 
        case TGSI_SEMANTIC_SAMPLEID:
@@ -4531,7 +4538,8 @@ static void create_function(struct si_shader_context *ctx)
                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_checked(&fninfo, ARG_VGPR, ctx->i32, SI_PARAM_FRONT_FACE);
+               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_checked(&fninfo, ARG_VGPR, ctx->i32, SI_PARAM_ANCILLARY);
                add_arg_checked(&fninfo, ARG_VGPR, ctx->f32, SI_PARAM_SAMPLE_COVERAGE);