From fb96aaf3fac434905b8366f84db058cdc21eae98 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:53:17 -0600 Subject: [PATCH] nak: Lower system values to a new load_sysval_nak intrinsic Part-of: --- src/nouveau/compiler/nak_nir.c | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/nouveau/compiler/nak_nir.c b/src/nouveau/compiler/nak_nir.c index 229672033ed..ad8e406949a 100644 --- a/src/nouveau/compiler/nak_nir.c +++ b/src/nouveau/compiler/nak_nir.c @@ -263,6 +263,26 @@ nak_sysval_attr_addr(gl_system_value sysval) } } +static uint8_t +nak_sysval_sysval_idx(gl_system_value sysval) +{ + switch (sysval) { + case SYSTEM_VALUE_SUBGROUP_INVOCATION: return 0x00; + case SYSTEM_VALUE_VERTICES_IN: return 0x10; + case SYSTEM_VALUE_INVOCATION_ID: return 0x11; + case SYSTEM_VALUE_HELPER_INVOCATION: return 0x13; + case SYSTEM_VALUE_LOCAL_INVOCATION_INDEX: return 0x20; + case SYSTEM_VALUE_LOCAL_INVOCATION_ID: return 0x21; + case SYSTEM_VALUE_WORKGROUP_ID: return 0x25; + case SYSTEM_VALUE_SUBGROUP_EQ_MASK: return 0x38; + case SYSTEM_VALUE_SUBGROUP_LT_MASK: return 0x39; + case SYSTEM_VALUE_SUBGROUP_LE_MASK: return 0x3a; + case SYSTEM_VALUE_SUBGROUP_GT_MASK: return 0x3b; + case SYSTEM_VALUE_SUBGROUP_GE_MASK: return 0x3c; + default: unreachable("Invalid system value"); + } +} + static bool nak_nir_lower_system_value_instr(nir_builder *b, nir_instr *instr, void *data) { @@ -304,6 +324,33 @@ nak_nir_lower_system_value_instr(nir_builder *b, nir_instr *instr, void *data) break; } + case nir_intrinsic_load_subgroup_invocation: + case nir_intrinsic_load_patch_vertices_in: + case nir_intrinsic_load_helper_invocation: + case nir_intrinsic_load_local_invocation_index: + case nir_intrinsic_load_local_invocation_id: + case nir_intrinsic_load_workgroup_id: + case nir_intrinsic_load_workgroup_id_zero_base: + case nir_intrinsic_load_subgroup_eq_mask: + case nir_intrinsic_load_subgroup_lt_mask: + case nir_intrinsic_load_subgroup_le_mask: + case nir_intrinsic_load_subgroup_gt_mask: + case nir_intrinsic_load_subgroup_ge_mask: { + const gl_system_value sysval = + intrin->intrinsic == nir_intrinsic_load_workgroup_id_zero_base ? + SYSTEM_VALUE_WORKGROUP_ID : + nir_system_value_from_intrinsic(intrin->intrinsic); + const uint32_t idx = nak_sysval_sysval_idx(sysval); + nir_def *comps[3]; + assert(intrin->def.num_components <= 3); + for (unsigned c = 0; c < intrin->def.num_components; c++) { + comps[c] = nir_load_sysval_nv(b, 32, .base = idx + c, + .access = ACCESS_CAN_REORDER); + } + val = nir_vec(b, comps, intrin->def.num_components); + break; + } + default: return false; }