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:
@@ -287,6 +287,7 @@ int pvr_device_info_init(struct pvr_device_info *info, uint64_t bvnc)
|
|||||||
|
|
||||||
switch (bvnc) {
|
switch (bvnc) {
|
||||||
CASE_PACKED_BVNC_DEVICE_INFO(4, 40, 2, 51);
|
CASE_PACKED_BVNC_DEVICE_INFO(4, 40, 2, 51);
|
||||||
|
CASE_PACKED_BVNC_DEVICE_INFO(33, 15, 11, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef CASE_PACKED_BVNC_DEVICE_INFO
|
#undef CASE_PACKED_BVNC_DEVICE_INFO
|
||||||
|
@@ -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
|
static void
|
||||||
pvr_setup_fragment_state_pointers(struct pvr_cmd_buffer *const cmd_buffer)
|
pvr_setup_fragment_state_pointers(struct pvr_cmd_buffer *const cmd_buffer)
|
||||||
{
|
{
|
||||||
|
@@ -658,39 +658,129 @@ void pvr_GetPhysicalDeviceFeatures2(VkPhysicalDevice physicalDevice,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* clang-format off */
|
/* TODO: See if this function can be improved once fully implemented. */
|
||||||
/* FIXME: Clang-format places multiple initializers on the same line, fix this
|
uint32_t pvr_calc_fscommon_size_and_tiles_in_flight(
|
||||||
* and remove clang-format on/off comments.
|
const struct pvr_device_info *dev_info,
|
||||||
*/
|
uint32_t fs_common_size,
|
||||||
static const struct pvr_descriptor_limits bvnc_4_V_2_51_descriptor_limits = {
|
uint32_t min_tiles_in_flight)
|
||||||
.max_per_stage_resources = 456U,
|
{
|
||||||
.max_per_stage_samplers = 64U,
|
uint32_t max_tiles_in_flight;
|
||||||
.max_per_stage_uniform_buffers = 96U,
|
uint32_t num_allocs;
|
||||||
.max_per_stage_storage_buffers = 96U,
|
|
||||||
.max_per_stage_sampled_images = 128U,
|
if (PVR_HAS_FEATURE(dev_info, s8xe)) {
|
||||||
.max_per_stage_storage_images = 64U,
|
num_allocs = PVR_GET_FEATURE_VALUE(dev_info, num_raster_pipes, 0U);
|
||||||
.max_per_stage_input_attachments = 8U,
|
} 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 *
|
static const struct pvr_descriptor_limits *
|
||||||
pvr_get_physical_device_descriptor_limits(struct pvr_physical_device *pdevice)
|
pvr_get_physical_device_descriptor_limits(struct pvr_physical_device *pdevice)
|
||||||
{
|
{
|
||||||
/* Series 6XT - GX6x50 - Clyde */
|
enum pvr_descriptor_cs_level {
|
||||||
if (pdevice->dev_info.ident.b == 4 && pdevice->dev_info.ident.n == 2)
|
/* clang-format off */
|
||||||
return &bvnc_4_V_2_51_descriptor_limits;
|
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,
|
static const struct pvr_descriptor_limits descriptor_limits[] = {
|
||||||
VK_ERROR_INCOMPATIBLE_DRIVER,
|
[CS4096] = { 1160U, 256U, 192U, 144U, 256U, 256U, 8U, },
|
||||||
"No device ID found for BVNC %d.%d.%d.%d",
|
[CS2560] = { 648U, 128U, 128U, 128U, 128U, 128U, 8U, },
|
||||||
pdevice->dev_info.ident.b,
|
[CS2048] = { 584U, 128U, 96U, 64U, 128U, 128U, 8U, },
|
||||||
pdevice->dev_info.ident.v,
|
[CS1536] = { 456U, 64U, 96U, 64U, 128U, 64U, 8U, },
|
||||||
pdevice->dev_info.ident.n,
|
[CS680] = { 224U, 32U, 64U, 36U, 48U, 8U, 8U, },
|
||||||
pdevice->dev_info.ident.c);
|
[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,
|
void pvr_GetPhysicalDeviceProperties2(VkPhysicalDevice physicalDevice,
|
||||||
|
@@ -181,16 +181,6 @@ struct pvr_instance;
|
|||||||
struct pvr_render_ctx;
|
struct pvr_render_ctx;
|
||||||
struct rogue_compiler;
|
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 pvr_physical_device {
|
||||||
struct vk_physical_device vk;
|
struct vk_physical_device vk;
|
||||||
|
|
||||||
@@ -1255,6 +1245,11 @@ struct pvr_load_op {
|
|||||||
uint32_t temps_count;
|
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);
|
VkResult pvr_wsi_init(struct pvr_physical_device *pdevice);
|
||||||
void pvr_wsi_finish(struct pvr_physical_device *pdevice);
|
void pvr_wsi_finish(struct pvr_physical_device *pdevice);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user