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

---
 src/amd/common/ac_nir_to_llvm.c | 74 +++++++++++++++++++++++------------------
 1 file changed, 41 insertions(+), 33 deletions(-)

diff --git a/src/amd/common/ac_nir_to_llvm.c b/src/amd/common/ac_nir_to_llvm.c
index 68865bd..e65f167 100644
--- a/src/amd/common/ac_nir_to_llvm.c
+++ b/src/amd/common/ac_nir_to_llvm.c
@@ -23,20 +23,21 @@
 
 #include "ac_nir_to_llvm.h"
 #include "ac_llvm_build.h"
 #include "ac_llvm_util.h"
 #include "ac_binary.h"
 #include "sid.h"
 #include "nir/nir.h"
 #include "../vulkan/radv_descriptor_set.h"
 #include "util/bitscan.h"
 #include <llvm-c/Transforms/Scalar.h>
+#include "ac_shader_abi.h"
 #include "ac_shader_info.h"
 #include "ac_exp_param.h"
 
 enum radeon_llvm_calling_convention {
        RADEON_LLVM_AMDGPU_VS = 87,
        RADEON_LLVM_AMDGPU_GS = 88,
        RADEON_LLVM_AMDGPU_PS = 89,
        RADEON_LLVM_AMDGPU_CS = 90,
 };
 
