From c7a60fca3ce0f80a8e9eb2538b9a9f644b3a0b08 Mon Sep 17 00:00:00 2001 From: Connor Abbott Date: Wed, 7 Jan 2026 10:08:45 -0500 Subject: [PATCH] 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: --- src/compiler/shader_enums.c | 28 ++++++++++++++++++++++++++++ src/compiler/shader_enums.h | 3 +++ src/freedreno/ir3/ir3_shader.h | 6 ++---- 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c index e761896e0b2..1d5a2bc2438 100644 --- a/src/compiler/shader_enums.c +++ b/src/compiler/shader_enums.c @@ -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; } diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index 6105286bab7..2d5e7780870 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -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: diff --git a/src/freedreno/ir3/ir3_shader.h b/src/freedreno/ir3/ir3_shader.h index e70701dcba5..e40fb292e19 100644 --- a/src/freedreno/ir3/ir3_shader.h +++ b/src/freedreno/ir3/ir3_shader.h @@ -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)