diff --git a/src/nouveau/compiler/nak/api.rs b/src/nouveau/compiler/nak/api.rs index b819801c291..3f9abe99f09 100644 --- a/src/nouveau/compiler/nak/api.rs +++ b/src/nouveau/compiler/nak/api.rs @@ -400,7 +400,7 @@ pub extern "C" fn nak_compile_shader( panic!("Unsupported shader model"); }; - let mut s = nak_shader_from_nir(nir, sm.as_ref()); + let mut s = nak_shader_from_nir(nak, nir, sm.as_ref()); if DEBUG.print() { eprintln!("NAK IR:\n{}", &s); diff --git a/src/nouveau/compiler/nak/from_nir.rs b/src/nouveau/compiler/nak/from_nir.rs index 4251d04bfd6..dccf3feea3f 100644 --- a/src/nouveau/compiler/nak/from_nir.rs +++ b/src/nouveau/compiler/nak/from_nir.rs @@ -19,7 +19,7 @@ use std::cmp::max; use std::collections::{HashMap, HashSet}; use std::ops::Index; -fn init_info_from_nir(nir: &nir_shader) -> ShaderInfo { +fn init_info_from_nir(nak: &nak_compiler, nir: &nir_shader) -> ShaderInfo { ShaderInfo { num_gprs: 0, num_instrs: 0, @@ -159,7 +159,7 @@ fn init_info_from_nir(nir: &nir_shader) -> ShaderInfo { None } else { Some(Box::new(unsafe { - nak_xfb_from_nir(nir.xfb_info) + nak_xfb_from_nir(nak, nir.xfb_info) })) }, }) @@ -315,11 +315,15 @@ struct ShaderFromNir<'a> { } impl<'a> ShaderFromNir<'a> { - fn new(nir: &'a nir_shader, sm: &'a dyn ShaderModel) -> Self { + fn new( + nak: &nak_compiler, + nir: &'a nir_shader, + sm: &'a dyn ShaderModel, + ) -> Self { Self { nir: nir, sm: sm, - info: init_info_from_nir(nir), + info: init_info_from_nir(nak, nir), float_ctl: ShaderFloatControls::from_nir(nir), cfg: CFGBuilder::new(), label_alloc: LabelAllocator::new(), @@ -3623,8 +3627,9 @@ impl<'a> ShaderFromNir<'a> { } pub fn nak_shader_from_nir<'a>( + nak: &nak_compiler, ns: &'a nir_shader, sm: &'a dyn ShaderModel, ) -> Shader<'a> { - ShaderFromNir::new(ns, sm).parse_shader() + ShaderFromNir::new(nak, ns, sm).parse_shader() } diff --git a/src/nouveau/compiler/nak_nir.c b/src/nouveau/compiler/nak_nir.c index 4659f445eda..cac815b96c1 100644 --- a/src/nouveau/compiler/nak_nir.c +++ b/src/nouveau/compiler/nak_nir.c @@ -334,7 +334,7 @@ nak_preprocess_nir(nir_shader *nir, const struct nak_compiler *nak) } uint16_t -nak_varying_attr_addr(gl_varying_slot slot) +nak_varying_attr_addr(const struct nak_compiler *nak, gl_varying_slot slot) { if (slot >= VARYING_SLOT_PATCH0) { return NAK_ATTR_PATCH_START + (slot - VARYING_SLOT_PATCH0) * 0x10; @@ -381,7 +381,7 @@ nak_fs_out_addr(gl_frag_result slot, uint32_t blend_idx) } uint16_t -nak_sysval_attr_addr(gl_system_value sysval) +nak_sysval_attr_addr(const struct nak_compiler *nak, gl_system_value sysval) { switch (sysval) { case SYSTEM_VALUE_PRIMITIVE_ID: return NAK_ATTR_PRIMITIVE_ID; @@ -434,7 +434,7 @@ nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin, b->shader->info.stage == MESA_SHADER_GEOMETRY); const gl_system_value sysval = nir_system_value_from_intrinsic(intrin->intrinsic); - const uint32_t addr = nak_sysval_attr_addr(sysval); + const uint32_t addr = nak_sysval_attr_addr(nak, sysval); val = nir_ald_nv(b, 1, nir_imm_int(b, 0), nir_imm_int(b, 0), .base = addr, .flags = 0, .range_base = addr, .range = 4, @@ -657,7 +657,8 @@ nak_nir_lower_system_values(nir_shader *nir, const struct nak_compiler *nak) } struct nak_xfb_info -nak_xfb_from_nir(const struct nir_xfb_info *nir_xfb) +nak_xfb_from_nir(const struct nak_compiler *nak, + const struct nir_xfb_info *nir_xfb) { if (nir_xfb == NULL) return (struct nak_xfb_info) { }; @@ -675,7 +676,7 @@ nak_xfb_from_nir(const struct nir_xfb_info *nir_xfb) const uint8_t b = out->buffer; assert(nir_xfb->buffers_written & BITFIELD_BIT(b)); - const uint16_t attr_addr = nak_varying_attr_addr(out->location); + const uint16_t attr_addr = nak_varying_attr_addr(nak, out->location); assert(attr_addr % 4 == 0); const uint16_t attr_idx = attr_addr / 4; diff --git a/src/nouveau/compiler/nak_nir_lower_fs_inputs.c b/src/nouveau/compiler/nak_nir_lower_fs_inputs.c index 55e8245f635..87d8df66fa8 100644 --- a/src/nouveau/compiler/nak_nir_lower_fs_inputs.c +++ b/src/nouveau/compiler/nak_nir_lower_fs_inputs.c @@ -28,13 +28,14 @@ load_fs_input(nir_builder *b, unsigned num_components, uint32_t addr, } static nir_def * -load_frag_w(nir_builder *b, enum nak_interp_loc interp_loc, nir_def *offset) +load_frag_w(nir_builder *b, enum nak_interp_loc interp_loc, nir_def *offset, + const struct nak_compiler *nak) { if (offset == NULL) offset = nir_imm_int(b, 0); const uint16_t w_addr = - nak_sysval_attr_addr(SYSTEM_VALUE_FRAG_COORD) + 12; + nak_sysval_attr_addr(nak, SYSTEM_VALUE_FRAG_COORD) + 12; const struct nak_nir_ipa_flags flags = { .interp_mode = NAK_INTERP_MODE_SCREEN_LINEAR, @@ -177,10 +178,11 @@ struct lower_fs_input_ctx { }; static uint16_t -fs_input_intrin_addr(nir_intrinsic_instr *intrin) +fs_input_intrin_addr(nir_intrinsic_instr *intrin, + const struct nak_compiler *nak) { const nir_io_semantics sem = nir_intrinsic_io_semantics(intrin); - return nak_varying_attr_addr(sem.location) + + return nak_varying_attr_addr(nak, sem.location) + nir_src_as_uint(*nir_get_io_offset_src(intrin)) * 16 + nir_intrinsic_component(intrin) * 4; } @@ -189,6 +191,7 @@ static bool lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) { const struct lower_fs_input_ctx *ctx = data; + const struct nak_compiler *nak = ctx->nak; b->cursor = nir_before_instr(&intrin->instr); @@ -209,8 +212,8 @@ lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) : NAK_INTERP_LOC_DEFAULT; const uint32_t addr = intrin->intrinsic == nir_intrinsic_load_point_coord ? - nak_sysval_attr_addr(SYSTEM_VALUE_POINT_COORD) : - nak_sysval_attr_addr(SYSTEM_VALUE_FRAG_COORD); + nak_sysval_attr_addr(nak, SYSTEM_VALUE_POINT_COORD) : + nak_sysval_attr_addr(nak, SYSTEM_VALUE_FRAG_COORD); res = interp_fs_input(b, intrin->def.num_components, addr, NAK_INTERP_MODE_SCREEN_LINEAR, @@ -224,7 +227,7 @@ lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) assert(b->shader->info.stage == MESA_SHADER_FRAGMENT); const gl_system_value sysval = nir_system_value_from_intrinsic(intrin->intrinsic); - const uint32_t addr = nak_sysval_attr_addr(sysval); + const uint32_t addr = nak_sysval_attr_addr(nak, sysval); res = load_fs_input(b, intrin->def.num_components, addr, ctx->nak); if (intrin->def.bit_size == 1) @@ -233,7 +236,7 @@ lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) } case nir_intrinsic_load_input: { - const uint16_t addr = fs_input_intrin_addr(intrin); + const uint16_t addr = fs_input_intrin_addr(intrin, ctx->nak); res = load_fs_input(b, intrin->def.num_components, addr, ctx->nak); break; } @@ -274,7 +277,7 @@ lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) nir_def *inv_w = NULL; if (interp_mode == NAK_INTERP_MODE_PERSPECTIVE) - inv_w = nir_frcp(b, load_frag_w(b, interp_loc, offset)); + inv_w = nir_frcp(b, load_frag_w(b, interp_loc, offset, nak)); res = interp_fs_input(b, intrin->def.num_components, addr, interp_mode, interp_loc, @@ -283,7 +286,7 @@ lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) } case nir_intrinsic_load_interpolated_input: { - const uint16_t addr = fs_input_intrin_addr(intrin); + const uint16_t addr = fs_input_intrin_addr(intrin, ctx->nak); nir_intrinsic_instr *bary = nir_src_as_intrinsic(intrin->src[0]); enum nak_interp_mode interp_mode; @@ -318,7 +321,7 @@ lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) nir_def *inv_w = NULL; if (interp_mode == NAK_INTERP_MODE_PERSPECTIVE) - inv_w = nir_frcp(b, load_frag_w(b, interp_loc, offset)); + inv_w = nir_frcp(b, load_frag_w(b, interp_loc, offset, nak)); res = interp_fs_input(b, intrin->def.num_components, addr, interp_mode, interp_loc, @@ -366,7 +369,7 @@ lower_fs_input_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *data) break; case nir_intrinsic_load_input_vertex: { - const uint16_t addr = fs_input_intrin_addr(intrin); + const uint16_t addr = fs_input_intrin_addr(intrin, ctx->nak); unsigned vertex_id = nir_src_as_uint(intrin->src[0]); assert(vertex_id < 3); diff --git a/src/nouveau/compiler/nak_nir_lower_vtg_io.c b/src/nouveau/compiler/nak_nir_lower_vtg_io.c index 02fc347ef26..98dfdba3698 100644 --- a/src/nouveau/compiler/nak_nir_lower_vtg_io.c +++ b/src/nouveau/compiler/nak_nir_lower_vtg_io.c @@ -53,6 +53,7 @@ lower_vtg_io_intrin(nir_builder *b, nir_intrinsic_instr *intrin, void *cb_data) { + const struct nak_compiler *nak = cb_data; b->cursor = nir_before_instr(&intrin->instr); nir_def *vtx = NULL, *offset = NULL, *data = NULL; @@ -154,9 +155,9 @@ lower_vtg_io_intrin(nir_builder *b, uint32_t base_addr; if (b->shader->info.stage == MESA_SHADER_VERTEX && !is_output) - base_addr = nak_attribute_attr_addr(sem.location); + base_addr = nak_attribute_attr_addr(nak, sem.location); else - base_addr = nak_varying_attr_addr(sem.location); + base_addr = nak_varying_attr_addr(nak, sem.location); base_addr += 4 * component; uint32_t range; @@ -253,5 +254,5 @@ nak_nir_lower_vtg_io(nir_shader *nir, const struct nak_compiler *nak) { return nir_shader_intrinsics_pass(nir, lower_vtg_io_intrin, nir_metadata_control_flow, - NULL); + (void *)nak); } diff --git a/src/nouveau/compiler/nak_private.h b/src/nouveau/compiler/nak_private.h index 37b152402ae..57211f537fe 100644 --- a/src/nouveau/compiler/nak_private.h +++ b/src/nouveau/compiler/nak_private.h @@ -87,14 +87,17 @@ enum ENUM_PACKED nak_attr { }; static inline uint16_t -nak_attribute_attr_addr(gl_vert_attrib attrib) +nak_attribute_attr_addr(UNUSED const struct nak_compiler *nak, + gl_vert_attrib attrib) { assert(attrib >= VERT_ATTRIB_GENERIC0); return NAK_ATTR_GENERIC_START + (attrib - VERT_ATTRIB_GENERIC0) * 0x10; } -uint16_t nak_varying_attr_addr(gl_varying_slot slot); -uint16_t nak_sysval_attr_addr(gl_system_value sysval); +uint16_t nak_varying_attr_addr(const struct nak_compiler *nak, + gl_varying_slot slot); +uint16_t nak_sysval_attr_addr(const struct nak_compiler *nak, + gl_system_value sysval); enum ENUM_PACKED nak_sv { NAK_SV_LANE_ID = 0x00, @@ -127,7 +130,8 @@ enum ENUM_PACKED nak_sv { bool nak_nir_workgroup_has_one_subgroup(const nir_shader *nir); struct nak_xfb_info -nak_xfb_from_nir(const struct nir_xfb_info *nir_xfb); +nak_xfb_from_nir(const struct nak_compiler *nak, + const struct nir_xfb_info *nir_xfb); struct nak_io_addr_offset { nir_scalar base;