From 4555cd23c6fe3a3e5d90f2a3398593d805f9bed6 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Wed, 13 May 2026 23:56:23 -0700 Subject: [PATCH] jay: Set Dispatch GRF Start Register in jay_setup_payload() We want it to be set to wherever the push constants ended up. Setting it close to the setup_payload_push() call makes this easier. We'll also be adding some extra UGPRs for the fragment shader payload soon, and the partitioning code will just have one big UGPR partition for payload fields, push constants, and general purpose UGPRs, so it really won't know how to do this very well without duplicating a bunch of information. Part-of: --- src/intel/compiler/jay/jay_from_nir.c | 30 ++++++++++++++++--- .../compiler/jay/jay_register_allocate.c | 12 -------- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/intel/compiler/jay/jay_from_nir.c b/src/intel/compiler/jay/jay_from_nir.c index f6a47870501..ed86e381656 100644 --- a/src/intel/compiler/jay/jay_from_nir.c +++ b/src/intel/compiler/jay/jay_from_nir.c @@ -2456,6 +2456,24 @@ read_vector_payload(struct payload_builder *b, enum jay_file file, unsigned len) return jay_collect_vectors(b->b, defs, len); } +static void +setup_payload_dispatch_start(struct nir_to_jay_state *nj, + struct payload_builder *p) +{ + jay_shader *s = nj->s; + + const unsigned start_grf = p->offsets[GPR] * jay_grf_per_gpr(nj->s) + + p->offsets[UGPR] / jay_ugpr_per_grf(nj->s); + + if (s->stage == MESA_SHADER_FRAGMENT && s->dispatch_width == 32) { + s->prog_data->fs.dispatch_grf_start_reg_32 = start_grf; + } else if (s->stage == MESA_SHADER_FRAGMENT && s->dispatch_width == 16) { + s->prog_data->fs.dispatch_grf_start_reg_16 = start_grf; + } else { + s->prog_data->base.dispatch_grf_start_reg = start_grf; + } +} + static void setup_payload_push(struct nir_to_jay_state *nj, struct payload_builder *p) { @@ -2482,12 +2500,13 @@ setup_vertex_payload(struct nir_to_jay_state *nj, struct payload_builder *p) */ p->offsets[GPR] += 7; + setup_payload_dispatch_start(nj, p); + setup_payload_push(nj, p); + for (unsigned i = 0; i < (8 * nj->s->prog_data->vue.urb_read_length); ++i) { assert(i < ARRAY_SIZE(nj->payload.vs.attributes)); nj->payload.vs.attributes[i] = read_payload(p, GPR); } - - setup_payload_push(nj, p); } static void @@ -2498,6 +2517,8 @@ setup_compute_payload(struct nir_to_jay_state *nj, struct payload_builder *p) nj->payload.inline_data = read_vector_payload(p, UGPR, jay_ugpr_per_grf(nj->s)); + + setup_payload_dispatch_start(nj, p); } static void @@ -2553,8 +2574,6 @@ setup_fragment_payload(struct nir_to_jay_state *nj, struct payload_builder *p) nj->payload.u1 = read_vector_payload(p, UGPR, jay_ugpr_per_grf(nj->s)); } - setup_payload_push(nj, p); - u_foreach_bit(i, nj->s->prog_data->fs.barycentric_interp_modes) { fs->bary[i] = read_vector_payload(p, GPR, 2); } @@ -2567,6 +2586,9 @@ setup_fragment_payload(struct nir_to_jay_state *nj, struct payload_builder *p) fs->coord.w = read_payload(p, GPR); } + setup_payload_dispatch_start(nj, p); + setup_payload_push(nj, p); + unsigned nr_attribs = 16 * 4; /* TODO */ for (unsigned i = 0; i < nr_attribs; ++i) { jay_def comps[] = { read_payload(p, UGPR), read_payload(p, UGPR), diff --git a/src/intel/compiler/jay/jay_register_allocate.c b/src/intel/compiler/jay/jay_register_allocate.c index 58dafccf60d..380a40d6814 100644 --- a/src/intel/compiler/jay/jay_register_allocate.c +++ b/src/intel/compiler/jay/jay_register_allocate.c @@ -1493,7 +1493,6 @@ jay_partition_grf(jay_shader *shader) assert((uniform_grfs + nonuniform_grfs) == JAY_NUM_PHYS_GRF); /* Partition GRFs between GPR & UGPR */ - unsigned dispatch_grf = 0; unsigned stride4_header_size = 0; if (shader->stage == MESA_SHADER_VERTEX) { @@ -1508,7 +1507,6 @@ jay_partition_grf(jay_shader *shader) }; build_partition(shader, blocks, ARRAY_SIZE(blocks)); - dispatch_grf = blocks[0] + blocks[1]; stride4_header_size = blocks[1] + blocks[3]; } else if (shader->stage == MESA_SHADER_FRAGMENT) { unsigned len0 = jay_grf_per_gpr(shader); @@ -1521,7 +1519,6 @@ jay_partition_grf(jay_shader *shader) nonuniform_grfs - payload_grfs, /* GPR: General & EOT */ }; build_partition(shader, blocks, ARRAY_SIZE(blocks)); - dispatch_grf = blocks[0] + blocks[1]; stride4_header_size = blocks[1]; } else { unsigned blocks[] = { uniform_grfs - 4, nonuniform_grfs, 4 }; @@ -1538,15 +1535,6 @@ jay_partition_grf(jay_shader *shader) // print_partition(p); validate_partition(p, stride4_header_size, nonuniform_gprs); - if (shader->stage == MESA_SHADER_FRAGMENT && shader->dispatch_width == 32) { - shader->prog_data->fs.dispatch_grf_start_reg_32 = dispatch_grf; - } else if (shader->stage == MESA_SHADER_FRAGMENT && - shader->dispatch_width == 16) { - shader->prog_data->fs.dispatch_grf_start_reg_16 = dispatch_grf; - } else { - shader->prog_data->base.dispatch_grf_start_reg = dispatch_grf; - } - /* By construction of our partition, the entire GRF is used. */ shader->prog_data->base.grf_used = JAY_NUM_PHYS_GRF;