radeonsi: implement nir_intrinsic_load_num_vertices_per_primitive_amd

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17456>
This commit is contained in:
Qiang Yu
2022-06-30 17:28:46 +08:00
committed by Marge Bot
parent 540e695b29
commit 8049edb653
2 changed files with 35 additions and 0 deletions
+1
View File
@@ -3605,6 +3605,7 @@ 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_num_vertices_per_primitive_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:
@@ -30,6 +30,7 @@
#include "sid.h"
#include "tgsi/tgsi_from_mesa.h"
#include "util/u_memory.h"
#include "util/u_prim.h"
struct si_llvm_diagnostics {
struct util_debug_callback *debug;
@@ -717,6 +718,36 @@ void si_build_wrapper_function(struct si_shader_context *ctx, LLVMValueRef *part
LLVMBuildRet(builder, ret);
}
static LLVMValueRef si_get_num_vertices_per_prim(struct si_shader_context *ctx)
{
const struct si_shader_info *info = &ctx->shader->selector->info;
unsigned num_vertices;
if (ctx->stage == MESA_SHADER_GEOMETRY) {
num_vertices = u_vertices_per_prim(info->base.gs.output_primitive);
} else if (ctx->stage == MESA_SHADER_VERTEX) {
if (info->base.vs.blit_sgprs_amd) {
num_vertices = 3;
} else if (ctx->shader->key.ge.opt.ngg_culling & SI_NGG_CULL_LINES) {
num_vertices = 2;
} else {
/* Extract OUTPRIM field. */
LLVMValueRef num = GET_FIELD(ctx, GS_STATE_OUTPRIM);
return LLVMBuildAdd(ctx->ac.builder, num, ctx->ac.i32_1, "");
}
} else {
assert(ctx->stage == MESA_SHADER_TESS_EVAL);
if (info->base.tess.point_mode)
num_vertices = 1;
else if (info->base.tess._primitive_mode == TESS_PRIMITIVE_ISOLINES)
num_vertices = 2;
else
num_vertices = 3;
}
return LLVMConstInt(ctx->ac.i32, num_vertices, false);
}
static LLVMValueRef si_llvm_load_intrinsic(struct ac_shader_abi *abi, nir_intrinsic_op op)
{
struct si_shader_context *ctx = si_shader_context_from_abi(abi);
@@ -813,6 +844,9 @@ 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_num_vertices_per_primitive_amd:
return si_get_num_vertices_per_prim(ctx);
case nir_intrinsic_load_cull_ccw_amd:
/* radeonsi embed cw/ccw info into front/back face enabled */
return ctx->ac.i1false;