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:

committed by
Marge Bot

parent
82fe981e35
commit
a55b2996ab
@@ -156,6 +156,7 @@ pub extern "C" fn nak_compiler_create(
|
||||
|
||||
let nak = Box::new(nak_compiler {
|
||||
sm: dev.sm,
|
||||
warps_per_sm: dev.max_warps_per_mp,
|
||||
nir_options: nir_options(dev),
|
||||
});
|
||||
|
||||
|
@@ -416,6 +416,8 @@ static bool
|
||||
nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
|
||||
void *data)
|
||||
{
|
||||
const struct nak_compiler *nak = data;
|
||||
|
||||
b->cursor = nir_before_instr(&intrin->instr);
|
||||
|
||||
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);
|
||||
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:
|
||||
return false;
|
||||
}
|
||||
@@ -525,12 +546,12 @@ nak_nir_lower_system_value_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
|
||||
}
|
||||
|
||||
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,
|
||||
nir_metadata_block_index |
|
||||
nir_metadata_dominance,
|
||||
NULL);
|
||||
(void *)nak);
|
||||
}
|
||||
|
||||
static bool
|
||||
@@ -1165,7 +1186,7 @@ nak_postprocess_nir(nir_shader *nir,
|
||||
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) {
|
||||
case MESA_SHADER_VERTEX:
|
||||
|
@@ -18,6 +18,7 @@ bool nak_should_print_nir(void);
|
||||
|
||||
struct nak_compiler {
|
||||
uint8_t sm;
|
||||
uint8_t warps_per_sm;
|
||||
|
||||
struct nir_shader_compiler_options nir_options;
|
||||
};
|
||||
@@ -87,6 +88,8 @@ enum ENUM_PACKED nak_attr {
|
||||
|
||||
enum ENUM_PACKED nak_sv {
|
||||
NAK_SV_LANE_ID = 0x00,
|
||||
NAK_SV_VIRTCFG = 0x02,
|
||||
NAK_SV_VIRTID = 0x03,
|
||||
NAK_SV_VERTEX_COUNT = 0x10,
|
||||
NAK_SV_INVOCATION_ID = 0x11,
|
||||
NAK_SV_THREAD_KILL = 0x13,
|
||||
|
Reference in New Issue
Block a user