mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 16:08:04 +02:00
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:
parent
58252622f1
commit
ab8e6bf4c3
6 changed files with 44 additions and 30 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue