radeonsi: rename si_compiler -> ac_llvm_compiler
[mesa.git] / src / gallium / drivers / radeonsi / si_shader.c
index c6b91ba5cf3db483a143b7eb85c46dd84209db33..5dc12d87243631c4f8e667c85aa817c60924919a 100644 (file)
@@ -69,7 +69,7 @@ enum si_arg_regfile {
 
 static void si_init_shader_ctx(struct si_shader_context *ctx,
                               struct si_screen *sscreen,
-                              struct si_compiler *compiler);
+                              struct ac_llvm_compiler *compiler);
 
 static void si_llvm_emit_barrier(const struct lp_build_tgsi_action *action,
                                 struct lp_build_tgsi_context *bld_base,
@@ -3449,7 +3449,7 @@ static void si_set_ls_return_value_for_tcs(struct si_shader_context *ctx)
                                  8 + SI_SGPR_VS_STATE_BITS);
 
 #if !HAVE_32BIT_POINTERS
-       ret = si_insert_input_ptr(ctx, ret, ctx->param_vs_state_bits + 1,
+       ret = si_insert_input_ptr(ctx, ret, ctx->param_vs_state_bits + 4,
                                  8 + GFX9_SGPR_2ND_SAMPLERS_AND_IMAGES);
 #endif
 
@@ -3489,7 +3489,7 @@ static void si_set_es_return_value_for_gs(struct si_shader_context *ctx)
                                  8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
 
 #if !HAVE_32BIT_POINTERS
-       ret = si_insert_input_ptr(ctx, ret, ctx->param_vs_state_bits + 1,
+       ret = si_insert_input_ptr(ctx, ret, ctx->param_vs_state_bits + 4,
                                  8 + GFX9_SGPR_2ND_SAMPLERS_AND_IMAGES);
 #endif
 
@@ -3676,38 +3676,36 @@ static void si_llvm_emit_vs_epilogue(struct ac_shader_abi *abi,
         * an IF statement is added that clamps all colors if the constant
         * is true.
         */
-       if (ctx->type == PIPE_SHADER_VERTEX) {
-               struct lp_build_if_state if_ctx;
-               LLVMValueRef cond = NULL;
-               LLVMValueRef addr, val;
-
-               for (i = 0; i < info->num_outputs; i++) {
-                       if (info->output_semantic_name[i] != TGSI_SEMANTIC_COLOR &&
-                           info->output_semantic_name[i] != TGSI_SEMANTIC_BCOLOR)
-                               continue;
+       struct lp_build_if_state if_ctx;
+       LLVMValueRef cond = NULL;
+       LLVMValueRef addr, val;
 
-                       /* We've found a color. */
-                       if (!cond) {
-                               /* The state is in the first bit of the user SGPR. */
-                               cond = LLVMGetParam(ctx->main_fn,
-                                                   ctx->param_vs_state_bits);
-                               cond = LLVMBuildTrunc(ctx->ac.builder, cond,
-                                                     ctx->i1, "");
-                               lp_build_if(&if_ctx, &ctx->gallivm, cond);
-                       }
+       for (i = 0; i < info->num_outputs; i++) {
+               if (info->output_semantic_name[i] != TGSI_SEMANTIC_COLOR &&
+                   info->output_semantic_name[i] != TGSI_SEMANTIC_BCOLOR)
+                       continue;
 
-                       for (j = 0; j < 4; j++) {
-                               addr = addrs[4 * i + j];
-                               val = LLVMBuildLoad(ctx->ac.builder, addr, "");
-                               val = ac_build_clamp(&ctx->ac, val);
-                               LLVMBuildStore(ctx->ac.builder, val, addr);
-                       }
+               /* We've found a color. */
+               if (!cond) {
+                       /* The state is in the first bit of the user SGPR. */
+                       cond = LLVMGetParam(ctx->main_fn,
+                                           ctx->param_vs_state_bits);
+                       cond = LLVMBuildTrunc(ctx->ac.builder, cond,
+                                             ctx->i1, "");
+                       lp_build_if(&if_ctx, &ctx->gallivm, cond);
                }
 
-               if (cond)
-                       lp_build_endif(&if_ctx);
+               for (j = 0; j < 4; j++) {
+                       addr = addrs[4 * i + j];
+                       val = LLVMBuildLoad(ctx->ac.builder, addr, "");
+                       val = ac_build_clamp(&ctx->ac, val);
+                       LLVMBuildStore(ctx->ac.builder, val, addr);
+               }
        }
 
+       if (cond)
+               lp_build_endif(&if_ctx);
+
        for (i = 0; i < info->num_outputs; i++) {
                outputs[i].semantic_name = info->output_semantic_name[i];
                outputs[i].semantic_index = info->output_semantic_index[i];
@@ -4635,10 +4633,10 @@ static void declare_global_desc_pointers(struct si_shader_context *ctx,
 static void declare_vs_specific_input_sgprs(struct si_shader_context *ctx,
                                            struct si_function_info *fninfo)
 {
+       ctx->param_vs_state_bits = add_arg(fninfo, ARG_SGPR, ctx->i32);
        add_arg_assign(fninfo, ARG_SGPR, ctx->i32, &ctx->abi.base_vertex);
        add_arg_assign(fninfo, ARG_SGPR, ctx->i32, &ctx->abi.start_instance);
        add_arg_assign(fninfo, ARG_SGPR, ctx->i32, &ctx->abi.draw_id);
-       ctx->param_vs_state_bits = add_arg(fninfo, ARG_SGPR, ctx->i32);
 }
 
 static void declare_vs_input_vgprs(struct si_shader_context *ctx,
@@ -4745,7 +4743,7 @@ static void create_function(struct si_shader_context *ctx)
                        /* no extra parameters */
                } else {
                        if (shader->is_gs_copy_shader) {
-                               fninfo.num_params = ctx->param_rw_buffers + 1;
+                               fninfo.num_params = ctx->param_vs_state_bits + 1;
                                fninfo.num_sgpr_params = fninfo.num_params;
                        }
 
@@ -4866,13 +4864,12 @@ static void create_function(struct si_shader_context *ctx)
                if (ctx->type == PIPE_SHADER_VERTEX) {
                        declare_vs_specific_input_sgprs(ctx, &fninfo);
                } else {
+                       ctx->param_vs_state_bits = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                        ctx->param_tcs_offchip_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                        ctx->param_tes_offchip_addr = add_arg(&fninfo, ARG_SGPR, ctx->i32);
-                       if (!HAVE_32BIT_POINTERS) {
-                               /* Declare as many input SGPRs as the VS has. */
+                       /* Declare as many input SGPRs as the VS has. */
+                       if (!HAVE_32BIT_POINTERS)
                                add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
-                               ctx->param_vs_state_bits = add_arg(&fninfo, ARG_SGPR, ctx->i32); /* unused */
-                       }
                }
 
                if (!HAVE_32BIT_POINTERS) {
@@ -4918,6 +4915,7 @@ static void create_function(struct si_shader_context *ctx)
        case PIPE_SHADER_TESS_EVAL:
                declare_global_desc_pointers(ctx, &fninfo);
                declare_per_stage_desc_pointers(ctx, &fninfo, true);
+               ctx->param_vs_state_bits = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tcs_offchip_layout = add_arg(&fninfo, ARG_SGPR, ctx->i32);
                ctx->param_tes_offchip_addr = add_arg(&fninfo, ARG_SGPR, ctx->i32);
 
@@ -5643,7 +5641,7 @@ void si_shader_dump(struct si_screen *sscreen, const struct si_shader *shader,
 static int si_compile_llvm(struct si_screen *sscreen,
                           struct ac_shader_binary *binary,
                           struct si_shader_config *conf,
-                          struct si_compiler *compiler,
+                          struct ac_llvm_compiler *compiler,
                           LLVMModuleRef mod,
                           struct pipe_debug_callback *debug,
                           unsigned processor,
@@ -5721,7 +5719,7 @@ static void si_llvm_build_ret(struct si_shader_context *ctx, LLVMValueRef ret)
 /* Generate code for the hardware VS shader stage to go with a geometry shader */
 struct si_shader *
 si_generate_gs_copy_shader(struct si_screen *sscreen,
-                          struct si_compiler *compiler,
+                          struct ac_llvm_compiler *compiler,
                           struct si_shader_selector *gs_selector,
                           struct pipe_debug_callback *debug)
 {
@@ -5826,8 +5824,51 @@ si_generate_gs_copy_shader(struct si_screen *sscreen,
                                               stream);
                }
 
-               if (stream == 0)
+               if (stream == 0) {
+                       /* Vertex color clamping.
+                        *
+                        * This uses a state constant loaded in a user data SGPR and
+                        * an IF statement is added that clamps all colors if the constant
+                        * is true.
+                        */
+                       struct lp_build_if_state if_ctx;
+                       LLVMValueRef v[2], cond = NULL;
+                       LLVMBasicBlockRef blocks[2];
+
+                       for (unsigned i = 0; i < gsinfo->num_outputs; i++) {
+                               if (gsinfo->output_semantic_name[i] != TGSI_SEMANTIC_COLOR &&
+                                   gsinfo->output_semantic_name[i] != TGSI_SEMANTIC_BCOLOR)
+                                       continue;
+
+                               /* We've found a color. */
+                               if (!cond) {
+                                       /* The state is in the first bit of the user SGPR. */
+                                       cond = LLVMGetParam(ctx.main_fn,
+                                                           ctx.param_vs_state_bits);
+                                       cond = LLVMBuildTrunc(ctx.ac.builder, cond,
+                                                             ctx.i1, "");
+                                       lp_build_if(&if_ctx, &ctx.gallivm, cond);
+                                       /* Remember blocks for Phi. */
+                                       blocks[0] = if_ctx.true_block;
+                                       blocks[1] = if_ctx.entry_block;
+                               }
+
+                               for (unsigned j = 0; j < 4; j++) {
+                                       /* Insert clamp into the true block. */
+                                       v[0] = ac_build_clamp(&ctx.ac, outputs[i].values[j]);
+                                       v[1] = outputs[i].values[j];
+
+                                       /* Insert Phi into the endif block. */
+                                       LLVMPositionBuilderAtEnd(ctx.ac.builder, if_ctx.merge_block);
+                                       outputs[i].values[j] = ac_build_phi(&ctx.ac, ctx.f32, 2, v, blocks);
+                                       LLVMPositionBuilderAtEnd(ctx.ac.builder, if_ctx.true_block);
+                               }
+                       }
+                       if (cond)
+                               lp_build_endif(&if_ctx);
+
                        si_llvm_export_vs(&ctx, outputs, gsinfo->num_outputs);
+               }
 
                LLVMBuildBr(builder, end_bb);
        }
@@ -5960,7 +6001,7 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
 
 static void si_init_shader_ctx(struct si_shader_context *ctx,
                               struct si_screen *sscreen,
-                              struct si_compiler *compiler)
+                              struct ac_llvm_compiler *compiler)
 {
        struct lp_build_tgsi_context *bld_base;
 
@@ -6750,7 +6791,7 @@ static void si_build_wrapper_function(struct si_shader_context *ctx,
 }
 
 int si_compile_tgsi_shader(struct si_screen *sscreen,
-                          struct si_compiler *compiler,
+                          struct ac_llvm_compiler *compiler,
                           struct si_shader *shader,
                           struct pipe_debug_callback *debug)
 {
@@ -7091,7 +7132,7 @@ si_get_shader_part(struct si_screen *sscreen,
                   enum pipe_shader_type type,
                   bool prolog,
                   union si_shader_part_key *key,
-                  struct si_compiler *compiler,
+                  struct ac_llvm_compiler *compiler,
                   struct pipe_debug_callback *debug,
                   void (*build)(struct si_shader_context *,
                                 union si_shader_part_key *),
@@ -7337,7 +7378,7 @@ static void si_build_vs_prolog_function(struct si_shader_context *ctx,
 }
 
 static bool si_get_vs_prolog(struct si_screen *sscreen,
-                            struct si_compiler *compiler,
+                            struct ac_llvm_compiler *compiler,
                             struct si_shader *shader,
                             struct pipe_debug_callback *debug,
                             struct si_shader *main_part,
@@ -7365,7 +7406,7 @@ static bool si_get_vs_prolog(struct si_screen *sscreen,
  * Select and compile (or reuse) vertex shader parts (prolog & epilog).
  */
 static bool si_shader_select_vs_parts(struct si_screen *sscreen,
-                                     struct si_compiler *compiler,
+                                     struct ac_llvm_compiler *compiler,
                                      struct si_shader *shader,
                                      struct pipe_debug_callback *debug)
 {
@@ -7454,7 +7495,7 @@ static void si_build_tcs_epilog_function(struct si_shader_context *ctx,
  * Select and compile (or reuse) TCS parts (epilog).
  */
 static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
-                                      struct si_compiler *compiler,
+                                      struct ac_llvm_compiler *compiler,
                                       struct si_shader *shader,
                                       struct pipe_debug_callback *debug)
 {
@@ -7486,7 +7527,7 @@ static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
  * Select and compile (or reuse) GS parts (prolog).
  */
 static bool si_shader_select_gs_parts(struct si_screen *sscreen,
-                                     struct si_compiler *compiler,
+                                     struct ac_llvm_compiler *compiler,
                                      struct si_shader *shader,
                                      struct pipe_debug_callback *debug)
 {
@@ -7899,7 +7940,7 @@ static void si_build_ps_epilog_function(struct si_shader_context *ctx,
  * Select and compile (or reuse) pixel shader parts (prolog & epilog).
  */
 static bool si_shader_select_ps_parts(struct si_screen *sscreen,
-                                     struct si_compiler *compiler,
+                                     struct ac_llvm_compiler *compiler,
                                      struct si_shader *shader,
                                      struct pipe_debug_callback *debug)
 {
@@ -8030,7 +8071,7 @@ static void si_fix_resource_usage(struct si_screen *sscreen,
        }
 }
 
-int si_shader_create(struct si_screen *sscreen, struct si_compiler *compiler,
+int si_shader_create(struct si_screen *sscreen, struct ac_llvm_compiler *compiler,
                     struct si_shader *shader,
                     struct pipe_debug_callback *debug)
 {