radeonsi: implement cull nir intrinsics

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/17455>
This commit is contained in:
Qiang Yu
2022-06-07 11:50:21 +08:00
committed by Marge Bot
parent 7a166ba3f2
commit 463c4c55a7
2 changed files with 45 additions and 0 deletions
+6
View File
@@ -3612,6 +3612,12 @@ static bool visit_intrinsic(struct ac_nir_context *ctx, nir_intrinsic_instr *ins
case nir_intrinsic_load_tcs_num_patches_amd:
case nir_intrinsic_load_hs_out_patch_data_offset_amd:
case nir_intrinsic_load_clip_half_line_width_amd:
case nir_intrinsic_load_cull_ccw_amd:
case nir_intrinsic_load_cull_any_enabled_amd:
case nir_intrinsic_load_cull_back_face_enabled_amd:
case nir_intrinsic_load_cull_front_face_enabled_amd:
case nir_intrinsic_load_cull_small_prim_precision_amd:
case nir_intrinsic_load_cull_small_primitives_enabled_amd:
result = ctx->abi->intrinsic_load(ctx->abi, instr->intrinsic);
break;
case nir_intrinsic_load_vertex_id_zero_base: {
@@ -811,6 +811,45 @@ static LLVMValueRef si_llvm_load_intrinsic(struct ac_shader_abi *abi, nir_intrin
return LLVMBuildBitCast(ctx->ac.builder, terms, ctx->ac.v4f32, "");
}
case nir_intrinsic_load_cull_ccw_amd:
/* radeonsi embed cw/ccw info into front/back face enabled */
return ctx->ac.i1false;
case nir_intrinsic_load_cull_any_enabled_amd:
return ctx->shader->key.ge.opt.ngg_culling ? ctx->ac.i1true : ctx->ac.i1false;
case nir_intrinsic_load_cull_back_face_enabled_amd:
return ctx->shader->key.ge.opt.ngg_culling & SI_NGG_CULL_BACK_FACE ?
ctx->ac.i1true : ctx->ac.i1false;
case nir_intrinsic_load_cull_front_face_enabled_amd:
return ctx->shader->key.ge.opt.ngg_culling & SI_NGG_CULL_FRONT_FACE ?
ctx->ac.i1true : ctx->ac.i1false;
case nir_intrinsic_load_cull_small_prim_precision_amd: {
LLVMValueRef small_prim_precision =
ctx->shader->key.ge.opt.ngg_culling & SI_NGG_CULL_LINES ?
GET_FIELD(ctx, GS_STATE_SMALL_PRIM_PRECISION_NO_AA) :
GET_FIELD(ctx, GS_STATE_SMALL_PRIM_PRECISION);
/* Extract the small prim precision. */
small_prim_precision =
LLVMBuildOr(ctx->ac.builder, small_prim_precision,
LLVMConstInt(ctx->ac.i32, 0x70, 0), "");
small_prim_precision =
LLVMBuildShl(ctx->ac.builder, small_prim_precision,
LLVMConstInt(ctx->ac.i32, 23, 0), "");
return LLVMBuildBitCast(ctx->ac.builder, small_prim_precision, ctx->ac.f32, "");
}
case nir_intrinsic_load_cull_small_primitives_enabled_amd:
if (ctx->shader->key.ge.opt.ngg_culling & SI_NGG_CULL_LINES)
return ctx->shader->key.ge.opt.ngg_culling & SI_NGG_CULL_SMALL_LINES_DIAMOND_EXIT ?
ctx->ac.i1true : ctx->ac.i1false;
else
return ctx->ac.i1true;
default:
return NULL;
}