amd: lower load_first_vertex/base_instance/draw_id/view_index in NIR
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32782>
This commit is contained in:
@@ -220,6 +220,18 @@ lower_intrinsic_to_arg(nir_builder *b, nir_instr *instr, void *state)
|
|||||||
replacement = ac_nir_load_arg(b, s->args, s->args->local_invocation_ids);
|
replacement = ac_nir_load_arg(b, s->args, s->args->local_invocation_ids);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case nir_intrinsic_load_first_vertex:
|
||||||
|
replacement = ac_nir_load_arg(b, s->args, s->args->base_vertex);
|
||||||
|
break;
|
||||||
|
case nir_intrinsic_load_base_instance:
|
||||||
|
replacement = ac_nir_load_arg(b, s->args, s->args->start_instance);
|
||||||
|
break;
|
||||||
|
case nir_intrinsic_load_draw_id:
|
||||||
|
replacement = ac_nir_load_arg(b, s->args, s->args->draw_id);
|
||||||
|
break;
|
||||||
|
case nir_intrinsic_load_view_index:
|
||||||
|
replacement = ac_nir_load_arg(b, s->args, s->args->view_index);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -8126,11 +8126,6 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
|
|||||||
bld.copy(Definition(get_ssa_temp(ctx, &instr->def)), get_arg(ctx, ctx->args->front_face));
|
bld.copy(Definition(get_ssa_temp(ctx, &instr->def)), get_arg(ctx, ctx->args->front_face));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case nir_intrinsic_load_view_index: {
|
|
||||||
Temp dst = get_ssa_temp(ctx, &instr->def);
|
|
||||||
bld.copy(Definition(dst), Operand(get_arg(ctx, ctx->args->view_index)));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case nir_intrinsic_load_frag_shading_rate:
|
case nir_intrinsic_load_frag_shading_rate:
|
||||||
emit_load_frag_shading_rate(ctx, get_ssa_temp(ctx, &instr->def));
|
emit_load_frag_shading_rate(ctx, get_ssa_temp(ctx, &instr->def));
|
||||||
break;
|
break;
|
||||||
@@ -9009,26 +9004,11 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr)
|
|||||||
bld.copy(Definition(dst), get_arg(ctx, ctx->args->vertex_id));
|
bld.copy(Definition(dst), get_arg(ctx, ctx->args->vertex_id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case nir_intrinsic_load_first_vertex: {
|
|
||||||
Temp dst = get_ssa_temp(ctx, &instr->def);
|
|
||||||
bld.copy(Definition(dst), get_arg(ctx, ctx->args->base_vertex));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case nir_intrinsic_load_base_instance: {
|
|
||||||
Temp dst = get_ssa_temp(ctx, &instr->def);
|
|
||||||
bld.copy(Definition(dst), get_arg(ctx, ctx->args->start_instance));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case nir_intrinsic_load_instance_id: {
|
case nir_intrinsic_load_instance_id: {
|
||||||
Temp dst = get_ssa_temp(ctx, &instr->def);
|
Temp dst = get_ssa_temp(ctx, &instr->def);
|
||||||
bld.copy(Definition(dst), get_arg(ctx, ctx->args->instance_id));
|
bld.copy(Definition(dst), get_arg(ctx, ctx->args->instance_id));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case nir_intrinsic_load_draw_id: {
|
|
||||||
Temp dst = get_ssa_temp(ctx, &instr->def);
|
|
||||||
bld.copy(Definition(dst), get_arg(ctx, ctx->args->draw_id));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case nir_intrinsic_load_invocation_id: {
|
case nir_intrinsic_load_invocation_id: {
|
||||||
Temp dst = get_ssa_temp(ctx, &instr->def);
|
Temp dst = get_ssa_temp(ctx, &instr->def);
|
||||||
|
|
||||||
|
@@ -529,8 +529,6 @@ init_context(isel_context* ctx, nir_shader* shader)
|
|||||||
case nir_intrinsic_load_sbt_base_amd:
|
case nir_intrinsic_load_sbt_base_amd:
|
||||||
case nir_intrinsic_load_subgroup_id:
|
case nir_intrinsic_load_subgroup_id:
|
||||||
case nir_intrinsic_load_num_subgroups:
|
case nir_intrinsic_load_num_subgroups:
|
||||||
case nir_intrinsic_load_first_vertex:
|
|
||||||
case nir_intrinsic_load_base_instance:
|
|
||||||
case nir_intrinsic_vote_all:
|
case nir_intrinsic_vote_all:
|
||||||
case nir_intrinsic_vote_any:
|
case nir_intrinsic_vote_any:
|
||||||
case nir_intrinsic_read_first_invocation:
|
case nir_intrinsic_read_first_invocation:
|
||||||
@@ -623,12 +621,7 @@ init_context(isel_context* ctx, nir_shader* shader)
|
|||||||
case nir_intrinsic_ddx_fine:
|
case nir_intrinsic_ddx_fine:
|
||||||
case nir_intrinsic_ddy_fine:
|
case nir_intrinsic_ddy_fine:
|
||||||
case nir_intrinsic_ddx_coarse:
|
case nir_intrinsic_ddx_coarse:
|
||||||
case nir_intrinsic_ddy_coarse:
|
case nir_intrinsic_ddy_coarse: type = RegType::vgpr; break;
|
||||||
type = RegType::vgpr;
|
|
||||||
break;
|
|
||||||
case nir_intrinsic_load_view_index:
|
|
||||||
type = ctx->stage == fragment_fs ? RegType::vgpr : RegType::sgpr;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
for (unsigned i = 0; i < nir_intrinsic_infos[intrinsic->intrinsic].num_srcs;
|
for (unsigned i = 0; i < nir_intrinsic_infos[intrinsic->intrinsic].num_srcs;
|
||||||
i++) {
|
i++) {
|
||||||
|
@@ -2945,8 +2945,6 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
|
|||||||
unreachable("invalid stage");
|
unreachable("invalid stage");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_load_base_vertex:
|
|
||||||
case nir_intrinsic_load_first_vertex:
|
|
||||||
case nir_intrinsic_load_ring_attr_amd:
|
case nir_intrinsic_load_ring_attr_amd:
|
||||||
case nir_intrinsic_load_lds_ngg_scratch_base_amd:
|
case nir_intrinsic_load_lds_ngg_scratch_base_amd:
|
||||||
case nir_intrinsic_load_lds_ngg_gs_out_vertex_base_amd:
|
case nir_intrinsic_load_lds_ngg_gs_out_vertex_base_amd:
|
||||||
@@ -2955,15 +2953,6 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
|
|||||||
case nir_intrinsic_load_vertex_id_zero_base:
|
case nir_intrinsic_load_vertex_id_zero_base:
|
||||||
result = ctx->abi->vertex_id_replaced ? ctx->abi->vertex_id_replaced : ctx->abi->vertex_id;
|
result = ctx->abi->vertex_id_replaced ? ctx->abi->vertex_id_replaced : ctx->abi->vertex_id;
|
||||||
break;
|
break;
|
||||||
case nir_intrinsic_load_base_instance:
|
|
||||||
result = ac_get_arg(&ctx->ac, ctx->args->start_instance);
|
|
||||||
break;
|
|
||||||
case nir_intrinsic_load_draw_id:
|
|
||||||
result = ac_get_arg(&ctx->ac, ctx->args->draw_id);
|
|
||||||
break;
|
|
||||||
case nir_intrinsic_load_view_index:
|
|
||||||
result = ac_get_arg(&ctx->ac, ctx->args->view_index);
|
|
||||||
break;
|
|
||||||
case nir_intrinsic_load_invocation_id:
|
case nir_intrinsic_load_invocation_id:
|
||||||
assert(ctx->stage == MESA_SHADER_TESS_CTRL || ctx->stage == MESA_SHADER_GEOMETRY);
|
assert(ctx->stage == MESA_SHADER_TESS_CTRL || ctx->stage == MESA_SHADER_GEOMETRY);
|
||||||
if (ctx->stage == MESA_SHADER_TESS_CTRL) {
|
if (ctx->stage == MESA_SHADER_TESS_CTRL) {
|
||||||
|
@@ -215,18 +215,6 @@ declare_esgs_ring(struct radv_shader_context *ctx)
|
|||||||
LLVMSetAlignment(esgs_ring, 64 * 1024);
|
LLVMSetAlignment(esgs_ring, 64 * 1024);
|
||||||
}
|
}
|
||||||
|
|
||||||
static LLVMValueRef
|
|
||||||
radv_intrinsic_load(struct ac_shader_abi *abi, nir_intrinsic_instr *intrin)
|
|
||||||
{
|
|
||||||
switch (intrin->intrinsic) {
|
|
||||||
case nir_intrinsic_load_base_vertex:
|
|
||||||
case nir_intrinsic_load_first_vertex:
|
|
||||||
return radv_load_base_vertex(abi, intrin->intrinsic == nir_intrinsic_load_base_vertex);
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static LLVMModuleRef
|
static LLVMModuleRef
|
||||||
ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, const struct radv_nir_compiler_options *options,
|
ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, const struct radv_nir_compiler_options *options,
|
||||||
const struct radv_shader_info *info, struct nir_shader *const *shaders, int shader_count,
|
const struct radv_shader_info *info, struct nir_shader *const *shaders, int shader_count,
|
||||||
@@ -280,7 +268,6 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm, const struct radv_nir
|
|||||||
|
|
||||||
create_function(&ctx, shaders[shader_count - 1]->info.stage, shader_count >= 2);
|
create_function(&ctx, shaders[shader_count - 1]->info.stage, shader_count >= 2);
|
||||||
|
|
||||||
ctx.abi.intrinsic_load = radv_intrinsic_load;
|
|
||||||
ctx.abi.load_ubo = radv_load_ubo;
|
ctx.abi.load_ubo = radv_load_ubo;
|
||||||
ctx.abi.load_ssbo = radv_load_ssbo;
|
ctx.abi.load_ssbo = radv_load_ssbo;
|
||||||
ctx.abi.load_sampler_desc = radv_get_sampler_desc;
|
ctx.abi.load_sampler_desc = radv_get_sampler_desc;
|
||||||
|
@@ -294,9 +294,6 @@ static bool lower_intrinsic(nir_builder *b, nir_instr *instr, struct lower_abi_s
|
|||||||
nir_def *replacement = NULL;
|
nir_def *replacement = NULL;
|
||||||
|
|
||||||
switch (intrin->intrinsic) {
|
switch (intrin->intrinsic) {
|
||||||
case nir_intrinsic_load_first_vertex:
|
|
||||||
replacement = ac_nir_load_arg(b, &args->ac, args->ac.base_vertex);
|
|
||||||
break;
|
|
||||||
case nir_intrinsic_load_base_vertex: {
|
case nir_intrinsic_load_base_vertex: {
|
||||||
nir_def *indexed = GET_FIELD_NIR(VS_STATE_INDEXED);
|
nir_def *indexed = GET_FIELD_NIR(VS_STATE_INDEXED);
|
||||||
indexed = nir_i2b(b, indexed);
|
indexed = nir_i2b(b, indexed);
|
||||||
|
Reference in New Issue
Block a user