From 849a331a7dc8f2ca43ac10832b0256d760517575 Mon Sep 17 00:00:00 2001 From: Ashish Chauhan Date: Wed, 11 Sep 2024 12:06:30 +0100 Subject: [PATCH] pvr: Feature support TPU_PARALLEL_INSTANCES Signed-off-by: Ashish Chauhan Acked-by: Erik Faye-Lund Part-of: --- src/imagination/common/device_info/axe-1-16m.h | 2 ++ src/imagination/common/device_info/bxs-4-64.h | 2 ++ src/imagination/common/device_info/gx6250.h | 2 ++ src/imagination/common/pvr_device_info.h | 2 ++ src/imagination/include/hwdef/rogue_hw_utils.h | 17 ++++++++++++++--- src/imagination/vulkan/pvr_device.c | 9 +-------- 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/imagination/common/device_info/axe-1-16m.h b/src/imagination/common/device_info/axe-1-16m.h index fd543d10dfb..ddc09e5fd76 100644 --- a/src/imagination/common/device_info/axe-1-16m.h +++ b/src/imagination/common/device_info/axe-1-16m.h @@ -59,6 +59,7 @@ static const struct pvr_device_features pvr_device_features_33_V_11_3 = { .has_tpu_border_colour_enhanced = true, .has_tpu_extended_integer_lookup = true, .has_tpu_image_state_v2 = true, + .has_tpu_parallel_instances = true, .has_unified_store_depth = true, .has_usc_f16sop_u8 = true, .has_usc_min_output_registers_per_pix = true, @@ -83,6 +84,7 @@ static const struct pvr_device_features pvr_device_features_33_V_11_3 = { .slc_cache_line_size_bits = 512U, .tile_size_x = 16U, .tile_size_y = 16U, + .tpu_parallel_instances = 1U, .unified_store_depth = 64U, .usc_min_output_registers_per_pix = 1U, .usc_slots = 14U, diff --git a/src/imagination/common/device_info/bxs-4-64.h b/src/imagination/common/device_info/bxs-4-64.h index 1ec45fcc5f6..fb1267dc933 100644 --- a/src/imagination/common/device_info/bxs-4-64.h +++ b/src/imagination/common/device_info/bxs-4-64.h @@ -66,6 +66,7 @@ static const struct pvr_device_features pvr_device_features_36_V_104_796 = { .has_tpu_dm_global_registers = true, .has_tpu_extended_integer_lookup = true, .has_tpu_image_state_v2 = true, + .has_tpu_parallel_instances = true, .has_unified_store_depth = true, .has_usc_f16sop_u8 = true, .has_usc_itrsmp = true, @@ -94,6 +95,7 @@ static const struct pvr_device_features pvr_device_features_36_V_104_796 = { .slc_cache_line_size_bits = 512U, .tile_size_x = 16U, .tile_size_y = 16U, + .tpu_parallel_instances = 4U, .unified_store_depth = 256U, .usc_min_output_registers_per_pix = 2U, .usc_slots = 64U, diff --git a/src/imagination/common/device_info/gx6250.h b/src/imagination/common/device_info/gx6250.h index 099afa15c61..c1de8b88819 100644 --- a/src/imagination/common/device_info/gx6250.h +++ b/src/imagination/common/device_info/gx6250.h @@ -59,6 +59,7 @@ static const struct pvr_device_features pvr_device_features_4_V_2_51 = { .has_tpu_array_textures = true, .has_tpu_extended_integer_lookup = true, .has_tpu_image_state_v2 = true, + .has_tpu_parallel_instances = true, .has_unified_store_depth = true, .has_usc_f16sop_u8 = true, .has_usc_itrsmp = true, @@ -84,6 +85,7 @@ static const struct pvr_device_features pvr_device_features_4_V_2_51 = { .slc_cache_line_size_bits = 512U, .tile_size_x = 32U, .tile_size_y = 32U, + .tpu_parallel_instances = 4U, .unified_store_depth = 256U, .usc_min_output_registers_per_pix = 2U, .usc_slots = 32U, diff --git a/src/imagination/common/pvr_device_info.h b/src/imagination/common/pvr_device_info.h index 432d60b43c8..60e18166faa 100644 --- a/src/imagination/common/pvr_device_info.h +++ b/src/imagination/common/pvr_device_info.h @@ -291,6 +291,7 @@ struct pvr_device_features { bool has_tpu_dm_global_registers : 1; bool has_tpu_extended_integer_lookup : 1; bool has_tpu_image_state_v2 : 1; + bool has_tpu_parallel_instances : 1; bool has_unified_store_depth : 1; bool has_usc_f16sop_u8 : 1; bool has_usc_itrsmp : 1; @@ -321,6 +322,7 @@ struct pvr_device_features { uint32_t slc_cache_line_size_bits; uint32_t tile_size_x; uint32_t tile_size_y; + uint32_t tpu_parallel_instances; uint32_t unified_store_depth; uint32_t usc_min_output_registers_per_pix; uint32_t usc_slots; diff --git a/src/imagination/include/hwdef/rogue_hw_utils.h b/src/imagination/include/hwdef/rogue_hw_utils.h index cbe281d93de..02e8999fae7 100644 --- a/src/imagination/include/hwdef/rogue_hw_utils.h +++ b/src/imagination/include/hwdef/rogue_hw_utils.h @@ -267,12 +267,23 @@ rogue_get_slc_cache_line_size(const struct pvr_device_info *dev_info) static inline uint32_t pvr_get_max_user_vertex_output_components( const struct pvr_device_info *dev_info) { + /* Default value based on the minimum value found in all existing cores. */ const uint32_t uvs_pba_entries = - PVR_GET_FEATURE_VALUE(dev_info, uvs_pba_entries, 0U); - const uint32_t uvs_banks = PVR_GET_FEATURE_VALUE(dev_info, uvs_banks, 0U); + PVR_GET_FEATURE_VALUE(dev_info, uvs_pba_entries, 160U); + + /* Default value based on the minimum value found in all existing cores. */ + const uint32_t uvs_banks = PVR_GET_FEATURE_VALUE(dev_info, uvs_banks, 2U); + + if (uvs_banks <= 8U && uvs_pba_entries == 160U) { + ASSERTED const uint32_t tpu_parallel_instances = + PVR_GET_FEATURE_VALUE(dev_info, tpu_parallel_instances, 1U); + + /* Cores with > 2 ppc support vertex sizes of >= 128 dwords */ + assert(tpu_parallel_instances <= 2 || + (dev_info->ident.b <= 36 || dev_info->ident.b == 46)); - if (uvs_banks <= 8U && uvs_pba_entries == 160U) return 64U; + } return 128U; } diff --git a/src/imagination/vulkan/pvr_device.c b/src/imagination/vulkan/pvr_device.c index 84be6c0d1c5..8325451efe9 100644 --- a/src/imagination/vulkan/pvr_device.c +++ b/src/imagination/vulkan/pvr_device.c @@ -308,13 +308,6 @@ static bool pvr_physical_device_get_properties( const uint32_t max_multisample = PVR_GET_FEATURE_VALUE(dev_info, max_multisample, 4); - /* Default value based on the minimum value found in all existing cores. */ - const uint32_t uvs_banks = PVR_GET_FEATURE_VALUE(dev_info, uvs_banks, 2); - - /* Default value based on the minimum value found in all existing cores. */ - const uint32_t uvs_pba_entries = - PVR_GET_FEATURE_VALUE(dev_info, uvs_pba_entries, 160); - UNUSED const uint32_t sub_pixel_precision = PVR_HAS_FEATURE(dev_info, simple_internal_parameter_format) ? 4U : 8U; @@ -323,7 +316,7 @@ static bool pvr_physical_device_get_properties( UNUSED const uint32_t max_sample_bits = ((max_multisample << 1) - 1); UNUSED const uint32_t max_user_vertex_components = - ((uvs_banks <= 8U) && (uvs_pba_entries == 160U)) ? 64U : 128U; + pvr_get_max_user_vertex_output_components(dev_info); /* The workgroup invocations are limited by the case where we have a compute * barrier - each slot has a fixed number of invocations, the whole workgroup