case nir_intrinsic_end_primitive_with_counter:
ctx->abi->emit_primitive(ctx->abi, nir_intrinsic_stream_id(instr));
break;
- case nir_intrinsic_load_tess_coord:
- result = ctx->abi->load_tess_coord(ctx->abi);
+ case nir_intrinsic_load_tess_coord: {
+ LLVMValueRef coord[] = {
+ ac_get_arg(&ctx->ac, ctx->args->tes_u),
+ ac_get_arg(&ctx->ac, ctx->args->tes_v),
+ ctx->ac.f32_0,
+ };
+
+ /* For triangles, the vector should be (u, v, 1-u-v). */
+ if (ctx->info->tess.primitive_mode == GL_TRIANGLES) {
+ coord[2] = LLVMBuildFSub(ctx->ac.builder, ctx->ac.f32_1,
+ LLVMBuildFAdd(ctx->ac.builder, coord[0], coord[1], ""), "");
+ }
+ result = ac_build_gather_values(&ctx->ac, coord, 3);
break;
+ }
case nir_intrinsic_load_tess_level_outer:
result = ctx->abi->load_tess_level(ctx->abi, VARYING_SLOT_TESS_LEVEL_OUTER, false);
break;
LLVMValueRef src, unsigned writemask,
unsigned component, unsigned location, unsigned driver_location);
- LLVMValueRef (*load_tess_coord)(struct ac_shader_abi *abi);
-
LLVMValueRef (*load_patch_vertices_in)(struct ac_shader_abi *abi);
LLVMValueRef (*load_ring_tess_offchip)(struct ac_shader_abi *abi);
}
static LLVMValueRef
-load_tess_coord(struct ac_shader_abi *abi)
-{
- struct radv_shader_context *ctx = radv_shader_context_from_abi(abi);
-
- LLVMValueRef coord[4] = {
- ac_get_arg(&ctx->ac, ctx->args->ac.tes_u),
- ac_get_arg(&ctx->ac, ctx->args->ac.tes_v),
- ctx->ac.f32_0,
- ctx->ac.f32_0,
- };
-
- if (ctx->shader->info.tess.primitive_mode == GL_TRIANGLES)
- coord[2] = LLVMBuildFSub(ctx->ac.builder, ctx->ac.f32_1,
- LLVMBuildFAdd(ctx->ac.builder, coord[0], coord[1], ""), "");
-
- return ac_build_gather_values(&ctx->ac, coord, 3);
-}
-
-static LLVMValueRef
load_ring_tess_factors(struct ac_shader_abi *abi)
{
struct radv_shader_context *ctx = radv_shader_context_from_abi(abi);
ctx.abi.emit_primitive = visit_end_primitive;
} else if (shaders[shader_idx]->info.stage == MESA_SHADER_TESS_EVAL) {
- ctx.abi.load_tess_coord = load_tess_coord;
} else if (shaders[shader_idx]->info.stage == MESA_SHADER_VERTEX) {
ctx.abi.load_base_vertex = radv_load_base_vertex;
ctx.abi.load_inputs = radv_load_vs_inputs;
}
}
-static LLVMValueRef si_load_tess_coord(struct ac_shader_abi *abi)
-{
- struct si_shader_context *ctx = si_shader_context_from_abi(abi);
- LLVMValueRef coord[4] = {ac_get_arg(&ctx->ac, ctx->args.tes_u),
- ac_get_arg(&ctx->ac, ctx->args.tes_v),
- ctx->ac.f32_0, ctx->ac.f32_0};
-
- /* For triangles, the vector should be (u, v, 1-u-v). */
- if (ctx->shader->selector->info.base.tess.primitive_mode == GL_TRIANGLES) {
- coord[2] = LLVMBuildFSub(ctx->ac.builder, ctx->ac.f32_1,
- LLVMBuildFAdd(ctx->ac.builder, coord[0], coord[1], ""), "");
- }
- return ac_build_gather_values(&ctx->ac, coord, 4);
-}
-
static LLVMValueRef load_tess_level(struct si_shader_context *ctx, unsigned semantic)
{
LLVMValueRef base, addr;
void si_llvm_init_tes_callbacks(struct si_shader_context *ctx, bool ngg_cull_shader)
{
ctx->abi.load_tess_varyings = si_nir_load_input_tes;
- ctx->abi.load_tess_coord = si_load_tess_coord;
ctx->abi.load_tess_level = si_load_tess_level;
ctx->abi.load_patch_vertices_in = si_load_patch_vertices_in;