diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index dc1fc21af74..973ea15f56a 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -11660,6 +11660,33 @@ overwrite_samplemask_arg(isel_context* ctx, const struct aco_ps_prolog_info* fin } } +void +overwrite_pos_xy_args(isel_context* ctx, const struct aco_ps_prolog_info* finfo) +{ + if (!finfo->get_frag_coord_from_pixel_coord) + return; + + Builder bld(ctx->program, ctx->block); + Temp pos_fixed_pt = get_arg(ctx, ctx->args->pos_fixed_pt); + + for (unsigned i = 0; i < 2; i++) { + if (!ctx->args->frag_pos[i].used) + continue; + + Temp t; + if (i) + t = bld.vop2(aco_opcode::v_lshrrev_b32, bld.def(v1), Operand::c32(16), pos_fixed_pt); + else + t = bld.vop2(aco_opcode::v_and_b32, bld.def(v1), Operand::c32(0xffff), pos_fixed_pt); + + t = bld.vop1(aco_opcode::v_cvt_f32_u32, bld.def(v1), t); + if (!finfo->pixel_center_integer) + t = bld.vop2(aco_opcode::v_add_f32, bld.def(v1), Operand::c32(0x3f000000 /*0.5*/), t); + + ctx->arg_temps[ctx->args->frag_pos[i].arg_index] = t; + } +} + Temp get_interp_color(isel_context* ctx, int interp_vgpr, unsigned attr_index, unsigned comp) { @@ -13216,8 +13243,8 @@ select_ps_prolog(Program* program, void* pinfo, ac_shader_config* config, emit_polygon_stipple(&ctx, finfo); overwrite_interp_args(&ctx, finfo); - overwrite_samplemask_arg(&ctx, finfo); + overwrite_pos_xy_args(&ctx, finfo); std::vector regs; passthrough_all_args(&ctx, regs); diff --git a/src/amd/compiler/aco_shader_info.h b/src/amd/compiler/aco_shader_info.h index e749b317933..49f172f0bd5 100644 --- a/src/amd/compiler/aco_shader_info.h +++ b/src/amd/compiler/aco_shader_info.h @@ -92,6 +92,8 @@ struct aco_ps_prolog_info { bool force_linear_center_interp; unsigned samplemask_log_ps_iter; + bool get_frag_coord_from_pixel_coord; + bool pixel_center_integer; unsigned num_interp_inputs; unsigned colors_read; int color_interp_vgpr_index[2];