From 82fe981e359e7d6fa8448dd8572e52e85ede1a38 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Thu, 18 Jan 2024 12:20:54 -0600 Subject: [PATCH] nir,spirv: Add support for SPV_NV_shader_sm_builtins Reviewed-by: Karol Herbst Part-of: --- src/compiler/nir/nir.c | 16 ++++++++++++++++ src/compiler/nir/nir_intrinsics.py | 6 ++++++ src/compiler/shader_enums.c | 4 ++++ src/compiler/shader_enums.h | 6 ++++++ src/compiler/shader_info.h | 1 + src/compiler/spirv/spirv_to_nir.c | 4 ++++ src/compiler/spirv/vtn_variables.c | 20 ++++++++++++++++++++ 7 files changed, 57 insertions(+) diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 70d5a8a2279..93bba8f80b0 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -2307,6 +2307,14 @@ nir_intrinsic_from_system_value(gl_system_value val) return nir_intrinsic_load_shader_index; case SYSTEM_VALUE_COALESCED_INPUT_COUNT: return nir_intrinsic_load_coalesced_input_count; + case SYSTEM_VALUE_WARPS_PER_SM_NV: + return nir_intrinsic_load_warps_per_sm_nv; + case SYSTEM_VALUE_SM_COUNT_NV: + return nir_intrinsic_load_sm_count_nv; + case SYSTEM_VALUE_WARP_ID_NV: + return nir_intrinsic_load_warp_id_nv; + case SYSTEM_VALUE_SM_ID_NV: + return nir_intrinsic_load_sm_id_nv; default: unreachable("system value does not directly correspond to intrinsic"); } @@ -2469,6 +2477,14 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin) return SYSTEM_VALUE_SHADER_INDEX; case nir_intrinsic_load_coalesced_input_count: return SYSTEM_VALUE_COALESCED_INPUT_COUNT; + case nir_intrinsic_load_warps_per_sm_nv: + return SYSTEM_VALUE_WARPS_PER_SM_NV; + case nir_intrinsic_load_sm_count_nv: + return SYSTEM_VALUE_SM_COUNT_NV; + case nir_intrinsic_load_warp_id_nv: + return SYSTEM_VALUE_WARP_ID_NV; + case nir_intrinsic_load_sm_id_nv: + return SYSTEM_VALUE_SM_ID_NV; default: unreachable("intrinsic doesn't produce a system value"); } diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 60a7fa3732b..99cc58c4dae 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -2066,6 +2066,12 @@ intrinsic("bar_break_nv", dest_comp=1, bit_sizes=[32], src_comp=[1]) # src[] = { bar, bar_set } intrinsic("bar_sync_nv", src_comp=[1, 1]) +# NVIDIA-specific system values +system_value("warps_per_sm_nv", 1, bit_sizes=[32]) +system_value("sm_count_nv", 1, bit_sizes=[32]) +system_value("warp_id_nv", 1, bit_sizes=[32]) +system_value("sm_id_nv", 1, bit_sizes=[32]) + # In order to deal with flipped render targets, gl_PointCoord may be flipped # in the shader requiring a shader key or extra instructions or it may be # flipped in hardware based on a state bit. This version of gl_PointCoord diff --git a/src/compiler/shader_enums.c b/src/compiler/shader_enums.c index 712f3b1cc26..c1c1b6a3580 100644 --- a/src/compiler/shader_enums.c +++ b/src/compiler/shader_enums.c @@ -393,6 +393,10 @@ gl_system_value_name(gl_system_value sysval) ENUM(SYSTEM_VALUE_FRAG_INVOCATION_COUNT), ENUM(SYSTEM_VALUE_SHADER_INDEX), ENUM(SYSTEM_VALUE_COALESCED_INPUT_COUNT), + ENUM(SYSTEM_VALUE_WARPS_PER_SM_NV), + ENUM(SYSTEM_VALUE_SM_COUNT_NV), + ENUM(SYSTEM_VALUE_WARP_ID_NV), + ENUM(SYSTEM_VALUE_SM_ID_NV), }; 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 62a0bb207c0..32b346de651 100644 --- a/src/compiler/shader_enums.h +++ b/src/compiler/shader_enums.h @@ -927,6 +927,12 @@ typedef enum SYSTEM_VALUE_SHADER_INDEX, SYSTEM_VALUE_COALESCED_INPUT_COUNT, + /* SPV_NV_shader_sm_builtins */ + SYSTEM_VALUE_WARPS_PER_SM_NV, + SYSTEM_VALUE_SM_COUNT_NV, + SYSTEM_VALUE_WARP_ID_NV, + SYSTEM_VALUE_SM_ID_NV, + SYSTEM_VALUE_MAX /**< Number of values */ } gl_system_value; diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index a2bb006ea8f..bb3f1f0334c 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -103,6 +103,7 @@ struct spirv_supported_capabilities { bool runtime_descriptor_array; bool shader_clock; bool shader_enqueue; + bool shader_sm_builtins_nv; bool shader_viewport_index_layer; bool shader_viewport_mask_nv; bool sparse_residency; diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index cedd1d7dff7..dd7cda6eb7b 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -4922,6 +4922,10 @@ vtn_handle_preamble_instruction(struct vtn_builder *b, SpvOp opcode, spv_check_supported(fragment_shader_pixel_interlock, cap); break; + case SpvCapabilityShaderSMBuiltinsNV: + spv_check_supported(shader_sm_builtins_nv, cap); + break; + case SpvCapabilityDemoteToHelperInvocation: spv_check_supported(demote_to_helper_invocation, cap); b->uses_demote_to_helper_invocation = true; diff --git a/src/compiler/spirv/vtn_variables.c b/src/compiler/spirv/vtn_variables.c index ce4b19134ab..e1a956843ec 100644 --- a/src/compiler/spirv/vtn_variables.c +++ b/src/compiler/spirv/vtn_variables.c @@ -1269,6 +1269,26 @@ vtn_get_builtin_location(struct vtn_builder *b, set_mode_system_value(b, mode); break; + case SpvBuiltInWarpsPerSMNV: + *location = SYSTEM_VALUE_WARPS_PER_SM_NV; + set_mode_system_value(b, mode); + break; + + case SpvBuiltInSMCountNV: + *location = SYSTEM_VALUE_SM_COUNT_NV; + set_mode_system_value(b, mode); + break; + + case SpvBuiltInWarpIDNV: + *location = SYSTEM_VALUE_WARP_ID_NV; + set_mode_system_value(b, mode); + break; + + case SpvBuiltInSMIDNV: + *location = SYSTEM_VALUE_SM_ID_NV; + set_mode_system_value(b, mode); + break; + default: vtn_fail("Unsupported builtin: %s (%u)", spirv_builtin_to_string(builtin), builtin);