From e49f29f25e6fc7d488ac1c383f357425e084e587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 29 Apr 2026 05:41:53 -0400 Subject: [PATCH] nir: add frag_coord_xy to strengthen and simplify pixel_coord lowering Reviewed-by: Georg Lehmann Acked-by: Pierre-Eric Pelloux-Prayer Reviewed-by: Emma Anholt Part-of: --- src/compiler/nir/nir.c | 14 ++++++++++++-- src/compiler/nir/nir_divergence_analysis.c | 1 + src/compiler/nir/nir_gather_info.c | 1 + src/compiler/nir/nir_intrinsics.py | 2 ++ src/compiler/nir/nir_opt_peephole_select.c | 1 + src/compiler/nir/nir_opt_sink.c | 1 + src/compiler/shader_enums.c | 1 + src/compiler/shader_enums.h | 1 + 8 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index a77820d115d..6f2d991e2d6 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2435,6 +2435,12 @@ nir_intrinsic_from_system_value(gl_system_value val) return nir_intrinsic_load_invocation_id; case SYSTEM_VALUE_FRAG_COORD: return nir_intrinsic_load_frag_coord; + case SYSTEM_VALUE_FRAG_COORD_XY: + return nir_intrinsic_load_frag_coord_xy; + case SYSTEM_VALUE_FRAG_COORD_Z: + return nir_intrinsic_load_frag_coord_z; + case SYSTEM_VALUE_FRAG_COORD_W: + return nir_intrinsic_load_frag_coord_w; case SYSTEM_VALUE_PIXEL_COORD: return nir_intrinsic_load_pixel_coord; case SYSTEM_VALUE_POINT_COORD: @@ -2615,9 +2621,13 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin) case nir_intrinsic_load_invocation_id: return SYSTEM_VALUE_INVOCATION_ID; case nir_intrinsic_load_frag_coord: - case nir_intrinsic_load_frag_coord_z: - case nir_intrinsic_load_frag_coord_w: return SYSTEM_VALUE_FRAG_COORD; + case nir_intrinsic_load_frag_coord_xy: + return SYSTEM_VALUE_FRAG_COORD_XY; + case nir_intrinsic_load_frag_coord_z: + return SYSTEM_VALUE_FRAG_COORD_Z; + case nir_intrinsic_load_frag_coord_w: + return SYSTEM_VALUE_FRAG_COORD_W; case nir_intrinsic_load_pixel_coord: return SYSTEM_VALUE_PIXEL_COORD; case nir_intrinsic_load_point_coord: diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 9d8ea263c6b..f11b4d62f0d 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -867,6 +867,7 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_load_point_coord: case nir_intrinsic_load_line_coord: case nir_intrinsic_load_frag_coord: + case nir_intrinsic_load_frag_coord_xy: case nir_intrinsic_load_frag_coord_z: case nir_intrinsic_load_frag_coord_w: case nir_intrinsic_load_frag_coord_w_rcp: diff --git a/src/compiler/nir/nir_gather_info.c b/src/compiler/nir/nir_gather_info.c index 25a14b977b0..5443adf8b4e 100644 --- a/src/compiler/nir/nir_gather_info.c +++ b/src/compiler/nir/nir_gather_info.c @@ -724,6 +724,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader) case nir_intrinsic_load_invocation_id: case nir_intrinsic_load_frag_coord: case nir_intrinsic_load_pixel_coord: + case nir_intrinsic_load_frag_coord_xy: case nir_intrinsic_load_frag_coord_z: case nir_intrinsic_load_frag_coord_w: case nir_intrinsic_load_frag_coord_w_rcp: diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 1a7b029a3b6..47a33c7aae7 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -978,6 +978,8 @@ def system_value(name, dest_comp, indices=[], bit_sizes=[32], can_reorder=True): bit_sizes=bit_sizes) system_value("frag_coord", 4) +# vec2 load of frag_coord.xy (float fragment coordinates, as opposed to load_pixel_coord). +system_value("frag_coord_xy", 2) # 16-bit integer vec2 of the pixel X/Y in the framebuffer. system_value("pixel_coord", 2, bit_sizes=[16]) # Scalar load of frag_coord Z/W component. Backends can lower frag_coord to diff --git a/src/compiler/nir/nir_opt_peephole_select.c b/src/compiler/nir/nir_opt_peephole_select.c index 76994e6247d..bb4f2fc8761 100644 --- a/src/compiler/nir/nir_opt_peephole_select.c +++ b/src/compiler/nir/nir_opt_peephole_select.c @@ -166,6 +166,7 @@ block_check_for_allowed_instrs(nir_block *block, unsigned *count, case nir_intrinsic_load_layer_id: case nir_intrinsic_load_frag_coord: case nir_intrinsic_load_pixel_coord: + case nir_intrinsic_load_frag_coord_xy: case nir_intrinsic_load_frag_coord_z: case nir_intrinsic_load_frag_coord_w: case nir_intrinsic_load_sample_pos: diff --git a/src/compiler/nir/nir_opt_sink.c b/src/compiler/nir/nir_opt_sink.c index 744c8ddc2d9..e32b940da7c 100644 --- a/src/compiler/nir/nir_opt_sink.c +++ b/src/compiler/nir/nir_opt_sink.c @@ -257,6 +257,7 @@ can_sink_instr(nir_instr *instr, nir_move_options options, bool *can_mov_out_of_ return options & nir_move_load_buffer_amd; case nir_intrinsic_load_frag_coord: + case nir_intrinsic_load_frag_coord_xy: case nir_intrinsic_load_frag_coord_z: case nir_intrinsic_load_frag_coord_w: case nir_intrinsic_load_var_special_pan: diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c index 49712a26969..84ba5ef733d 100644 --- a/src/compiler/shader_enums.c +++ b/src/compiler/shader_enums.c @@ -384,6 +384,7 @@ gl_system_value_name(gl_system_value sysval) ENUM(SYSTEM_VALUE_INVOCATION_ID), ENUM(SYSTEM_VALUE_FRAG_COORD), ENUM(SYSTEM_VALUE_PIXEL_COORD), + ENUM(SYSTEM_VALUE_FRAG_COORD_XY), ENUM(SYSTEM_VALUE_FRAG_COORD_Z), ENUM(SYSTEM_VALUE_FRAG_COORD_W), ENUM(SYSTEM_VALUE_POINT_COORD), diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index 8b42304a029..28e4e83a26a 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -805,6 +805,7 @@ typedef enum /*@{*/ SYSTEM_VALUE_FRAG_COORD, SYSTEM_VALUE_PIXEL_COORD, + SYSTEM_VALUE_FRAG_COORD_XY, SYSTEM_VALUE_FRAG_COORD_Z, SYSTEM_VALUE_FRAG_COORD_W, SYSTEM_VALUE_POINT_COORD,