diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 0135f73b533..990978ec175 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2546,6 +2546,16 @@ nir_intrinsic_from_system_value(gl_system_value val) return nir_intrinsic_load_warp_id_nv; case SYSTEM_VALUE_SM_ID_NV: return nir_intrinsic_load_sm_id_nv; + case SYSTEM_VALUE_CORE_ID: + return nir_intrinsic_load_core_id; + case SYSTEM_VALUE_CORE_COUNT_ARM: + return nir_intrinsic_load_core_count_arm; + case SYSTEM_VALUE_CORE_MAX_ID_ARM: + return nir_intrinsic_load_core_max_id_arm; + case SYSTEM_VALUE_WARP_ID_ARM: + return nir_intrinsic_load_warp_id_arm; + case SYSTEM_VALUE_WARP_MAX_ID_ARM: + return nir_intrinsic_load_warp_max_id_arm; default: return nir_num_intrinsics; } @@ -2724,6 +2734,16 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin) return SYSTEM_VALUE_WARP_ID_NV; case nir_intrinsic_load_sm_id_nv: return SYSTEM_VALUE_SM_ID_NV; + case nir_intrinsic_load_core_id: + return SYSTEM_VALUE_CORE_ID; + case nir_intrinsic_load_core_count_arm: + return SYSTEM_VALUE_CORE_COUNT_ARM; + case nir_intrinsic_load_core_max_id_arm: + return SYSTEM_VALUE_CORE_MAX_ID_ARM; + case nir_intrinsic_load_warp_id_arm: + return SYSTEM_VALUE_WARP_ID_ARM; + case nir_intrinsic_load_warp_max_id_arm: + return SYSTEM_VALUE_WARP_MAX_ID_ARM; default: UNREACHABLE("intrinsic doesn't produce a system value"); } diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index cd74195a446..ea4ef613b0d 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -198,10 +198,12 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_first_invocation: case nir_intrinsic_last_invocation: case nir_intrinsic_load_subgroup_id: + case nir_intrinsic_load_core_id: case nir_intrinsic_shared_append_amd: case nir_intrinsic_shared_consume_amd: case nir_intrinsic_load_sm_id_nv: case nir_intrinsic_load_warp_id_nv: + case nir_intrinsic_load_warp_id_arm: /* VS/TES/GS invocations of the same primitive can be in different * subgroups, so subgroup ops are always divergent between vertices of * the same primitive. @@ -344,7 +346,6 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_load_tcs_mem_attrib_stride: case nir_intrinsic_load_printf_buffer_address: case nir_intrinsic_load_printf_buffer_size: - case nir_intrinsic_load_core_id: case nir_intrinsic_load_samples_log2_agx: case nir_intrinsic_load_active_subgroup_count_agx: case nir_intrinsic_load_root_agx: @@ -358,6 +359,9 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_load_ray_base_mem_addr_intel: case nir_intrinsic_load_ray_hw_stack_size_intel: case nir_intrinsic_load_per_primitive_remap_intel: + case nir_intrinsic_load_core_count_arm: + case nir_intrinsic_load_core_max_id_arm: + case nir_intrinsic_load_warp_max_id_arm: is_divergent = false; break; diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index dd25e22e8d1..ecd5487bd42 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1648,6 +1648,12 @@ system_value("multisampled_pan", 1, bit_sizes=[32]) # noperspective, this is 32 bits and starts from VARYING_SLOT_VAR0. system_value("noperspective_varyings_pan", 1, bit_sizes=[32]) +# System values for SPV_ARM_core_builtins +system_value("core_count_arm", 1, bit_sizes=[32]) +system_value("core_max_id_arm", 1, bit_sizes=[32]) +system_value("warp_id_arm", 1, bit_sizes=[32]) +system_value("warp_max_id_arm", 1, bit_sizes=[32]) + # R600 specific instrincs # # location where the tesselation data is stored in LDS diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c index ce916413ce3..a128b699fcc 100644 --- a/src/compiler/shader_enums.c +++ b/src/compiler/shader_enums.c @@ -401,6 +401,11 @@ gl_system_value_name(gl_system_value sysval) ENUM(SYSTEM_VALUE_SM_COUNT_NV), ENUM(SYSTEM_VALUE_WARP_ID_NV), ENUM(SYSTEM_VALUE_SM_ID_NV), + ENUM(SYSTEM_VALUE_CORE_ID), + ENUM(SYSTEM_VALUE_CORE_COUNT_ARM), + ENUM(SYSTEM_VALUE_CORE_MAX_ID_ARM), + ENUM(SYSTEM_VALUE_WARP_ID_ARM), + ENUM(SYSTEM_VALUE_WARP_MAX_ID_ARM), }; STATIC_ASSERT(ARRAY_SIZE(names) == SYSTEM_VALUE_MAX); return NAME(sysval); diff --git a/src/compiler/shader_enums.h b/src/compiler/shader_enums.h index 323236fb26d..07f4a1f073b 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -932,6 +932,13 @@ typedef enum SYSTEM_VALUE_WARP_ID_NV, SYSTEM_VALUE_SM_ID_NV, + /* SPV_ARM_core_builtins */ + SYSTEM_VALUE_CORE_ID, + SYSTEM_VALUE_CORE_COUNT_ARM, + SYSTEM_VALUE_CORE_MAX_ID_ARM, + SYSTEM_VALUE_WARP_ID_ARM, + SYSTEM_VALUE_WARP_MAX_ID_ARM, + SYSTEM_VALUE_MAX /**< Number of values */ } gl_system_value; diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 649cf5c7705..284a057831c 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -69,6 +69,7 @@ static const struct spirv_capabilities implemented_capabilities = { .ComputeDerivativeGroupQuadsKHR = true, .CooperativeMatrixKHR = true, .CooperativeMatrixConversionsNV = true, + .CoreBuiltinsARM = true, .CullDistance = true, .DemoteToHelperInvocation = true, .DenormFlushToZero = true, diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index 8c072ff9fe8..e3117955fa2 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1316,6 +1316,27 @@ vtn_get_builtin_location(struct vtn_builder *b, set_mode_system_value(b, mode); break; + case SpvBuiltInCoreIDARM: + *location = SYSTEM_VALUE_CORE_ID, + set_mode_system_value(b, mode); + break; + case SpvBuiltInCoreCountARM: + *location = SYSTEM_VALUE_CORE_COUNT_ARM, + set_mode_system_value(b, mode); + break; + case SpvBuiltInCoreMaxIDARM: + *location = SYSTEM_VALUE_CORE_MAX_ID_ARM, + set_mode_system_value(b, mode); + break; + case SpvBuiltInWarpIDARM: + *location = SYSTEM_VALUE_WARP_ID_ARM, + set_mode_system_value(b, mode); + break; + case SpvBuiltInWarpMaxIDARM: + *location = SYSTEM_VALUE_WARP_MAX_ID_ARM, + set_mode_system_value(b, mode); + break; + default: vtn_fail("Unsupported builtin: %s (%u)", spirv_builtin_to_string(builtin), builtin);