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 {
|
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),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -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:
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user