From 5c4f737b84bc42392475987b96306c7a70cbc555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 3 Jan 2025 00:34:14 -0500 Subject: [PATCH] aco: implement replacing frag_coord with pixel_coord in PS prolog MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds an option to replace frag_coord.xy with pixel_coord when sample shading is disabled, which is most of the time. This reduces the number of input VGPRs. It's already implement in ac_nir_lower_ps_early for monolithic shaders. Reviewed-by: Timur Kristóf Part-of: --- .../compiler/aco_instruction_selection.cpp | 29 ++++++++++++++++++- src/amd/compiler/aco_shader_info.h | 2 ++ 2 files changed, 30 insertions(+), 1 deletion(-) 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];