pvr: Enable 33.15.11.3 (AXE-1-16M).

This commit adds 33.15.11.3 in the supported BVNCs and addresses
differences in the descriptor limits between devices so that the
physical device limit is accurate.

Signed-off-by: Karmjit Mahil <Karmjit.Mahil@imgtec.com>
Reviewed-by: Rajnesh Kanwal <rajnesh.kanwal@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17106>
This commit is contained in:
Karmjit Mahil 2022-05-11 13:39:21 +01:00 committed by Marge Bot
parent 62cc9bba06
commit c6933cc9de
4 changed files with 121 additions and 106 deletions

View File

@ -287,6 +287,7 @@ int pvr_device_info_init(struct pvr_device_info *info, uint64_t bvnc)
switch (bvnc) {
CASE_PACKED_BVNC_DEVICE_INFO(4, 40, 2, 51);
CASE_PACKED_BVNC_DEVICE_INFO(33, 15, 11, 3);
}
#undef CASE_PACKED_BVNC_DEVICE_INFO

View File

@ -3611,77 +3611,6 @@ pvr_setup_triangle_merging_flag(struct pvr_cmd_buffer *const cmd_buffer,
}
}
/* TODO: See if this function can be improved once fully implemented. */
static uint32_t pvr_calc_fscommon_size_and_tiles_in_flight(
const struct pvr_device_info *dev_info,
uint32_t fs_common_size,
uint32_t min_tiles_in_flight)
{
uint32_t max_tiles_in_flight;
uint32_t num_allocs;
if (PVR_HAS_FEATURE(dev_info, s8xe)) {
num_allocs = PVR_GET_FEATURE_VALUE(dev_info, num_raster_pipes, 0U);
} else {
uint32_t num_phantoms = rogue_get_num_phantoms(dev_info);
uint32_t min_cluster_per_phantom = 0;
if (num_phantoms > 1) {
pvr_finishme("Unimplemented path!!");
} else {
min_cluster_per_phantom =
PVR_GET_FEATURE_VALUE(dev_info, num_clusters, 1U);
}
if (num_phantoms > 1)
pvr_finishme("Unimplemented path!!");
if (num_phantoms > 2)
pvr_finishme("Unimplemented path!!");
if (num_phantoms > 3)
pvr_finishme("Unimplemented path!!");
if (min_cluster_per_phantom >= 4)
num_allocs = 1;
else if (min_cluster_per_phantom == 2)
num_allocs = 2;
else
num_allocs = 4;
}
max_tiles_in_flight =
PVR_GET_FEATURE_VALUE(dev_info, isp_max_tiles_in_flight, 1U);
if (fs_common_size == UINT_MAX) {
uint32_t max_common_size;
num_allocs *= MIN2(min_tiles_in_flight, max_tiles_in_flight);
if (!PVR_HAS_ERN(dev_info, 38748)) {
/* Hardware needs space for one extra shared allocation. */
num_allocs += 1;
}
max_common_size = rogue_get_reserved_shared_size(dev_info) -
rogue_get_max_coeffs(dev_info);
/* Double resource requirements to deal with fragmentation. */
max_common_size /= num_allocs * 2;
max_common_size =
ROUND_DOWN_TO(max_common_size,
PVRX(TA_STATE_PDS_SIZEINFO2_USC_SHAREDSIZE_UNIT_SIZE));
return max_common_size;
} else if (fs_common_size == 0) {
return max_tiles_in_flight;
}
pvr_finishme("Unimplemented path!!");
return 0;
}
static void
pvr_setup_fragment_state_pointers(struct pvr_cmd_buffer *const cmd_buffer)
{

View File

@ -658,39 +658,129 @@ void pvr_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
}
}
/* clang-format off */
/* FIXME: Clang-format places multiple initializers on the same line, fix this
* and remove clang-format on/off comments.
*/
static const struct pvr_descriptor_limits bvnc_4_V_2_51_descriptor_limits = {
.max_per_stage_resources = 456U,
.max_per_stage_samplers = 64U,
.max_per_stage_uniform_buffers = 96U,
.max_per_stage_storage_buffers = 96U,
.max_per_stage_sampled_images = 128U,
.max_per_stage_storage_images = 64U,
.max_per_stage_input_attachments = 8U,
/* TODO: See if this function can be improved once fully implemented. */
uint32_t pvr_calc_fscommon_size_and_tiles_in_flight(
const struct pvr_device_info *dev_info,
uint32_t fs_common_size,
uint32_t min_tiles_in_flight)
{
uint32_t max_tiles_in_flight;
uint32_t num_allocs;
if (PVR_HAS_FEATURE(dev_info, s8xe)) {
num_allocs = PVR_GET_FEATURE_VALUE(dev_info, num_raster_pipes, 0U);
} else {
uint32_t num_phantoms = rogue_get_num_phantoms(dev_info);
uint32_t min_cluster_per_phantom = 0;
if (num_phantoms > 1) {
pvr_finishme("Unimplemented path!!");
} else {
min_cluster_per_phantom =
PVR_GET_FEATURE_VALUE(dev_info, num_clusters, 1U);
}
if (num_phantoms > 1)
pvr_finishme("Unimplemented path!!");
if (num_phantoms > 2)
pvr_finishme("Unimplemented path!!");
if (num_phantoms > 3)
pvr_finishme("Unimplemented path!!");
if (min_cluster_per_phantom >= 4)
num_allocs = 1;
else if (min_cluster_per_phantom == 2)
num_allocs = 2;
else
num_allocs = 4;
}
max_tiles_in_flight =
PVR_GET_FEATURE_VALUE(dev_info, isp_max_tiles_in_flight, 1U);
if (fs_common_size == UINT_MAX) {
uint32_t max_common_size;
num_allocs *= MIN2(min_tiles_in_flight, max_tiles_in_flight);
if (!PVR_HAS_ERN(dev_info, 38748)) {
/* Hardware needs space for one extra shared allocation. */
num_allocs += 1;
}
max_common_size = rogue_get_reserved_shared_size(dev_info) -
rogue_get_max_coeffs(dev_info);
/* Double resource requirements to deal with fragmentation. */
max_common_size /= num_allocs * 2;
max_common_size =
ROUND_DOWN_TO(max_common_size,
PVRX(TA_STATE_PDS_SIZEINFO2_USC_SHAREDSIZE_UNIT_SIZE));
return max_common_size;
} else if (fs_common_size == 0) {
return max_tiles_in_flight;
}
pvr_finishme("Unimplemented path!!");
return 0;
}
struct pvr_descriptor_limits {
uint32_t max_per_stage_resources;
uint32_t max_per_stage_samplers;
uint32_t max_per_stage_uniform_buffers;
uint32_t max_per_stage_storage_buffers;
uint32_t max_per_stage_sampled_images;
uint32_t max_per_stage_storage_images;
uint32_t max_per_stage_input_attachments;
};
/* clang-format on */
static const struct pvr_descriptor_limits *
pvr_get_physical_device_descriptor_limits(struct pvr_physical_device *pdevice)
{
/* Series 6XT - GX6x50 - Clyde */
if (pdevice->dev_info.ident.b == 4 && pdevice->dev_info.ident.n == 2)
return &bvnc_4_V_2_51_descriptor_limits;
enum pvr_descriptor_cs_level {
/* clang-format off */
CS4096, /* 6XT and some XE cores with large CS. */
CS2560, /* Mid range Rogue XE cores. */
CS2048, /* Low end Rogue XE cores. */
CS1536, /* Ultra-low-end 9XEP. */
CS680, /* lower limits for older devices. */
CS408, /* 7XE. */
/* clang-format on */
};
vk_errorf(pdevice,
VK_ERROR_INCOMPATIBLE_DRIVER,
"No device ID found for BVNC %d.%d.%d.%d",
pdevice->dev_info.ident.b,
pdevice->dev_info.ident.v,
pdevice->dev_info.ident.n,
pdevice->dev_info.ident.c);
static const struct pvr_descriptor_limits descriptor_limits[] = {
[CS4096] = { 1160U, 256U, 192U, 144U, 256U, 256U, 8U, },
[CS2560] = { 648U, 128U, 128U, 128U, 128U, 128U, 8U, },
[CS2048] = { 584U, 128U, 96U, 64U, 128U, 128U, 8U, },
[CS1536] = { 456U, 64U, 96U, 64U, 128U, 64U, 8U, },
[CS680] = { 224U, 32U, 64U, 36U, 48U, 8U, 8U, },
[CS408] = { 128U, 16U, 40U, 28U, 16U, 8U, 8U, },
};
assert(false);
const uint32_t common_size =
pvr_calc_fscommon_size_and_tiles_in_flight(&pdevice->dev_info, -1, 1);
enum pvr_descriptor_cs_level cs_level;
return NULL;
if (common_size >= 2048) {
cs_level = CS2048;
} else if (common_size >= 1526) {
cs_level = CS1536;
} else if (common_size >= 680) {
cs_level = CS680;
} else if (common_size >= 408) {
cs_level = CS408;
} else {
mesa_loge("This core appears to have a very limited amount of shared "
"register space and may not meet the Vulkan spec limits.");
abort();
}
return &descriptor_limits[cs_level];
}
void pvr_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,

View File

@ -181,16 +181,6 @@ struct pvr_instance;
struct pvr_render_ctx;
struct rogue_compiler;
struct pvr_descriptor_limits {
uint32_t max_per_stage_resources;
uint32_t max_per_stage_samplers;
uint32_t max_per_stage_uniform_buffers;
uint32_t max_per_stage_storage_buffers;
uint32_t max_per_stage_sampled_images;
uint32_t max_per_stage_storage_images;
uint32_t max_per_stage_input_attachments;
};
struct pvr_physical_device {
struct vk_physical_device vk;
@ -1255,6 +1245,11 @@ struct pvr_load_op {
uint32_t temps_count;
};
uint32_t pvr_calc_fscommon_size_and_tiles_in_flight(
const struct pvr_device_info *dev_info,
uint32_t fs_common_size,
uint32_t min_tiles_in_flight);
VkResult pvr_wsi_init(struct pvr_physical_device *pdevice);
void pvr_wsi_finish(struct pvr_physical_device *pdevice);