1 /*
2 * Copyright 2020 Advanced Micro Devices, Inc.
3 *
4 * SPDX-License-Identifier: MIT
5 */
6
7 #include "ac_nir.h"
8 #include "si_pipe.h"
9 #include "si_shader_internal.h"
10 #include "si_shader_llvm.h"
11 #include "si_query.h"
12 #include "sid.h"
13 #include "util/u_memory.h"
14
si_is_es_thread(struct si_shader_context * ctx)15 LLVMValueRef si_is_es_thread(struct si_shader_context *ctx)
16 {
17 /* Return true if the current thread should execute an ES thread. */
18 return LLVMBuildICmp(ctx->ac.builder, LLVMIntULT, ac_get_thread_id(&ctx->ac),
19 si_unpack_param(ctx, ctx->args->ac.merged_wave_info, 0, 8), "");
20 }
21
si_is_gs_thread(struct si_shader_context * ctx)22 LLVMValueRef si_is_gs_thread(struct si_shader_context *ctx)
23 {
24 /* Return true if the current thread should execute a GS thread. */
25 return LLVMBuildICmp(ctx->ac.builder, LLVMIntULT, ac_get_thread_id(&ctx->ac),
26 si_unpack_param(ctx, ctx->args->ac.merged_wave_info, 8, 8), "");
27 }
28
si_llvm_es_build_end(struct si_shader_context * ctx)29 void si_llvm_es_build_end(struct si_shader_context *ctx)
30 {
31 if (ctx->screen->info.gfx_level < GFX9 || ctx->shader->is_monolithic)
32 return;
33
34 ac_build_endif(&ctx->ac, ctx->merged_wrap_if_label);
35
36 LLVMValueRef ret = ctx->return_value;
37
38 ret = si_insert_input_ptr(ctx, ret, ctx->args->other_const_and_shader_buffers, 0);
39 ret = si_insert_input_ptr(ctx, ret, ctx->args->other_samplers_and_images, 1);
40 if (ctx->shader->key.ge.as_ngg)
41 ret = si_insert_input_ptr(ctx, ret, ctx->args->ac.gs_tg_info, 2);
42 else
43 ret = si_insert_input_ret(ctx, ret, ctx->args->ac.gs2vs_offset, 2);
44 ret = si_insert_input_ret(ctx, ret, ctx->args->ac.merged_wave_info, 3);
45 if (ctx->screen->info.gfx_level >= GFX11)
46 ret = si_insert_input_ret(ctx, ret, ctx->args->ac.gs_attr_offset, 5);
47 else
48 ret = si_insert_input_ret(ctx, ret, ctx->args->ac.scratch_offset, 5);
49 ret = si_insert_input_ptr(ctx, ret, ctx->args->internal_bindings, 8 + SI_SGPR_INTERNAL_BINDINGS);
50 ret = si_insert_input_ptr(ctx, ret, ctx->args->bindless_samplers_and_images,
51 8 + SI_SGPR_BINDLESS_SAMPLERS_AND_IMAGES);
52 ret = si_insert_input_ptr(ctx, ret, ctx->args->vs_state_bits, 8 + SI_SGPR_VS_STATE_BITS);
53 if (ctx->screen->use_ngg) {
54 ret = si_insert_input_ptr(ctx, ret, ctx->args->small_prim_cull_info, 8 + GFX9_SGPR_SMALL_PRIM_CULL_INFO);
55 if (ctx->screen->info.gfx_level >= GFX11)
56 ret = si_insert_input_ptr(ctx, ret, ctx->args->gs_attr_address, 8 + GFX9_SGPR_ATTRIBUTE_RING_ADDR);
57 }
58
59 unsigned vgpr = 8 + GFX9_GS_NUM_USER_SGPR;
60
61 if (ctx->screen->info.gfx_level >= GFX12) {
62 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_vtx_offset[0], vgpr++);
63 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_prim_id, vgpr++);
64 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_vtx_offset[1], vgpr++);
65 } else {
66 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_vtx_offset[0], vgpr++);
67 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_vtx_offset[1], vgpr++);
68 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_prim_id, vgpr++);
69 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_invocation_id, vgpr++);
70 ret = si_insert_input_ret_float(ctx, ret, ctx->args->ac.gs_vtx_offset[2], vgpr++);
71 }
72 ctx->return_value = ret;
73 }
74
si_llvm_gs_build_end(struct si_shader_context * ctx)75 void si_llvm_gs_build_end(struct si_shader_context *ctx)
76 {
77 if (ctx->screen->info.gfx_level >= GFX9)
78 ac_build_endif(&ctx->ac, ctx->merged_wrap_if_label);
79 }
80