From 316470920a23173cd53bc7cebcc3426314cf8fac Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Fri, 22 Mar 2024 09:33:42 -0400 Subject: [PATCH] zink: add a helper to detect clip/cull dist locations Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 26 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 058752c8bce..e307e634251 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -69,6 +69,20 @@ copy_vars(nir_builder *b, nir_deref_instr *dst, nir_deref_instr *src) } } +static bool +is_clipcull_dist(int location) +{ + switch (location) { + case VARYING_SLOT_CLIP_DIST0: + case VARYING_SLOT_CLIP_DIST1: + case VARYING_SLOT_CULL_DIST0: + case VARYING_SLOT_CULL_DIST1: + return true; + default: break; + } + return false; +} + #define SIZEOF_FIELD(type, field) sizeof(((type *)0)->field) static void @@ -1651,7 +1665,7 @@ find_var_with_location_frac(nir_shader *nir, unsigned location, unsigned locatio unsigned num_components = glsl_get_vector_elements(var->type); if (glsl_type_is_64bit(glsl_without_array(var->type))) num_components *= 2; - if (var->data.location == VARYING_SLOT_CLIP_DIST0 || var->data.location == VARYING_SLOT_CULL_DIST0) + if (is_clipcull_dist(var->data.location)) num_components = glsl_get_aoa_size(var->type); if (var->data.location_frac <= location_frac && var->data.location_frac + num_components > location_frac) @@ -1738,7 +1752,7 @@ get_slot_components(nir_variable *var, unsigned slot, unsigned so_slot) /* arrays here are already fully unrolled from their structs, so slot handling is implicit */ unsigned num_components = glsl_get_components(glsl_without_array(type)); /* special handling: clip/cull distance are arrays with vector semantics */ - if (var->data.location == VARYING_SLOT_CLIP_DIST0 || var->data.location == VARYING_SLOT_CULL_DIST0) { + if (is_clipcull_dist(var->data.location)) { num_components = glsl_array_size(type); if (slot_idx) /* this is the second vec4 */ @@ -1819,7 +1833,7 @@ update_so_info(struct zink_shader *zs, nir_shader *nir, uint64_t outputs_written } if (is_inlined(inlined[slot], output)) continue; - assert(!glsl_type_is_array(var->type) || var->data.location == VARYING_SLOT_CLIP_DIST0 || var->data.location == VARYING_SLOT_CULL_DIST0); + assert(!glsl_type_is_array(var->type) || is_clipcull_dist(var->data.location)); assert(!glsl_type_is_struct_or_ifc(var->type)); unsigned num_components = glsl_type_is_array(var->type) ? glsl_get_aoa_size(var->type) : glsl_get_vector_elements(var->type); if (glsl_type_is_64bit(glsl_without_array(var->type))) @@ -1871,7 +1885,7 @@ update_so_info(struct zink_shader *zs, nir_shader *nir, uint64_t outputs_written if (var->data.is_xfb) goto out; - unsigned num_slots = var->data.location >= VARYING_SLOT_CLIP_DIST0 && var->data.location <= VARYING_SLOT_CULL_DIST1 ? + unsigned num_slots = is_clipcull_dist(var->data.location) ? glsl_array_size(var->type) / 4 : glsl_count_vec4_slots(var->type, false, false); /* for each variable, iterate over all the variable's slots and inline the outputs */ @@ -3669,7 +3683,7 @@ add_derefs_instr(nir_builder *b, nir_intrinsic_instr *intr, void *data) if (src_offset) { /* clip/cull dist and tess levels use different array offset semantics */ bool is_clipdist = (b->shader->info.stage != MESA_SHADER_VERTEX || var->data.mode == nir_var_shader_out) && - var->data.location >= VARYING_SLOT_CLIP_DIST0 && var->data.location <= VARYING_SLOT_CULL_DIST1; + is_clipcull_dist(var->data.location); bool is_tess_level = b->shader->info.stage == MESA_SHADER_TESS_CTRL && var->data.location >= VARYING_SLOT_TESS_LEVEL_INNER && var->data.location >= VARYING_SLOT_TESS_LEVEL_OUTER; bool is_builtin_array = is_clipdist || is_tess_level; @@ -4642,7 +4656,7 @@ scan_nir(struct zink_screen *screen, nir_shader *shader, struct zink_shader *zs) if (filter_io_instr(intr, &is_load, &is_input, &is_interp)) { if (!(is_input && shader->info.stage == MESA_SHADER_VERTEX)) { nir_io_semantics s = nir_intrinsic_io_semantics(intr); - if (s.location >= VARYING_SLOT_CLIP_DIST0 && s.location <= VARYING_SLOT_CULL_DIST1) { + if (is_clipcull_dist(s.location)) { unsigned frac = nir_intrinsic_component(intr) + 1; if (s.location < VARYING_SLOT_CULL_DIST0) { if (s.location == VARYING_SLOT_CLIP_DIST1)