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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41688>
This commit is contained in:
Kenneth Graunke 2026-05-13 23:56:23 -07:00 committed by Marge Bot
parent 0670b40013
commit 4555cd23c6
2 changed files with 26 additions and 16 deletions

View file

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

View file

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