@@ -50,45 +51,42 @@ enum desc_type {
        DESC_IMAGE,
        DESC_FMASK,
        DESC_SAMPLER,
        DESC_BUFFER,
 };
 
 struct nir_to_llvm_context {
        struct ac_llvm_context ac;
        const struct ac_nir_compiler_options *options;
        struct ac_shader_variant_info *shader_info;
+       struct ac_shader_abi abi;
+
        unsigned max_workgroup_size;
        LLVMContextRef context;
        LLVMModuleRef module;
        LLVMBuilderRef builder;
        LLVMValueRef main_function;
 
        struct hash_table *defs;
        struct hash_table *phis;
 
        LLVMValueRef descriptor_sets[AC_UD_MAX_SETS];
        LLVMValueRef ring_offsets;
        LLVMValueRef push_constants;
        LLVMValueRef num_work_groups;
        LLVMValueRef workgroup_ids;
        LLVMValueRef local_invocation_ids;
        LLVMValueRef tg_size;
 
        LLVMValueRef vertex_buffers;
-       LLVMValueRef base_vertex;
-       LLVMValueRef start_instance;
-       LLVMValueRef draw_index;
-       LLVMValueRef vertex_id;
        LLVMValueRef rel_auto_id;
        LLVMValueRef vs_prim_id;
-       LLVMValueRef instance_id;
        LLVMValueRef ls_out_layout;
        LLVMValueRef es2gs_offset;
 
        LLVMValueRef tcs_offchip_layout;
        LLVMValueRef tcs_out_offsets;
        LLVMValueRef tcs_out_layout;
        LLVMValueRef tcs_in_layout;
        LLVMValueRef oc_lds;
        LLVMValueRef tess_factor_offset;
        LLVMValueRef tcs_patch_id;
@@ -258,65 +256,70 @@ struct arg_info {
        LLVMValueRef *assign[MAX_ARGS];
        unsigned array_params_mask;
        uint8_t count;
        uint8_t user_sgpr_count;
        uint8_t sgpr_count;
        uint8_t num_user_sgprs_used;
        uint8_t num_sgprs_used;
        uint8_t num_vgprs_used;
 };
 
-static inline void
+static inline int
 add_argument(struct arg_info *info,
             LLVMTypeRef type, LLVMValueRef *param_ptr)
 {
-       assert(info->count < MAX_ARGS);
-       info->assign[info->count] = param_ptr;
-       info->types[info->count] = type;
+       int idx = info->count;
+       assert(idx < MAX_ARGS);
+       info->assign[idx] = param_ptr;
+       info->types[idx] = type;
        info->count++;
+       return idx;
 }
 
-static inline void
+static inline int
 add_sgpr_argument(struct arg_info *info,
                  LLVMTypeRef type, LLVMValueRef *param_ptr)
 {
-       add_argument(info, type, param_ptr);
+       int idx = add_argument(info, type, param_ptr);
        info->num_sgprs_used += llvm_get_type_size(type) / 4;
        info->sgpr_count++;
+       return idx;
 }
 
-static inline void
+static inline int
 add_user_sgpr_argument(struct arg_info *info,
                       LLVMTypeRef type,
                       LLVMValueRef *param_ptr)
 {
-       add_sgpr_argument(info, type, param_ptr);
+       int idx = add_sgpr_argument(info, type, param_ptr);
        info->num_user_sgprs_used += llvm_get_type_size(type) / 4;
        info->user_sgpr_count++;
+       return idx;
 }
 
-static inline void
+static inline int
 add_vgpr_argument(struct arg_info *info,
                  LLVMTypeRef type,
                  LLVMValueRef *param_ptr)
 {
-       add_argument(info, type, param_ptr);
+       int idx = add_argument(info, type, param_ptr);
        info->num_vgprs_used += llvm_get_type_size(type) / 4;
+       return idx;
 }
 
-static inline void
+static inline int
 add_user_sgpr_array_argument(struct arg_info *info,
                             LLVMTypeRef type,
                             LLVMValueRef *param_ptr)
 {
        info->array_params_mask |= (1 << info->count);
-       add_user_sgpr_argument(info, type, param_ptr);
+       return add_user_sgpr_argument(info, type, param_ptr);
 }
 
 static void assign_arguments(LLVMValueRef main_function,
                             struct arg_info *info)
 {
        unsigned i;
        for (i = 0; i < info->count; i++) {
                if (info->assign[i])
                        *info->assign[i] = LLVMGetParam(main_function, i);
        }
@@ -739,34 +742,34 @@ static void create_function(struct nir_to_llvm_context 
*ctx)
                if (ctx->shader_info->info.cs.grid_components_used)
                        add_user_sgpr_argument(&args, LLVMVectorType(ctx->i32, 
ctx->shader_info->info.cs.grid_components_used), &ctx->num_work_groups); /* 
grid size */
                add_sgpr_argument(&args, LLVMVectorType(ctx->i32, 3), 
&ctx->workgroup_ids);
                add_sgpr_argument(&args, ctx->i32, &ctx->tg_size);
                add_vgpr_argument(&args, LLVMVectorType(ctx->i32, 3), 
&ctx->local_invocation_ids);
                break;
        case MESA_SHADER_VERTEX:
                if (!ctx->is_gs_copy_shader) {
                        if (ctx->shader_info->info.vs.has_vertex_buffers)
                                add_user_sgpr_argument(&args, 
const_array(ctx->v16i8, 16), &ctx->vertex_buffers); /* vertex buffers */
-                       add_user_sgpr_argument(&args, ctx->i32, 
&ctx->base_vertex); // base vertex
-                       add_user_sgpr_argument(&args, ctx->i32, 
&ctx->start_instance);// start instance
+                       ctx->abi.param_base_vertex = 
add_user_sgpr_argument(&args, ctx->i32, NULL); // base vertex
+                       ctx->abi.param_start_instance = 
add_user_sgpr_argument(&args, ctx->i32, NULL);// start instance
                        if (ctx->shader_info->info.vs.needs_draw_id)
-                               add_user_sgpr_argument(&args, ctx->i32, 
&ctx->draw_index); // draw id
+                               ctx->abi.param_draw_id = 
add_user_sgpr_argument(&args, ctx->i32, NULL); // draw id
                }
                if (ctx->options->key.vs.as_es)
                        add_sgpr_argument(&args, ctx->i32, &ctx->es2gs_offset); 
// es2gs offset
                else if (ctx->options->key.vs.as_ls)
                        add_user_sgpr_argument(&args, ctx->i32, 
&ctx->ls_out_layout); // ls out layout
-               add_vgpr_argument(&args, ctx->i32, &ctx->vertex_id); // vertex 
id
+               ctx->abi.param_vertex_id = add_vgpr_argument(&args, ctx->i32, 
NULL); // vertex id
                if (!ctx->is_gs_copy_shader) {
                        add_vgpr_argument(&args, ctx->i32, &ctx->rel_auto_id); 
// rel auto id
                        add_vgpr_argument(&args, ctx->i32, &ctx->vs_prim_id); 
// vs prim id
-                       add_vgpr_argument(&args, ctx->i32, &ctx->instance_id); 
// instance id
+                       ctx->abi.param_instance_id = add_vgpr_argument(&args, 
ctx->i32, NULL); // instance id
                }
                break;
        case MESA_SHADER_TESS_CTRL:
                add_user_sgpr_argument(&args, ctx->i32, 
&ctx->tcs_offchip_layout); // tcs offchip layout
                add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_out_offsets); 
// tcs out offsets
                add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_out_layout); 
// tcs out layout
                add_user_sgpr_argument(&args, ctx->i32, &ctx->tcs_in_layout); 
// tcs in layout
                add_sgpr_argument(&args, ctx->i32, &ctx->oc_lds); // param oc 
lds
                add_sgpr_argument(&args, ctx->i32, &ctx->tess_factor_offset); 
// tess factor offset
                add_vgpr_argument(&args, ctx->i32, &ctx->tcs_patch_id); // 
