nir: add frag_coord_xy

to strengthen and simplify pixel_coord lowering

Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41227>
This commit is contained in:
Marek Olšák 2026-04-29 05:41:53 -04:00 committed by Marge Bot
parent 9cb688af88
commit e49f29f25e
8 changed files with 20 additions and 2 deletions

View file

@ -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:

View file

@ -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:

View file

@ -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:

View file

@ -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

View file

@ -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:

View file

@ -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:

View file

@ -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),

View file

@ -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,