nak: Pass a nak_compiler into sysval and attrib helpers

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31585>
This commit is contained in:
Faith Ekstrand 2024-10-09 09:56:58 -05:00 committed by Marge Bot
parent 58252622f1
commit ab8e6bf4c3
6 changed files with 44 additions and 30 deletions

View file

@ -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);

View file

@ -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()
}

View file

@ -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;

View file

@ -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);

View file

@ -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);
}

View file

@ -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;