nir, ir3: Make ir3 GS varyings use a proper index

Use a similar technique of reusing TCS-only varyings for VS/TES/GS.
This way outputs_written can be used to see whether GS lowering has
already been run.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39328>
This commit is contained in:
Connor Abbott 2026-01-07 10:08:45 -05:00 committed by Marge Bot
parent aa04692bb4
commit c7a60fca3c
3 changed files with 33 additions and 4 deletions

View file

@ -208,6 +208,34 @@ gl_varying_slot_name_for_stage(gl_varying_slot slot, mesa_shader_stage stage)
}
break;
case MESA_SHADER_VERTEX:
switch (slot) {
case VARYING_SLOT_GS_HEADER_IR3: return "VARYING_SLOT_GS_HEADER_IR3";
default:
/* Not an overlapping value. */
break;
}
break;
case MESA_SHADER_TESS_EVAL:
switch (slot) {
case VARYING_SLOT_GS_HEADER_IR3: return "VARYING_SLOT_GS_HEADER_IR3";
default:
/* Not an overlapping value. */
break;
}
break;
case MESA_SHADER_GEOMETRY:
switch (slot) {
case VARYING_SLOT_GS_HEADER_IR3: return "VARYING_SLOT_GS_HEADER_IR3";
case VARYING_SLOT_GS_VERTEX_FLAGS_IR3: return "VARYING_SLOT_GS_VERTEX_FLAGS_IR3";
default:
/* Not an overlapping value. */
break;
}
break;
default:
break;
}

View file

@ -374,6 +374,9 @@ typedef enum
VARYING_SLOT_TASK_COUNT = VARYING_SLOT_BOUNDING_BOX0, /* Only appears in TASK. */
VARYING_SLOT_CULL_PRIMITIVE = VARYING_SLOT_BOUNDING_BOX0, /* Only appears in MESH. */
VARYING_SLOT_GS_HEADER_IR3 = VARYING_SLOT_BOUNDING_BOX0, /* VS/TES output and GS input */
VARYING_SLOT_GS_VERTEX_FLAGS_IR3 = VARYING_SLOT_BOUNDING_BOX1, /* GS output */
VARYING_SLOT_VAR0 = 32, /* First generic varying slot */
/* the remaining are simply for the benefit of gl_varying_slot_name()
* and not to be construed as an upper bound:

View file

@ -1420,10 +1420,8 @@ void print_raw(FILE *out, const BITSET_WORD *data, size_t size);
void ir3_link_stream_out(struct ir3_shader_linkage *l,
const struct ir3_shader_variant *v);
#define VARYING_SLOT_GS_HEADER_IR3 (VARYING_SLOT_MAX + 0)
#define VARYING_SLOT_GS_VERTEX_FLAGS_IR3 (VARYING_SLOT_MAX + 1)
#define VARYING_SLOT_TCS_HEADER_IR3 (VARYING_SLOT_MAX + 2)
#define VARYING_SLOT_REL_PATCH_ID_IR3 (VARYING_SLOT_MAX + 3)
#define VARYING_SLOT_TCS_HEADER_IR3 (VARYING_SLOT_MAX + 0)
#define VARYING_SLOT_REL_PATCH_ID_IR3 (VARYING_SLOT_MAX + 1)
static inline uint32_t
ir3_find_sysval_regid(const struct ir3_shader_variant *so, unsigned slot)