radeonsi: replace llvm gs input handle with nir lowering

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16788>
This commit is contained in:
Qiang Yu 2022-05-30 20:09:49 +08:00
parent 36197b8dc0
commit 04b15f88e7
5 changed files with 4 additions and 91 deletions

View file

@ -3473,13 +3473,6 @@ static LLVMValueRef visit_load(struct ac_nir_context *ctx, nir_intrinsic_instr *
/* No indirect indexing is allowed after this point. */
assert(!indir_index);
if (ctx->stage == MESA_SHADER_GEOMETRY) {
assert(nir_src_is_const(*vertex_index_src));
return ctx->abi->load_inputs(ctx->abi, base, component, count,
nir_src_as_uint(*vertex_index_src), component_type);
}
if (ctx->stage == MESA_SHADER_FRAGMENT && is_output &&
nir_intrinsic_io_semantics(instr).fb_fetch_output)
return ctx->abi->emit_fbfetch(ctx->abi);

View file

@ -1539,6 +1539,10 @@ static bool si_lower_io_to_mem(struct si_shader *shader, nir_shader *nir,
}
return true;
} else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
NIR_PASS_V(nir, ac_nir_lower_gs_inputs_to_mem, si_map_io_driver_location,
sel->screen->info.gfx_level, key->ge.mono.u.gs_tri_strip_adj_fix);
return true;
}
return false;

View file

@ -136,9 +136,6 @@ struct si_shader_context {
struct ac_llvm_compiler *compiler;
/* GS vertex offsets unpacked with the gfx6-9 tristrip_adj bug workaround. */
LLVMValueRef gs_vtx_offset[6];
/* Preloaded descriptors. */
LLVMValueRef esgs_ring;
LLVMValueRef gsvs_ring[4];

View file

@ -1046,33 +1046,6 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad
}
}
if (nir->info.stage == MESA_SHADER_GEOMETRY) {
/* Unpack GS vertex offsets. */
for (unsigned i = 0; i < 6; i++) {
if (ctx->screen->info.gfx_level >= GFX9) {
ctx->gs_vtx_offset[i] = si_unpack_param(ctx, ctx->args.gs_vtx_offset[i / 2], (i & 1) * 16, 16);
} else {
ctx->gs_vtx_offset[i] = ac_get_arg(&ctx->ac, ctx->args.gs_vtx_offset[i]);
}
}
/* Apply the hw bug workaround for triangle strips with adjacency. */
if (ctx->screen->info.gfx_level <= GFX9 &&
ctx->shader->key.ge.mono.u.gs_tri_strip_adj_fix) {
LLVMValueRef prim_id = ac_get_arg(&ctx->ac, ctx->args.gs_prim_id);
/* Remap GS vertex offsets for every other primitive. */
LLVMValueRef rotate = LLVMBuildTrunc(ctx->ac.builder, prim_id, ctx->ac.i1, "");
LLVMValueRef fixed[6];
for (unsigned i = 0; i < 6; i++) {
fixed[i] = LLVMBuildSelect(ctx->ac.builder, rotate,
ctx->gs_vtx_offset[(i + 4) % 6],
ctx->gs_vtx_offset[i], "");
}
memcpy(ctx->gs_vtx_offset, fixed, sizeof(fixed));
}
}
ctx->abi.clamp_shadow_reference = true;
ctx->abi.robust_buffer_access = true;
ctx->abi.convert_undef_to_zero = true;

View file

@ -43,59 +43,6 @@ LLVMValueRef si_is_gs_thread(struct si_shader_context *ctx)
si_unpack_param(ctx, ctx->args.merged_wave_info, 8, 8), "");
}
static LLVMValueRef si_llvm_load_input_gs(struct ac_shader_abi *abi, unsigned input_index,
unsigned vtx_offset_param, LLVMTypeRef type,
unsigned swizzle)
{
struct si_shader_context *ctx = si_shader_context_from_abi(abi);
struct si_shader *shader = ctx->shader;
LLVMValueRef vtx_offset, soffset;
struct si_shader_info *info = &shader->selector->info;
unsigned param;
LLVMValueRef value;
param = si_shader_io_get_unique_index(info->input[input_index].semantic, false);
/* GFX9 has the ESGS ring in LDS. */
if (ctx->screen->info.gfx_level >= GFX9) {
unsigned offset = param * 4 + swizzle;
vtx_offset = LLVMBuildAdd(ctx->ac.builder, ctx->gs_vtx_offset[vtx_offset_param],
LLVMConstInt(ctx->ac.i32, offset, false), "");
LLVMValueRef ptr = ac_build_gep0(&ctx->ac, ctx->esgs_ring, vtx_offset);
LLVMValueRef value = LLVMBuildLoad(ctx->ac.builder, ptr, "");
return LLVMBuildBitCast(ctx->ac.builder, value, type, "");
}
/* GFX6: input load from the ESGS ring in memory. */
/* Get the vertex offset parameter on GFX6. */
vtx_offset = LLVMBuildMul(ctx->ac.builder, ctx->gs_vtx_offset[vtx_offset_param],
LLVMConstInt(ctx->ac.i32, 4, 0), "");
soffset = LLVMConstInt(ctx->ac.i32, (param * 4 + swizzle) * 256, 0);
value = ac_build_buffer_load(&ctx->ac, ctx->esgs_ring, 1, ctx->ac.i32_0, vtx_offset, soffset,
ctx->ac.f32, ac_glc, true, false);
return LLVMBuildBitCast(ctx->ac.builder, value, type, "");
}
static LLVMValueRef si_nir_load_input_gs(struct ac_shader_abi *abi,
unsigned driver_location, unsigned component,
unsigned num_components, unsigned vertex_index,
LLVMTypeRef type)
{
struct si_shader_context *ctx = si_shader_context_from_abi(abi);
LLVMValueRef value[4];
for (unsigned i = component; i < component + num_components; i++) {
value[i] = si_llvm_load_input_gs(&ctx->abi, driver_location,
vertex_index, type, i);
}
return ac_build_varying_gather_values(&ctx->ac, value, num_components, component);
}
/* Pass GS inputs from ES to GS on GFX9. */
static void si_set_es_return_value_for_gs(struct si_shader_context *ctx)
{
@ -591,7 +538,6 @@ struct si_shader *si_generate_gs_copy_shader(struct si_screen *sscreen,
void si_llvm_init_gs_callbacks(struct si_shader_context *ctx)
{
ctx->abi.load_inputs = si_nir_load_input_gs;
ctx->abi.emit_vertex = si_llvm_emit_vertex;
ctx->abi.emit_primitive = si_llvm_emit_primitive;
}