From 0f3a3115919e0902b1bf20614a64a6d11a55d17b Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Thu, 14 May 2026 00:03:41 -0700 Subject: [PATCH] jay: Implement sample position Part-of: --- src/intel/compiler/jay/jay_from_nir.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/intel/compiler/jay/jay_from_nir.c b/src/intel/compiler/jay/jay_from_nir.c index ed86e381656..7217a8e6410 100644 --- a/src/intel/compiler/jay/jay_from_nir.c +++ b/src/intel/compiler/jay/jay_from_nir.c @@ -65,6 +65,7 @@ typedef struct jay_fs_payload { } coord; jay_def pixel_sample_mask; + jay_def sample_pos; jay_def deltas[64]; } jay_fs_payload; @@ -1206,6 +1207,8 @@ jay_emit_intrinsic(struct nir_to_jay_state *nj, nir_intrinsic_instr *intr) jay_builder *b = &nj->bld; jay_cs_payload *cs = mesa_shader_stage_is_compute(s->stage) ? &nj->payload.cs : NULL; + jay_fs_payload *fs = + s->stage == MESA_SHADER_FRAGMENT ? &nj->payload.fs : NULL; const bool has_dest = nir_intrinsic_infos[intr->intrinsic].has_dest; jay_def dst = has_dest ? nj_def(&intr->def) : jay_null(); @@ -1441,6 +1444,19 @@ jay_emit_intrinsic(struct nir_to_jay_state *nj, nir_intrinsic_instr *intr) jay_MOV(b, dst, nj->payload.fs.coord.w); break; + case nir_intrinsic_load_sample_pos: + case nir_intrinsic_load_sample_pos_or_center: + assert(fs); + + jay_foreach_comp(dst, c) { + jay_def gpr = + jay_GPR_FROM_UGPRS_u32(b, fs->sample_pos, JAY_TYPE_U8, 2, c); + jay_MUL(b, JAY_TYPE_F32, jay_extract(dst, c), + jay_CVT_f32(b, gpr, JAY_TYPE_U32, JAY_ROUND, 0), + jay_imm_f(1 / 16.0f)); + } + break; + case nir_intrinsic_load_urb_output_handle_intel: jay_MOV(b, dst, nj->payload.urb_handle); break; @@ -2586,6 +2602,10 @@ setup_fragment_payload(struct nir_to_jay_state *nj, struct payload_builder *p) fs->coord.w = read_payload(p, GPR); } + if (nj->s->prog_data->fs.uses_pos_offset) { + fs->sample_pos = read_vector_payload(p, UGPR, jay_ugpr_per_grf(nj->s)); + } + setup_payload_dispatch_start(nj, p); setup_payload_push(nj, p);