patch id
@@ -3836,36 +3839,36 @@ static void visit_intrinsic(struct nir_to_llvm_context 
*ctx,
                             nir_intrinsic_instr *instr)
 {
        LLVMValueRef result = NULL;
 
        switch (instr->intrinsic) {
        case nir_intrinsic_load_work_group_id: {
                result = ctx->workgroup_ids;
                break;
        }
        case nir_intrinsic_load_base_vertex: {
-               result = ctx->base_vertex;
+               result = LLVMGetParam(ctx->main_function, 
ctx->abi.param_base_vertex);
                break;
        }
        case nir_intrinsic_load_vertex_id_zero_base: {
-               result = ctx->vertex_id;
+               result = LLVMGetParam(ctx->main_function, 
ctx->abi.param_vertex_id);
                break;
        }
        case nir_intrinsic_load_local_invocation_id: {
                result = ctx->local_invocation_ids;
                break;
        }
        case nir_intrinsic_load_base_instance:
-               result = ctx->start_instance;
+               result = LLVMGetParam(ctx->main_function, 
ctx->abi.param_start_instance);
                break;
        case nir_intrinsic_load_draw_id:
-               result = ctx->draw_index;
+               result = LLVMGetParam(ctx->main_function, 
ctx->abi.param_draw_id);
                break;
        case nir_intrinsic_load_invocation_id:
                if (ctx->stage == MESA_SHADER_TESS_CTRL)
                        result = unpack_param(ctx, ctx->tcs_rel_ids, 8, 5);
                else
                        result = ctx->gs_invocation_id;
                break;
        case nir_intrinsic_load_primitive_id:
                if (ctx->stage == MESA_SHADER_GEOMETRY)
                        result = ctx->gs_prim_id;
@@ -3884,21 +3887,21 @@ static void visit_intrinsic(struct nir_to_llvm_context 
*ctx,
                ctx->shader_info->fs.force_persample = true;
                result = load_sample_pos(ctx);
                break;
        case nir_intrinsic_load_sample_mask_in:
                result = ctx->sample_coverage;
                break;
        case nir_intrinsic_load_front_face:
                result = ctx->front_face;
                break;
        case nir_intrinsic_load_instance_id:
-               result = ctx->instance_id;
+               result = LLVMGetParam(ctx->main_function, 
ctx->abi.param_instance_id);
                ctx->shader_info->vs.vgpr_comp_cnt = MAX2(3,
                                            ctx->shader_info->vs.vgpr_comp_cnt);
                break;
        case nir_intrinsic_load_num_work_groups:
                result = ctx->num_work_groups;
                break;
        case nir_intrinsic_load_local_invocation_index:
                result = visit_load_local_invocation_index(ctx);
                break;
        case nir_intrinsic_load_push_constant:
@@ -4672,27 +4675,30 @@ handle_vs_input_decl(struct nir_to_llvm_context *ctx,
        LLVMValueRef t_list;
        LLVMValueRef input;
        LLVMValueRef buffer_index;
        int index = variable->data.location - VERT_ATTRIB_GENERIC0;
        int idx = variable->data.location;
        unsigned attrib_count = glsl_count_attribute_slots(variable->type, 
true);
 
        variable->data.driver_location = idx * 4;
 
        if (ctx->options->key.vs.instance_rate_inputs & (1u << index)) {
-               buffer_index = LLVMBuildAdd(ctx->builder, ctx->instance_id,
-                                           ctx->start_instance, "");
+               buffer_index = LLVMBuildAdd(ctx->builder,
+                       LLVMGetParam(ctx->main_function, 
ctx->abi.param_instance_id),
+                       LLVMGetParam(ctx->main_function, 
ctx->abi.param_start_instance), "");
                ctx->shader_info->vs.vgpr_comp_cnt = MAX2(3,
                                            ctx->shader_info->vs.vgpr_comp_cnt);
-       } else
-               buffer_index = LLVMBuildAdd(ctx->builder, ctx->vertex_id,
-                                           ctx->base_vertex, "");
+       } else {
+               buffer_index = LLVMBuildAdd(ctx->builder,
+                       LLVMGetParam(ctx->main_function, 
ctx->abi.param_vertex_id),
+                       LLVMGetParam(ctx->main_function, 
ctx->abi.param_base_vertex), "");
+       }
 
        for (unsigned i = 0; i < attrib_count; ++i, ++idx) {
                t_offset = LLVMConstInt(ctx->i32, index + i, false);
 
                t_list = ac_build_indexed_load_const(&ctx->ac, t_list_ptr, 
t_offset);
 
                input = ac_build_buffer_load_format(&ctx->ac, t_list,
                                                    buffer_index,
                                                    LLVMConstInt(ctx->i32, 0, 
false),
                                                    true);
@@ -6140,21 +6146,23 @@ void ac_compile_nir_shader(LLVMTargetMachineRef tm,
        default:
                break;
        }
 }
 
 static void
 ac_gs_copy_shader_emit(struct nir_to_llvm_context *ctx)
 {
        LLVMValueRef args[9];
        args[0] = ctx->gsvs_ring;
-       args[1] = LLVMBuildMul(ctx->builder, ctx->vertex_id, 
LLVMConstInt(ctx->i32, 4, false), "");
+       args[1] = LLVMBuildMul(ctx->builder,
+                              LLVMGetParam(ctx->main_function, 
ctx->abi.param_vertex_id),
+                              LLVMConstInt(ctx->i32, 4, false), "");
        args[3] = ctx->i32zero;
        args[4] = ctx->i32one;  /* OFFEN */
        args[5] = ctx->i32zero; /* IDXEN */
        args[6] = ctx->i32one;  /* GLC */
        args[7] = ctx->i32one;  /* SLC */
        args[8] = ctx->i32zero; /* TFE */
 
        int idx = 0;
 
        for (unsigned i = 0; i < RADEON_LLVM_MAX_OUTPUTS; ++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