nak: Add support for SPV_NV_shader_sm_builtins

Reviewed-by: Karol Herbst <kherbst@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27154>
This commit is contained in:
Faith Ekstrand
2024-01-18 13:00:48 -06:00
committed by Marge Bot
parent 82fe981e35
commit a55b2996ab
3 changed files with 28 additions and 3 deletions

View File

@@ -156,6 +156,7 @@ pub extern "C" fn nak_compiler_create(
let nak = Box::new(nak_compiler { let nak = Box::new(nak_compiler {
sm: dev.sm, sm: dev.sm,
warps_per_sm: dev.max_warps_per_mp,
nir_options: nir_options(dev), nir_options: nir_options(dev),
}); });

View File

@@ -416,6 +416,8 @@ static bool
nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin, nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
void *data) void *data)
{ {
const struct nak_compiler *nak = data;
b->cursor = nir_before_instr(&intrin->instr); b->cursor = nir_before_instr(&intrin->instr);
nir_def *val; nir_def *val;
@@ -512,6 +514,25 @@ nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
val = nir_unpack_64_2x32(b, val); val = nir_unpack_64_2x32(b, val);
break; break;
case nir_intrinsic_load_warps_per_sm_nv:
val = nir_imm_int(b, nak->warps_per_sm);
break;
case nir_intrinsic_load_sm_count_nv:
val = nir_load_sysval_nv(b, 32, .base = NAK_SV_VIRTCFG);
val = nir_ubitfield_extract_imm(b, val, 20, 9);
break;
case nir_intrinsic_load_warp_id_nv:
val = nir_load_sysval_nv(b, 32, .base = NAK_SV_VIRTID);
val = nir_ubitfield_extract_imm(b, val, 8, 7);
break;
case nir_intrinsic_load_sm_id_nv:
val = nir_load_sysval_nv(b, 32, .base = NAK_SV_VIRTID);
val = nir_ubitfield_extract_imm(b, val, 20, 9);
break;
default: default:
return false; return false;
} }
@@ -525,12 +546,12 @@ nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
} }
static bool static bool
nak_nir_lower_system_values(nir_shader *nir) nak_nir_lower_system_values(nir_shader *nir, const struct nak_compiler *nak)
{ {
return nir_shader_intrinsics_pass(nir, nak_nir_lower_system_value_intrin, return nir_shader_intrinsics_pass(nir, nak_nir_lower_system_value_intrin,
nir_metadata_block_index | nir_metadata_block_index |
nir_metadata_dominance, nir_metadata_dominance,
NULL); (void *)nak);
} }
static bool static bool
@@ -1165,7 +1186,7 @@ nak_postprocess_nir(nir_shader *nir,
nir->info.tess._primitive_mode == TESS_PRIMITIVE_TRIANGLES); nir->info.tess._primitive_mode == TESS_PRIMITIVE_TRIANGLES);
} }
OPT(nir, nak_nir_lower_system_values); OPT(nir, nak_nir_lower_system_values, nak);
switch (nir->info.stage) { switch (nir->info.stage) {
case MESA_SHADER_VERTEX: case MESA_SHADER_VERTEX:

View File

@@ -18,6 +18,7 @@ bool nak_should_print_nir(void);
struct nak_compiler { struct nak_compiler {
uint8_t sm; uint8_t sm;
uint8_t warps_per_sm;
struct nir_shader_compiler_options nir_options; struct nir_shader_compiler_options nir_options;
}; };
@@ -87,6 +88,8 @@ enum ENUM_PACKED nak_attr {
enum ENUM_PACKED nak_sv { enum ENUM_PACKED nak_sv {
NAK_SV_LANE_ID = 0x00, NAK_SV_LANE_ID = 0x00,
NAK_SV_VIRTCFG = 0x02,
NAK_SV_VIRTID = 0x03,
NAK_SV_VERTEX_COUNT = 0x10, NAK_SV_VERTEX_COUNT = 0x10,
NAK_SV_INVOCATION_ID = 0x11, NAK_SV_INVOCATION_ID = 0x11,
NAK_SV_THREAD_KILL = 0x13, NAK_SV_THREAD_KILL = 0x13,