• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020 Advanced Micro Devices, Inc.
3  *
4  * SPDX-License-Identifier: MIT
5  */
6 
7 #include "si_pipe.h"
8 #include "si_shader_internal.h"
9 #include "si_shader_llvm.h"
10 #include "sid.h"
11 
si_nir_load_tcs_varyings(struct ac_shader_abi * abi,LLVMTypeRef type,unsigned driver_location,unsigned component,unsigned num_components)12 static LLVMValueRef si_nir_load_tcs_varyings(struct ac_shader_abi *abi, LLVMTypeRef type,
13                                              unsigned driver_location, unsigned component,
14                                              unsigned num_components)
15 {
16    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
17    struct si_shader_info *info = &ctx->shader->selector->info;
18 
19    assert(ctx->shader->key.ge.opt.same_patch_vertices);
20 
21    uint8_t semantic = info->input[driver_location].semantic;
22    /* Load the TCS input from a VGPR. */
23    unsigned func_param = ctx->args->ac.tcs_rel_ids.arg_index + 1 +
24       si_shader_io_get_unique_index(semantic) * 4;
25 
26    LLVMValueRef value[4];
27    for (unsigned i = component; i < component + num_components; i++) {
28       value[i] = LLVMGetParam(ctx->main_fn.value, func_param + i);
29       value[i] = LLVMBuildBitCast(ctx->ac.builder, value[i], type, "");
30    }
31 
32    return ac_build_varying_gather_values(&ctx->ac, value, num_components, component);
33 }
34 
si_llvm_tcs_build_end(struct si_shader_context * ctx)35 void si_llvm_tcs_build_end(struct si_shader_context *ctx)
36 {
37    if (ctx->screen->info.gfx_level >= GFX9) {
38       ac_build_endif(&ctx->ac, SI_MERGED_WRAP_IF_LABEL);
39    }
40 }
41 
si_llvm_ls_build_end(struct si_shader_context * ctx)42 void si_llvm_ls_build_end(struct si_shader_context *ctx)
43 {
44    struct si_shader *shader = ctx->shader;
45    bool same_thread_count = shader->key.ge.opt.same_patch_vertices;
46 
47    /* Only need return value when merged shader on part mode or mono mode with same thread count. */
48    if (ctx->screen->info.gfx_level < GFX9 || (shader->is_monolithic && !same_thread_count))
49       return;
50 
51    if (!ctx->shader->is_monolithic)
52       ac_build_endif(&ctx->ac, SI_MERGED_WRAP_IF_LABEL);
53 
54    LLVMValueRef ret = ctx->return_value;
55 
56    ret = si_insert_input_ptr(ctx, ret, ctx->args->other_const_and_shader_buffers, 0);
57    ret = si_insert_input_ptr(ctx, ret, ctx->args->other_samplers_and_images, 1);
58    ret = si_insert_input_ret(ctx, ret, ctx->args->ac.tess_offchip_offset, 2);
59    ret = si_insert_input_ret(ctx, ret, ctx->args->ac.merged_wave_info, 3);
60    ret = si_insert_input_ret(ctx, ret, ctx->args->ac.tcs_factor_offset, 4);
61    if (ctx->screen->info.gfx_level >= GFX11)
62       ret = si_insert_input_ret(ctx, ret, ctx->args->ac.tcs_wave_id, 5);
63    else
64       ret = si_insert_input_ret(ctx, ret, ctx->args->ac.scratch_offset, 5);
65 
66    ret = si_insert_input_ptr(ctx, ret, ctx->args->internal_bindings, 8 + SI_SGPR_INTERNAL_BINDINGS);
67    ret = si_insert_input_ptr(ctx, ret, ctx->args->bindless_samplers_and_images,
68                              8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
69 
70    ret = si_insert_input_ret(ctx, ret, ctx->args->vs_state_bits, 8 + SI_SGPR_VS_STATE_BITS);
71 
72    ret = si_insert_input_ret(ctx, ret, ctx->args->tcs_offchip_layout, 8 + GFX9_SGPR_TCS_OFFCHIP_LAYOUT);
73    ret = si_insert_input_ret(ctx, ret, ctx->args->tes_offchip_addr, 8 + GFX9_SGPR_TCS_OFFCHIP_ADDR);
74 
75    unsigned vgpr = 8 + GFX9_TCS_NUM_USER_SGPR;
76    ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.tcs_patch_id, vgpr++);
77    ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.tcs_rel_ids, vgpr++);
78 
79    if (same_thread_count) {
80       /* Same thread count is set only when mono mode. */
81       assert(shader->is_monolithic);
82 
83       struct si_shader_info *info = &shader->selector->info;
84       LLVMValueRef *addrs = ctx->abi.outputs;
85 
86       for (unsigned i = 0; i < info->num_outputs; i++) {
87          unsigned semantic = info->output_semantic[i];
88          int param = si_shader_io_get_unique_index(semantic);
89 
90          if (!(info->ls_es_outputs_written & BITFIELD64_BIT(param)))
91             continue;
92 
93          for (unsigned chan = 0; chan < 4; chan++) {
94             if (!(info->output_usagemask[i] & (1 << chan)))
95                continue;
96 
97             LLVMValueRef value = LLVMBuildLoad2(ctx->ac.builder, ctx->ac.f32, addrs[4 * i + chan], "");
98 
99             ret = LLVMBuildInsertValue(ctx->ac.builder, ret, value, vgpr + param * 4 + chan, "");
100          }
101       }
102    }
103 
104    ctx->return_value = ret;
105 }
106 
si_llvm_init_tcs_callbacks(struct si_shader_context * ctx)107 void si_llvm_init_tcs_callbacks(struct si_shader_context *ctx)
108 {
109    ctx->abi.load_tess_varyings = si_nir_load_tcs_varyings;
110 }
111