From 58252622f14c44952f14095057409248839cce0c Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 4 Oct 2024 20:09:25 -0500 Subject: [PATCH] nak: Add support for gl_ShadingRateEXT Part-of: --- src/nouveau/compiler/nak_nir.c | 20 ++++++++++++++++++++ src/nouveau/compiler/nak_private.h | 1 + 2 files changed, 21 insertions(+) diff --git a/src/nouveau/compiler/nak_nir.c b/src/nouveau/compiler/nak_nir.c index a610128077c..4659f445eda 100644 --- a/src/nouveau/compiler/nak_nir.c +++ b/src/nouveau/compiler/nak_nir.c @@ -449,6 +449,26 @@ nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin, break; } + case nir_intrinsic_load_frag_shading_rate: { + val = nir_load_sysval_nv(b, 32, .base = NAK_SV_VARIABLE_RATE, + .access = ACCESS_CAN_REORDER); + + /* X is in bits 8..16 and Y is in bits 16..24. However, we actually + * want the log2 of X and Y and, since we only support 1, 2, and 4, a + * right shift by 1 is log2. So this gives us + * + * x_log2 = (sv >> 9) & 3 + * y_log2 = (sv >> 17) & 3 + * + * However, we actually want y_log2 at 0..2 and x_log2 at 2..4 so that + * gives us + */ + nir_def *x = nir_iand_imm(b, nir_ushr_imm(b, val, 7), 0xc); + nir_def *y = nir_iand_imm(b, nir_ushr_imm(b, val, 17), 0x3); + val = nir_ior(b, x, y); + break; + } + case nir_intrinsic_load_subgroup_eq_mask: case nir_intrinsic_load_subgroup_lt_mask: case nir_intrinsic_load_subgroup_le_mask: diff --git a/src/nouveau/compiler/nak_private.h b/src/nouveau/compiler/nak_private.h index 141eb8f34ec..37b152402ae 100644 --- a/src/nouveau/compiler/nak_private.h +++ b/src/nouveau/compiler/nak_private.h @@ -121,6 +121,7 @@ enum ENUM_PACKED nak_sv { NAK_SV_CLOCK_LO = 0x50, NAK_SV_CLOCK_HI = 0x51, NAK_SV_CLOCK = NAK_SV_CLOCK_LO, + NAK_SV_VARIABLE_RATE = 0x84, }; bool nak_nir_workgroup_has_one_subgroup(const nir_shader *nir);