xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
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