intrin == nir_intrinsic_load_barycentric_at_offset) {
return get_arg(ctx, linear ? ctx->args->linear_center : ctx->args->persp_center);
} else if (intrin == nir_intrinsic_load_barycentric_centroid) {
- return linear ? ctx->linear_centroid : ctx->persp_centroid;
+ return get_arg(ctx, linear ? ctx->args->linear_centroid : ctx->args->persp_centroid);
} else {
assert(intrin == nir_intrinsic_load_barycentric_sample);
return get_arg(ctx, linear ? ctx->args->linear_sample : ctx->args->persp_sample);
}
void
-handle_bc_optimize(isel_context* ctx)
-{
- /* needed when SPI_PS_IN_CONTROL.BC_OPTIMIZE_DISABLE is set to 0 */
- Builder bld(ctx->program, ctx->block);
- uint32_t spi_ps_input_ena = ctx->program->config->spi_ps_input_ena;
- bool uses_center =
- G_0286CC_PERSP_CENTER_ENA(spi_ps_input_ena) || G_0286CC_LINEAR_CENTER_ENA(spi_ps_input_ena);
- bool uses_persp_centroid = G_0286CC_PERSP_CENTROID_ENA(spi_ps_input_ena);
- bool uses_linear_centroid = G_0286CC_LINEAR_CENTROID_ENA(spi_ps_input_ena);
-
- if (uses_persp_centroid)
- ctx->persp_centroid = get_arg(ctx, ctx->args->persp_centroid);
- if (uses_linear_centroid)
- ctx->linear_centroid = get_arg(ctx, ctx->args->linear_centroid);
-
- if (uses_center && (uses_persp_centroid || uses_linear_centroid)) {
- Temp sel = bld.vopc_e64(aco_opcode::v_cmp_lt_i32, bld.def(bld.lm),
- get_arg(ctx, ctx->args->prim_mask), Operand::zero());
-
- if (uses_persp_centroid) {
- Temp new_coord[2];
- for (unsigned i = 0; i < 2; i++) {
- Temp persp_centroid =
- emit_extract_vector(ctx, get_arg(ctx, ctx->args->persp_centroid), i, v1);
- Temp persp_center =
- emit_extract_vector(ctx, get_arg(ctx, ctx->args->persp_center), i, v1);
- new_coord[i] =
- bld.vop2(aco_opcode::v_cndmask_b32, bld.def(v1), persp_centroid, persp_center, sel);
- }
- ctx->persp_centroid = bld.tmp(v2);
- bld.pseudo(aco_opcode::p_create_vector, Definition(ctx->persp_centroid),
- Operand(new_coord[0]), Operand(new_coord[1]));
- emit_split_vector(ctx, ctx->persp_centroid, 2);
- }
-
- if (uses_linear_centroid) {
- Temp new_coord[2];
- for (unsigned i = 0; i < 2; i++) {
- Temp linear_centroid =
- emit_extract_vector(ctx, get_arg(ctx, ctx->args->linear_centroid), i, v1);
- Temp linear_center =
- emit_extract_vector(ctx, get_arg(ctx, ctx->args->linear_center), i, v1);
- new_coord[i] = bld.vop2(aco_opcode::v_cndmask_b32, bld.def(v1), linear_centroid,
- linear_center, sel);
- }
- ctx->linear_centroid = bld.tmp(v2);
- bld.pseudo(aco_opcode::p_create_vector, Definition(ctx->linear_centroid),
- Operand(new_coord[0]), Operand(new_coord[1]));
- emit_split_vector(ctx, ctx->linear_centroid, 2);
- }
- }
-}
-
-void
setup_fp_mode(isel_context* ctx, nir_shader* shader)
{
Program* program = ctx->program;
} else if (ctx.stage == geometry_gs)
ctx.gs_wave_id = get_arg(&ctx, args->gs_wave_id);
- if (ctx.stage == fragment_fs)
- handle_bc_optimize(&ctx);
-
visit_cf_list(&ctx, &func->body);
if (nir->info.stage == MESA_SHADER_GEOMETRY && !ngg_gs) {
Temp arg_temps[AC_MAX_ARGS];
- /* FS inputs */
- Temp persp_centroid, linear_centroid;
-
/* GS inputs */
Temp gs_wave_id;
if (location == INTERP_CENTER)
return ac_get_arg(&ctx->ac, ctx->args->persp_center);
else if (location == INTERP_CENTROID)
- return ctx->abi->persp_centroid;
+ return ac_get_arg(&ctx->ac, ctx->args->persp_centroid);
else if (location == INTERP_SAMPLE)
return ac_get_arg(&ctx->ac, ctx->args->persp_sample);
break;
if (location == INTERP_CENTER)
return ac_get_arg(&ctx->ac, ctx->args->linear_center);
else if (location == INTERP_CENTROID)
- return ctx->abi->linear_centroid;
+ return ac_get_arg(&ctx->ac, ctx->args->linear_centroid);
else if (location == INTERP_SAMPLE)
return ac_get_arg(&ctx->ac, ctx->args->linear_sample);
break;
LLVMValueRef vertex_id;
LLVMValueRef vs_rel_patch_id;
LLVMValueRef instance_id;
- LLVMValueRef persp_centroid, linear_centroid;
LLVMValueRef user_data;
/* replaced registers when culling enabled */
}
static void
-prepare_interp_optimize(struct radv_shader_context *ctx, struct nir_shader *nir)
-{
- bool uses_center = false;
- bool uses_centroid = false;
- nir_foreach_shader_in_variable (variable, nir) {
- if (glsl_get_base_type(glsl_without_array(variable->type)) != GLSL_TYPE_FLOAT ||
- variable->data.sample)
- continue;
-
- if (variable->data.centroid)
- uses_centroid = true;
- else
- uses_center = true;
- }
-
- ctx->abi.persp_centroid = ac_get_arg(&ctx->ac, ctx->args->ac.persp_centroid);
- ctx->abi.linear_centroid = ac_get_arg(&ctx->ac, ctx->args->ac.linear_centroid);
-
- if (uses_center && uses_centroid) {
- LLVMValueRef sel =
- LLVMBuildICmp(ctx->ac.builder, LLVMIntSLT, ac_get_arg(&ctx->ac, ctx->args->ac.prim_mask),
- ctx->ac.i32_0, "");
- ctx->abi.persp_centroid =
- LLVMBuildSelect(ctx->ac.builder, sel, ac_get_arg(&ctx->ac, ctx->args->ac.persp_center),
- ctx->abi.persp_centroid, "");
- ctx->abi.linear_centroid =
- LLVMBuildSelect(ctx->ac.builder, sel, ac_get_arg(&ctx->ac, ctx->args->ac.linear_center),
- ctx->abi.linear_centroid, "");
- }
-}
-
-static void
scan_shader_output_decl(struct radv_shader_context *ctx, struct nir_variable *variable,
struct nir_shader *shader, gl_shader_stage stage)
{
LLVMPositionBuilderAtEnd(ctx.ac.builder, then_block);
}
- if (shaders[shader_idx]->info.stage == MESA_SHADER_FRAGMENT)
- prepare_interp_optimize(&ctx, shaders[shader_idx]);
- else if (shaders[shader_idx]->info.stage == MESA_SHADER_GEOMETRY && !info->is_ngg)
+ if (shaders[shader_idx]->info.stage == MESA_SHADER_GEOMETRY && !info->is_ngg)
prepare_gs_input_vgprs(&ctx, shader_count >= 2);
if (!ac_nir_translate(&ctx.ac, &ctx.abi, &args->ac, shaders[shader_idx])) {
.enable_mrt_output_nan_fixup = pipeline_key->ps.epilog.enable_mrt_output_nan_fixup,
.no_color_export = stage->info.ps.has_epilog,
+
+ .bc_optimize_for_persp =
+ stage->info.ps.reads_persp_center && stage->info.ps.reads_persp_centroid,
+ .bc_optimize_for_linear =
+ stage->info.ps.reads_linear_center && stage->info.ps.reads_linear_centroid,
};
NIR_PASS_V(stage->nir, ac_nir_lower_ps, &options);
*/
if (shader->is_monolithic && shader->key.ge.part.vs.prolog.ls_vgpr_fix)
ac_fixup_ls_hs_input_vgprs(&ctx->ac, &ctx->abi, &ctx->args->ac);
- } else if (ctx->stage == MESA_SHADER_FRAGMENT) {
- ctx->abi.persp_centroid = ac_get_arg(&ctx->ac, ctx->args->ac.persp_centroid);
- ctx->abi.linear_centroid = ac_get_arg(&ctx->ac, ctx->args->ac.linear_centroid);
}
}